* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox