|
@@ -483,9 +483,10 @@ clear_event_triggers(struct trace_array *tr)
|
|
struct trace_event_file *file;
|
|
struct trace_event_file *file;
|
|
|
|
|
|
list_for_each_entry(file, &tr->events, list) {
|
|
list_for_each_entry(file, &tr->events, list) {
|
|
- struct event_trigger_data *data;
|
|
|
|
- list_for_each_entry_rcu(data, &file->triggers, list) {
|
|
|
|
|
|
+ struct event_trigger_data *data, *n;
|
|
|
|
+ list_for_each_entry_safe(data, n, &file->triggers, list) {
|
|
trace_event_trigger_enable_disable(file, 0);
|
|
trace_event_trigger_enable_disable(file, 0);
|
|
|
|
+ list_del_rcu(&data->list);
|
|
if (data->ops->free)
|
|
if (data->ops->free)
|
|
data->ops->free(data->ops, data);
|
|
data->ops->free(data->ops, data);
|
|
}
|
|
}
|
|
@@ -642,6 +643,7 @@ event_trigger_callback(struct event_command *cmd_ops,
|
|
trigger_data->count = -1;
|
|
trigger_data->count = -1;
|
|
trigger_data->ops = trigger_ops;
|
|
trigger_data->ops = trigger_ops;
|
|
trigger_data->cmd_ops = cmd_ops;
|
|
trigger_data->cmd_ops = cmd_ops;
|
|
|
|
+ trigger_data->private_data = file;
|
|
INIT_LIST_HEAD(&trigger_data->list);
|
|
INIT_LIST_HEAD(&trigger_data->list);
|
|
INIT_LIST_HEAD(&trigger_data->named_list);
|
|
INIT_LIST_HEAD(&trigger_data->named_list);
|
|
|
|
|
|
@@ -1053,7 +1055,12 @@ static void
|
|
snapshot_trigger(struct event_trigger_data *data, void *rec,
|
|
snapshot_trigger(struct event_trigger_data *data, void *rec,
|
|
struct ring_buffer_event *event)
|
|
struct ring_buffer_event *event)
|
|
{
|
|
{
|
|
- tracing_snapshot();
|
|
|
|
|
|
+ struct trace_event_file *file = data->private_data;
|
|
|
|
+
|
|
|
|
+ if (file)
|
|
|
|
+ tracing_snapshot_instance(file->tr);
|
|
|
|
+ else
|
|
|
|
+ tracing_snapshot();
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
static void
|
|
@@ -1076,7 +1083,7 @@ register_snapshot_trigger(char *glob, struct event_trigger_ops *ops,
|
|
{
|
|
{
|
|
int ret = register_trigger(glob, ops, data, file);
|
|
int ret = register_trigger(glob, ops, data, file);
|
|
|
|
|
|
- if (ret > 0 && tracing_alloc_snapshot() != 0) {
|
|
|
|
|
|
+ if (ret > 0 && tracing_alloc_snapshot_instance(file->tr) != 0) {
|
|
unregister_trigger(glob, ops, data, file);
|
|
unregister_trigger(glob, ops, data, file);
|
|
ret = 0;
|
|
ret = 0;
|
|
}
|
|
}
|