diff options
Diffstat (limited to 'kernel/trace')
-rw-r--r-- | kernel/trace/trace_events_trigger.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c index a53e0da7e333..8efbb69b04f0 100644 --- a/kernel/trace/trace_events_trigger.c +++ b/kernel/trace/trace_events_trigger.c @@ -115,10 +115,15 @@ event_triggers_post_call(struct ftrace_event_file *file, } EXPORT_SYMBOL_GPL(event_triggers_post_call); +#define SHOW_AVAILABLE_TRIGGERS (void *)(1UL) + static void *trigger_next(struct seq_file *m, void *t, loff_t *pos) { struct ftrace_event_file *event_file = event_file_data(m->private); + if (t == SHOW_AVAILABLE_TRIGGERS) + return NULL; + return seq_list_next(t, &event_file->triggers, pos); } @@ -132,6 +137,9 @@ static void *trigger_start(struct seq_file *m, loff_t *pos) if (unlikely(!event_file)) return ERR_PTR(-ENODEV); + if (list_empty(&event_file->triggers)) + return *pos == 0 ? SHOW_AVAILABLE_TRIGGERS : NULL; + return seq_list_start(&event_file->triggers, *pos); } @@ -143,6 +151,18 @@ static void trigger_stop(struct seq_file *m, void *t) static int trigger_show(struct seq_file *m, void *v) { struct event_trigger_data *data; + struct event_command *p; + + if (v == SHOW_AVAILABLE_TRIGGERS) { + seq_puts(m, "# Available triggers:\n"); + seq_putc(m, '#'); + mutex_lock(&trigger_cmd_mutex); + list_for_each_entry_reverse(p, &trigger_commands, list) + seq_printf(m, " %s", p->name); + seq_putc(m, '\n'); + mutex_unlock(&trigger_cmd_mutex); + return 0; + } data = list_entry(v, struct event_trigger_data, list); data->ops->print(m, data->ops, data); |