|
@@ -115,10 +115,15 @@ event_triggers_post_call(struct ftrace_event_file *file,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(event_triggers_post_call);
|
|
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)
|
|
static void *trigger_next(struct seq_file *m, void *t, loff_t *pos)
|
|
{
|
|
{
|
|
struct ftrace_event_file *event_file = event_file_data(m->private);
|
|
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);
|
|
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))
|
|
if (unlikely(!event_file))
|
|
return ERR_PTR(-ENODEV);
|
|
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);
|
|
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)
|
|
static int trigger_show(struct seq_file *m, void *v)
|
|
{
|
|
{
|
|
struct event_trigger_data *data;
|
|
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 = list_entry(v, struct event_trigger_data, list);
|
|
data->ops->print(m, data->ops, data);
|
|
data->ops->print(m, data->ops, data);
|