* [PATCH 1/2] tracing/filter: remove preds from struct event_subsystem
@ 2009-07-09 8:20 Xiao Guangrong
2009-07-09 8:22 ` [PATCH 2/2] tracing/filter: remove empty subsystem and it's directory Xiao Guangrong
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Xiao Guangrong @ 2009-07-09 8:20 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Frederic Weisbecker, Steven Rostedt, Tom Zanussi, LKML
No need to save preds to event_subsystem, because it's not used.
Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
---
kernel/trace/trace_events_filter.c | 39 +++++------------------------------
1 files changed, 6 insertions(+), 33 deletions(-)
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 936c621..b9aae72 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -420,17 +420,7 @@ EXPORT_SYMBOL_GPL(init_preds);
static void filter_free_subsystem_preds(struct event_subsystem *system)
{
- struct event_filter *filter = system->filter;
struct ftrace_event_call *call;
- int i;
-
- if (filter->n_preds) {
- for (i = 0; i < filter->n_preds; i++)
- filter_free_pred(filter->preds[i]);
- kfree(filter->preds);
- filter->preds = NULL;
- filter->n_preds = 0;
- }
list_for_each_entry(call, &ftrace_events, list) {
if (!call->define_fields)
@@ -607,26 +597,9 @@ static int filter_add_subsystem_pred(struct filter_parse_state *ps,
struct filter_pred *pred,
char *filter_string)
{
- struct event_filter *filter = system->filter;
struct ftrace_event_call *call;
int err = 0;
- if (!filter->preds) {
- filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred),
- GFP_KERNEL);
-
- if (!filter->preds)
- return -ENOMEM;
- }
-
- if (filter->n_preds == MAX_FILTER_PRED) {
- parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
- return -ENOSPC;
- }
-
- filter->preds[filter->n_preds] = pred;
- filter->n_preds++;
-
list_for_each_entry(call, &ftrace_events, list) {
if (!call->define_fields)
@@ -1029,12 +1002,12 @@ static int replace_preds(struct event_subsystem *system,
if (elt->op == OP_AND || elt->op == OP_OR) {
pred = create_logical_pred(elt->op);
- if (call) {
+ if (call)
err = filter_add_pred(ps, call, pred);
- filter_free_pred(pred);
- } else
+ else
err = filter_add_subsystem_pred(ps, system,
pred, filter_string);
+ filter_free_pred(pred);
if (err)
return err;
@@ -1048,12 +1021,12 @@ static int replace_preds(struct event_subsystem *system,
}
pred = create_pred(elt->op, operand1, operand2);
- if (call) {
+ if (call)
err = filter_add_pred(ps, call, pred);
- filter_free_pred(pred);
- } else
+ else
err = filter_add_subsystem_pred(ps, system, pred,
filter_string);
+ filter_free_pred(pred);
if (err)
return err;
--
1.6.1.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/2] tracing/filter: remove empty subsystem and it's directory
2009-07-09 8:20 [PATCH 1/2] tracing/filter: remove preds from struct event_subsystem Xiao Guangrong
@ 2009-07-09 8:22 ` Xiao Guangrong
2009-07-10 4:06 ` Tom Zanussi
2009-07-10 10:41 ` [tip:tracing/core] tracing/filter: Remove empty subsystem and its directory tip-bot for Xiao Guangrong
2009-07-10 4:04 ` [PATCH 1/2] tracing/filter: remove preds from struct event_subsystem Tom Zanussi
` (2 subsequent siblings)
3 siblings, 2 replies; 9+ messages in thread
From: Xiao Guangrong @ 2009-07-09 8:22 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Frederic Weisbecker, Steven Rostedt, Tom Zanussi, LKML
Remove empty subsystem and it's directory when module unload.
Before patch:
# rmmod trace-events-sample.ko
# ls sample
enable filter
After patch:
# rmmod trace-events-sample.ko
# ls sample
ls: cannot access sample: No such file or directory
Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
---
kernel/trace/trace.h | 1 +
kernel/trace/trace_events.c | 32 +++++++++++++++++++++++++++++++-
2 files changed, 32 insertions(+), 1 deletions(-)
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 61b4e94..0e7de4b 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -780,6 +780,7 @@ struct event_subsystem {
const char *name;
struct dentry *entry;
void *filter;
+ int nr_events;
};
struct filter_pred;
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index fecac13..90cf936 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -851,8 +851,10 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
/* First see if we did not already create this dir */
list_for_each_entry(system, &event_subsystems, list) {
- if (strcmp(system->name, name) == 0)
+ if (strcmp(system->name, name) == 0) {
+ system->nr_events++;
return system->entry;
+ }
}
/* need to create new entry */
@@ -871,6 +873,7 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
return d_events;
}
+ system->nr_events = 1;
system->name = kstrdup(name, GFP_KERNEL);
if (!system->name) {
debugfs_remove(system->entry);
@@ -905,6 +908,32 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
return system->entry;
}
+static void remove_subsystem_dir(const char *name)
+{
+ struct event_subsystem *system;
+
+ if (strcmp(name, TRACE_SYSTEM) == 0)
+ return;
+
+ list_for_each_entry(system, &event_subsystems, list) {
+ if (strcmp(system->name, name) == 0) {
+ if (!--system->nr_events) {
+ struct event_filter *filter = system->filter;
+
+ debugfs_remove_recursive(system->entry);
+ list_del(&system->list);
+ if (filter) {
+ kfree(filter->filter_string);
+ kfree(filter);
+ }
+ kfree(system->name);
+ kfree(system);
+ }
+ break;
+ }
+ }
+}
+
static int
event_create_dir(struct ftrace_event_call *call, struct dentry *d_events,
const struct file_operations *id,
@@ -1079,6 +1108,7 @@ static void trace_module_remove_events(struct module *mod)
list_del(&call->list);
trace_destroy_fields(call);
destroy_preds(call);
+ remove_subsystem_dir(call->system);
}
}
--
1.6.1.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] tracing/filter: remove preds from struct event_subsystem
2009-07-09 8:20 [PATCH 1/2] tracing/filter: remove preds from struct event_subsystem Xiao Guangrong
2009-07-09 8:22 ` [PATCH 2/2] tracing/filter: remove empty subsystem and it's directory Xiao Guangrong
@ 2009-07-10 4:04 ` Tom Zanussi
2009-07-10 5:23 ` Li Zefan
2009-07-10 10:41 ` [tip:tracing/core] tracing/filter: Remove " tip-bot for Xiao Guangrong
3 siblings, 0 replies; 9+ messages in thread
From: Tom Zanussi @ 2009-07-10 4:04 UTC (permalink / raw)
To: Xiao Guangrong; +Cc: Ingo Molnar, Frederic Weisbecker, Steven Rostedt, LKML
On Thu, 2009-07-09 at 16:20 +0800, Xiao Guangrong wrote:
> No need to save preds to event_subsystem, because it's not used.
>
> Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Makes sense to me.
Acked-by: Tom Zanussi <tzanussi@gmail.com>
> ---
> kernel/trace/trace_events_filter.c | 39 +++++------------------------------
> 1 files changed, 6 insertions(+), 33 deletions(-)
>
> diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
> index 936c621..b9aae72 100644
> --- a/kernel/trace/trace_events_filter.c
> +++ b/kernel/trace/trace_events_filter.c
> @@ -420,17 +420,7 @@ EXPORT_SYMBOL_GPL(init_preds);
>
> static void filter_free_subsystem_preds(struct event_subsystem *system)
> {
> - struct event_filter *filter = system->filter;
> struct ftrace_event_call *call;
> - int i;
> -
> - if (filter->n_preds) {
> - for (i = 0; i < filter->n_preds; i++)
> - filter_free_pred(filter->preds[i]);
> - kfree(filter->preds);
> - filter->preds = NULL;
> - filter->n_preds = 0;
> - }
>
> list_for_each_entry(call, &ftrace_events, list) {
> if (!call->define_fields)
> @@ -607,26 +597,9 @@ static int filter_add_subsystem_pred(struct filter_parse_state *ps,
> struct filter_pred *pred,
> char *filter_string)
> {
> - struct event_filter *filter = system->filter;
> struct ftrace_event_call *call;
> int err = 0;
>
> - if (!filter->preds) {
> - filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred),
> - GFP_KERNEL);
> -
> - if (!filter->preds)
> - return -ENOMEM;
> - }
> -
> - if (filter->n_preds == MAX_FILTER_PRED) {
> - parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
> - return -ENOSPC;
> - }
> -
> - filter->preds[filter->n_preds] = pred;
> - filter->n_preds++;
> -
> list_for_each_entry(call, &ftrace_events, list) {
>
> if (!call->define_fields)
> @@ -1029,12 +1002,12 @@ static int replace_preds(struct event_subsystem *system,
>
> if (elt->op == OP_AND || elt->op == OP_OR) {
> pred = create_logical_pred(elt->op);
> - if (call) {
> + if (call)
> err = filter_add_pred(ps, call, pred);
> - filter_free_pred(pred);
> - } else
> + else
> err = filter_add_subsystem_pred(ps, system,
> pred, filter_string);
> + filter_free_pred(pred);
> if (err)
> return err;
>
> @@ -1048,12 +1021,12 @@ static int replace_preds(struct event_subsystem *system,
> }
>
> pred = create_pred(elt->op, operand1, operand2);
> - if (call) {
> + if (call)
> err = filter_add_pred(ps, call, pred);
> - filter_free_pred(pred);
> - } else
> + else
> err = filter_add_subsystem_pred(ps, system, pred,
> filter_string);
> + filter_free_pred(pred);
> if (err)
> return err;
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] tracing/filter: remove empty subsystem and it's directory
2009-07-09 8:22 ` [PATCH 2/2] tracing/filter: remove empty subsystem and it's directory Xiao Guangrong
@ 2009-07-10 4:06 ` Tom Zanussi
2009-07-10 5:28 ` Li Zefan
2009-07-10 10:41 ` [tip:tracing/core] tracing/filter: Remove empty subsystem and its directory tip-bot for Xiao Guangrong
1 sibling, 1 reply; 9+ messages in thread
From: Tom Zanussi @ 2009-07-10 4:06 UTC (permalink / raw)
To: Xiao Guangrong; +Cc: Ingo Molnar, Frederic Weisbecker, Steven Rostedt, LKML
On Thu, 2009-07-09 at 16:22 +0800, Xiao Guangrong wrote:
> Remove empty subsystem and it's directory when module unload.
>
> Before patch:
> # rmmod trace-events-sample.ko
> # ls sample
> enable filter
>
> After patch:
> # rmmod trace-events-sample.ko
> # ls sample
> ls: cannot access sample: No such file or directory
>
> Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Looks like it does the trick.
Acked-by: Tom Zanussi <tzanussi@gmail.com>
> ---
> kernel/trace/trace.h | 1 +
> kernel/trace/trace_events.c | 32 +++++++++++++++++++++++++++++++-
> 2 files changed, 32 insertions(+), 1 deletions(-)
>
> diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
> index 61b4e94..0e7de4b 100644
> --- a/kernel/trace/trace.h
> +++ b/kernel/trace/trace.h
> @@ -780,6 +780,7 @@ struct event_subsystem {
> const char *name;
> struct dentry *entry;
> void *filter;
> + int nr_events;
> };
>
> struct filter_pred;
> diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
> index fecac13..90cf936 100644
> --- a/kernel/trace/trace_events.c
> +++ b/kernel/trace/trace_events.c
> @@ -851,8 +851,10 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
>
> /* First see if we did not already create this dir */
> list_for_each_entry(system, &event_subsystems, list) {
> - if (strcmp(system->name, name) == 0)
> + if (strcmp(system->name, name) == 0) {
> + system->nr_events++;
> return system->entry;
> + }
> }
>
> /* need to create new entry */
> @@ -871,6 +873,7 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
> return d_events;
> }
>
> + system->nr_events = 1;
> system->name = kstrdup(name, GFP_KERNEL);
> if (!system->name) {
> debugfs_remove(system->entry);
> @@ -905,6 +908,32 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
> return system->entry;
> }
>
> +static void remove_subsystem_dir(const char *name)
> +{
> + struct event_subsystem *system;
> +
> + if (strcmp(name, TRACE_SYSTEM) == 0)
> + return;
> +
> + list_for_each_entry(system, &event_subsystems, list) {
> + if (strcmp(system->name, name) == 0) {
> + if (!--system->nr_events) {
> + struct event_filter *filter = system->filter;
> +
> + debugfs_remove_recursive(system->entry);
> + list_del(&system->list);
> + if (filter) {
> + kfree(filter->filter_string);
> + kfree(filter);
> + }
> + kfree(system->name);
> + kfree(system);
> + }
> + break;
> + }
> + }
> +}
> +
> static int
> event_create_dir(struct ftrace_event_call *call, struct dentry *d_events,
> const struct file_operations *id,
> @@ -1079,6 +1108,7 @@ static void trace_module_remove_events(struct module *mod)
> list_del(&call->list);
> trace_destroy_fields(call);
> destroy_preds(call);
> + remove_subsystem_dir(call->system);
> }
> }
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] tracing/filter: remove preds from struct event_subsystem
2009-07-09 8:20 [PATCH 1/2] tracing/filter: remove preds from struct event_subsystem Xiao Guangrong
2009-07-09 8:22 ` [PATCH 2/2] tracing/filter: remove empty subsystem and it's directory Xiao Guangrong
2009-07-10 4:04 ` [PATCH 1/2] tracing/filter: remove preds from struct event_subsystem Tom Zanussi
@ 2009-07-10 5:23 ` Li Zefan
2009-07-10 10:41 ` [tip:tracing/core] tracing/filter: Remove " tip-bot for Xiao Guangrong
3 siblings, 0 replies; 9+ messages in thread
From: Li Zefan @ 2009-07-10 5:23 UTC (permalink / raw)
To: Xiao Guangrong
Cc: Ingo Molnar, Frederic Weisbecker, Steven Rostedt, Tom Zanussi, LKML
Xiao Guangrong wrote:
> No need to save preds to event_subsystem, because it's not used.
>
> Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Nice cleanup.
Reviewed-by: Li Zefan <lizf@cn.fujitsu.com>
> ---
> kernel/trace/trace_events_filter.c | 39 +++++------------------------------
> 1 files changed, 6 insertions(+), 33 deletions(-)
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] tracing/filter: remove empty subsystem and it's directory
2009-07-10 4:06 ` Tom Zanussi
@ 2009-07-10 5:28 ` Li Zefan
0 siblings, 0 replies; 9+ messages in thread
From: Li Zefan @ 2009-07-10 5:28 UTC (permalink / raw)
To: Tom Zanussi
Cc: Xiao Guangrong, Ingo Molnar, Frederic Weisbecker, Steven Rostedt, LKML
Tom Zanussi wrote:
> On Thu, 2009-07-09 at 16:22 +0800, Xiao Guangrong wrote:
>> Remove empty subsystem and it's directory when module unload.
>>
>> Before patch:
>> # rmmod trace-events-sample.ko
>> # ls sample
>> enable filter
>>
>> After patch:
>> # rmmod trace-events-sample.ko
>> # ls sample
>> ls: cannot access sample: No such file or directory
>>
>> Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
>
> Looks like it does the trick.
>
> Acked-by: Tom Zanussi <tzanussi@gmail.com>
>
It sure does. :)
Reviewed-by: Li Zefan <lizf@cn.fujitsu.com>
>> ---
>> kernel/trace/trace.h | 1 +
>> kernel/trace/trace_events.c | 32 +++++++++++++++++++++++++++++++-
>> 2 files changed, 32 insertions(+), 1 deletions(-)
^ permalink raw reply [flat|nested] 9+ messages in thread
* [tip:tracing/core] tracing/filter: Remove preds from struct event_subsystem
2009-07-09 8:20 [PATCH 1/2] tracing/filter: remove preds from struct event_subsystem Xiao Guangrong
` (2 preceding siblings ...)
2009-07-10 5:23 ` Li Zefan
@ 2009-07-10 10:41 ` tip-bot for Xiao Guangrong
3 siblings, 0 replies; 9+ messages in thread
From: tip-bot for Xiao Guangrong @ 2009-07-10 10:41 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, tzanussi, lizf, xiaoguangrong,
fweisbec, rostedt, tglx, mingo
Commit-ID: c5cb183608167c744cb28bbd85884be5a4ce875d
Gitweb: http://git.kernel.org/tip/c5cb183608167c744cb28bbd85884be5a4ce875d
Author: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
AuthorDate: Thu, 9 Jul 2009 16:20:12 +0800
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Fri, 10 Jul 2009 11:55:27 +0200
tracing/filter: Remove preds from struct event_subsystem
No need to save preds to event_subsystem, because it's not used.
Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Acked-by: Tom Zanussi <tzanussi@gmail.com>
Reviewed-by: Li Zefan <lizf@cn.fujitsu.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <4A55A83C.1030005@cn.fujitsu.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
kernel/trace/trace_events_filter.c | 39 +++++------------------------------
1 files changed, 6 insertions(+), 33 deletions(-)
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 936c621..b9aae72 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -420,17 +420,7 @@ EXPORT_SYMBOL_GPL(init_preds);
static void filter_free_subsystem_preds(struct event_subsystem *system)
{
- struct event_filter *filter = system->filter;
struct ftrace_event_call *call;
- int i;
-
- if (filter->n_preds) {
- for (i = 0; i < filter->n_preds; i++)
- filter_free_pred(filter->preds[i]);
- kfree(filter->preds);
- filter->preds = NULL;
- filter->n_preds = 0;
- }
list_for_each_entry(call, &ftrace_events, list) {
if (!call->define_fields)
@@ -607,26 +597,9 @@ static int filter_add_subsystem_pred(struct filter_parse_state *ps,
struct filter_pred *pred,
char *filter_string)
{
- struct event_filter *filter = system->filter;
struct ftrace_event_call *call;
int err = 0;
- if (!filter->preds) {
- filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred),
- GFP_KERNEL);
-
- if (!filter->preds)
- return -ENOMEM;
- }
-
- if (filter->n_preds == MAX_FILTER_PRED) {
- parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
- return -ENOSPC;
- }
-
- filter->preds[filter->n_preds] = pred;
- filter->n_preds++;
-
list_for_each_entry(call, &ftrace_events, list) {
if (!call->define_fields)
@@ -1029,12 +1002,12 @@ static int replace_preds(struct event_subsystem *system,
if (elt->op == OP_AND || elt->op == OP_OR) {
pred = create_logical_pred(elt->op);
- if (call) {
+ if (call)
err = filter_add_pred(ps, call, pred);
- filter_free_pred(pred);
- } else
+ else
err = filter_add_subsystem_pred(ps, system,
pred, filter_string);
+ filter_free_pred(pred);
if (err)
return err;
@@ -1048,12 +1021,12 @@ static int replace_preds(struct event_subsystem *system,
}
pred = create_pred(elt->op, operand1, operand2);
- if (call) {
+ if (call)
err = filter_add_pred(ps, call, pred);
- filter_free_pred(pred);
- } else
+ else
err = filter_add_subsystem_pred(ps, system, pred,
filter_string);
+ filter_free_pred(pred);
if (err)
return err;
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [tip:tracing/core] tracing/filter: Remove empty subsystem and its directory
2009-07-09 8:22 ` [PATCH 2/2] tracing/filter: remove empty subsystem and it's directory Xiao Guangrong
2009-07-10 4:06 ` Tom Zanussi
@ 2009-07-10 10:41 ` tip-bot for Xiao Guangrong
2009-07-14 17:00 ` Steven Rostedt
1 sibling, 1 reply; 9+ messages in thread
From: tip-bot for Xiao Guangrong @ 2009-07-10 10:41 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, tzanussi, lizf, xiaoguangrong,
fweisbec, rostedt, tglx, mingo
Commit-ID: dc82ec98a4727fd51b77e92d05fe7d2db3dcc11c
Gitweb: http://git.kernel.org/tip/dc82ec98a4727fd51b77e92d05fe7d2db3dcc11c
Author: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
AuthorDate: Thu, 9 Jul 2009 16:22:22 +0800
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Fri, 10 Jul 2009 11:55:28 +0200
tracing/filter: Remove empty subsystem and its directory
Remove empty subsystem and its directory when module unload.
Before patch:
# rmmod trace-events-sample.ko
# ls sample
enable filter
After patch:
# rmmod trace-events-sample.ko
# ls sample
ls: cannot access sample: No such file or directory
Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Acked-by: Tom Zanussi <tzanussi@gmail.com>
Reviewed-by: Li Zefan <lizf@cn.fujitsu.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <4A55A8BE.9010707@cn.fujitsu.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
kernel/trace/trace.h | 1 +
kernel/trace/trace_events.c | 32 +++++++++++++++++++++++++++++++-
2 files changed, 32 insertions(+), 1 deletions(-)
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 52eb0d8..94305c7 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -757,6 +757,7 @@ struct event_subsystem {
const char *name;
struct dentry *entry;
void *filter;
+ int nr_events;
};
struct filter_pred;
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index fecac13..90cf936 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -851,8 +851,10 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
/* First see if we did not already create this dir */
list_for_each_entry(system, &event_subsystems, list) {
- if (strcmp(system->name, name) == 0)
+ if (strcmp(system->name, name) == 0) {
+ system->nr_events++;
return system->entry;
+ }
}
/* need to create new entry */
@@ -871,6 +873,7 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
return d_events;
}
+ system->nr_events = 1;
system->name = kstrdup(name, GFP_KERNEL);
if (!system->name) {
debugfs_remove(system->entry);
@@ -905,6 +908,32 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
return system->entry;
}
+static void remove_subsystem_dir(const char *name)
+{
+ struct event_subsystem *system;
+
+ if (strcmp(name, TRACE_SYSTEM) == 0)
+ return;
+
+ list_for_each_entry(system, &event_subsystems, list) {
+ if (strcmp(system->name, name) == 0) {
+ if (!--system->nr_events) {
+ struct event_filter *filter = system->filter;
+
+ debugfs_remove_recursive(system->entry);
+ list_del(&system->list);
+ if (filter) {
+ kfree(filter->filter_string);
+ kfree(filter);
+ }
+ kfree(system->name);
+ kfree(system);
+ }
+ break;
+ }
+ }
+}
+
static int
event_create_dir(struct ftrace_event_call *call, struct dentry *d_events,
const struct file_operations *id,
@@ -1079,6 +1108,7 @@ static void trace_module_remove_events(struct module *mod)
list_del(&call->list);
trace_destroy_fields(call);
destroy_preds(call);
+ remove_subsystem_dir(call->system);
}
}
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [tip:tracing/core] tracing/filter: Remove empty subsystem and its directory
2009-07-10 10:41 ` [tip:tracing/core] tracing/filter: Remove empty subsystem and its directory tip-bot for Xiao Guangrong
@ 2009-07-14 17:00 ` Steven Rostedt
0 siblings, 0 replies; 9+ messages in thread
From: Steven Rostedt @ 2009-07-14 17:00 UTC (permalink / raw)
To: mingo, hpa, linux-kernel, tzanussi, lizf, xiaoguangrong,
fweisbec, tglx, mingo
Cc: linux-tip-commits
On Fri, 10 Jul 2009, tip-bot for Xiao Guangrong wrote:
> Commit-ID: dc82ec98a4727fd51b77e92d05fe7d2db3dcc11c
> Gitweb: http://git.kernel.org/tip/dc82ec98a4727fd51b77e92d05fe7d2db3dcc11c
> Author: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> AuthorDate: Thu, 9 Jul 2009 16:22:22 +0800
> Committer: Ingo Molnar <mingo@elte.hu>
> CommitDate: Fri, 10 Jul 2009 11:55:28 +0200
>
> tracing/filter: Remove empty subsystem and its directory
>
> Remove empty subsystem and its directory when module unload.
>
> Before patch:
> # rmmod trace-events-sample.ko
> # ls sample
> enable filter
>
> After patch:
> # rmmod trace-events-sample.ko
> # ls sample
> ls: cannot access sample: No such file or directory
>
> Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> Acked-by: Tom Zanussi <tzanussi@gmail.com>
> Reviewed-by: Li Zefan <lizf@cn.fujitsu.com>
> Cc: Frederic Weisbecker <fweisbec@gmail.com>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> LKML-Reference: <4A55A8BE.9010707@cn.fujitsu.com>
> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Thanks Xiao!
I've just came back from vacation so I missed acking it. But it looks
good, and Ingo pulled it in.
-- Steve
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2009-07-14 17:00 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-07-09 8:20 [PATCH 1/2] tracing/filter: remove preds from struct event_subsystem Xiao Guangrong
2009-07-09 8:22 ` [PATCH 2/2] tracing/filter: remove empty subsystem and it's directory Xiao Guangrong
2009-07-10 4:06 ` Tom Zanussi
2009-07-10 5:28 ` Li Zefan
2009-07-10 10:41 ` [tip:tracing/core] tracing/filter: Remove empty subsystem and its directory tip-bot for Xiao Guangrong
2009-07-14 17:00 ` Steven Rostedt
2009-07-10 4:04 ` [PATCH 1/2] tracing/filter: remove preds from struct event_subsystem Tom Zanussi
2009-07-10 5:23 ` Li Zefan
2009-07-10 10:41 ` [tip:tracing/core] tracing/filter: Remove " tip-bot for Xiao Guangrong
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.