All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.