]> Pileus Git - ~andy/linux/blobdiff - kernel/trace/trace_events.c
Merge tag 'trace-fixes-v3.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git...
[~andy/linux] / kernel / trace / trace_events.c
index a11800ae96de5d1f098153aaacdb715ba5098493..f3989ceb5cd5aa7cbfae069015e8d915d6eb4c59 100644 (file)
@@ -342,6 +342,12 @@ static int __ftrace_event_enable_disable(struct ftrace_event_file *file,
        return ret;
 }
 
+int trace_event_enable_disable(struct ftrace_event_file *file,
+                              int enable, int soft_disable)
+{
+       return __ftrace_event_enable_disable(file, enable, soft_disable);
+}
+
 static int ftrace_event_enable_disable(struct ftrace_event_file *file,
                                       int enable)
 {
@@ -421,11 +427,6 @@ static void remove_subsystem(struct ftrace_subsystem_dir *dir)
        }
 }
 
-static void *event_file_data(struct file *filp)
-{
-       return ACCESS_ONCE(file_inode(filp)->i_private);
-}
-
 static void remove_event_file_dir(struct ftrace_event_file *file)
 {
        struct dentry *dir = file->dir;
@@ -1549,6 +1550,9 @@ event_create_dir(struct dentry *parent, struct ftrace_event_file *file)
        trace_create_file("filter", 0644, file->dir, file,
                          &ftrace_event_filter_fops);
 
+       trace_create_file("trigger", 0644, file->dir, file,
+                         &event_trigger_fops);
+
        trace_create_file("format", 0444, file->dir, call,
                          &ftrace_event_format_fops);
 
@@ -1645,6 +1649,8 @@ trace_create_new_event(struct ftrace_event_call *call,
        file->event_call = call;
        file->tr = tr;
        atomic_set(&file->sm_ref, 0);
+       atomic_set(&file->tm_ref, 0);
+       INIT_LIST_HEAD(&file->triggers);
        list_add(&file->list, &tr->events);
 
        return file;
@@ -1771,6 +1777,16 @@ static void trace_module_add_events(struct module *mod)
 {
        struct ftrace_event_call **call, **start, **end;
 
+       if (!mod->num_trace_events)
+               return;
+
+       /* Don't add infrastructure for mods without tracepoints */
+       if (trace_module_has_bad_taint(mod)) {
+               pr_err("%s: module has bad taint, not creating trace events\n",
+                      mod->name);
+               return;
+       }
+
        start = mod->trace_events;
        end = mod->trace_events + mod->num_trace_events;
 
@@ -1849,20 +1865,7 @@ __trace_add_event_dirs(struct trace_array *tr)
        }
 }
 
-#ifdef CONFIG_DYNAMIC_FTRACE
-
-/* Avoid typos */
-#define ENABLE_EVENT_STR       "enable_event"
-#define DISABLE_EVENT_STR      "disable_event"
-
-struct event_probe_data {
-       struct ftrace_event_file        *file;
-       unsigned long                   count;
-       int                             ref;
-       bool                            enable;
-};
-
-static struct ftrace_event_file *
+struct ftrace_event_file *
 find_event_file(struct trace_array *tr, const char *system,  const char *event)
 {
        struct ftrace_event_file *file;
@@ -1885,6 +1888,19 @@ find_event_file(struct trace_array *tr, const char *system,  const char *event)
        return NULL;
 }
 
+#ifdef CONFIG_DYNAMIC_FTRACE
+
+/* Avoid typos */
+#define ENABLE_EVENT_STR       "enable_event"
+#define DISABLE_EVENT_STR      "disable_event"
+
+struct event_probe_data {
+       struct ftrace_event_file        *file;
+       unsigned long                   count;
+       int                             ref;
+       bool                            enable;
+};
+
 static void
 event_enable_probe(unsigned long ip, unsigned long parent_ip, void **_data)
 {
@@ -2311,6 +2327,9 @@ int event_trace_del_tracer(struct trace_array *tr)
 {
        mutex_lock(&event_mutex);
 
+       /* Disable any event triggers and associated soft-disabled events */
+       clear_event_triggers(tr);
+
        /* Disable any running events */
        __ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0);
 
@@ -2377,6 +2396,8 @@ static __init int event_trace_enable(void)
 
        register_event_cmds();
 
+       register_trigger_cmds();
+
        return 0;
 }