diff options
Diffstat (limited to 'kernel/trace/trace_events_trigger.c')
| -rw-r--r-- | kernel/trace/trace_events_trigger.c | 63 | 
1 files changed, 45 insertions, 18 deletions
| diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c index b33c3861fbbb..4bec043c8690 100644 --- a/kernel/trace/trace_events_trigger.c +++ b/kernel/trace/trace_events_trigger.c @@ -597,20 +597,12 @@ out:  	return ret;  } -/** - * unregister_trigger - Generic event_command @unreg implementation - * @glob: The raw string used to register the trigger - * @test: Trigger-specific data used to find the trigger to remove - * @file: The trace_event_file associated with the event - * - * Common implementation for event trigger unregistration. - * - * Usually used directly as the @unreg method in event command - * implementations. +/* + * True if the trigger was found and unregistered, else false.   */ -static void unregister_trigger(char *glob, -			       struct event_trigger_data *test, -			       struct trace_event_file *file) +static bool try_unregister_trigger(char *glob, +				   struct event_trigger_data *test, +				   struct trace_event_file *file)  {  	struct event_trigger_data *data = NULL, *iter; @@ -626,8 +618,32 @@ static void unregister_trigger(char *glob,  		}  	} -	if (data && data->ops->free) -		data->ops->free(data); +	if (data) { +		if (data->ops->free) +			data->ops->free(data); + +		return true; +	} + +	return false; +} + +/** + * unregister_trigger - Generic event_command @unreg implementation + * @glob: The raw string used to register the trigger + * @test: Trigger-specific data used to find the trigger to remove + * @file: The trace_event_file associated with the event + * + * Common implementation for event trigger unregistration. + * + * Usually used directly as the @unreg method in event command + * implementations. + */ +static void unregister_trigger(char *glob, +			       struct event_trigger_data *test, +			       struct trace_event_file *file) +{ +	try_unregister_trigger(glob, test, file);  }  /* @@ -1470,12 +1486,23 @@ register_snapshot_trigger(char *glob,  			  struct event_trigger_data *data,  			  struct trace_event_file *file)  { -	int ret = tracing_alloc_snapshot_instance(file->tr); +	int ret = tracing_arm_snapshot(file->tr);  	if (ret < 0)  		return ret; -	return register_trigger(glob, data, file); +	ret = register_trigger(glob, data, file); +	if (ret < 0) +		tracing_disarm_snapshot(file->tr); +	return ret; +} + +static void unregister_snapshot_trigger(char *glob, +					struct event_trigger_data *data, +					struct trace_event_file *file) +{ +	if (try_unregister_trigger(glob, data, file)) +		tracing_disarm_snapshot(file->tr);  }  static int @@ -1510,7 +1537,7 @@ static struct event_command trigger_snapshot_cmd = {  	.trigger_type		= ETT_SNAPSHOT,  	.parse			= event_trigger_parse,  	.reg			= register_snapshot_trigger, -	.unreg			= unregister_trigger, +	.unreg			= unregister_snapshot_trigger,  	.get_trigger_ops	= snapshot_get_trigger_ops,  	.set_filter		= set_trigger_filter,  }; | 
