tracing: Warn if a tracepoint is not set via debugfs
[cascardo/linux.git] / kernel / tracepoint.c
index 0d4ef26..0058f33 100644 (file)
@@ -62,6 +62,7 @@ struct tracepoint_entry {
        struct hlist_node hlist;
        struct tracepoint_func *funcs;
        int refcount;   /* Number of times armed. 0 if disarmed. */
+       int enabled;    /* Tracepoint enabled */
        char name[0];
 };
 
@@ -237,6 +238,7 @@ static struct tracepoint_entry *add_tracepoint(const char *name)
        memcpy(&e->name[0], name, name_len);
        e->funcs = NULL;
        e->refcount = 0;
+       e->enabled = 0;
        hlist_add_head(&e->hlist, head);
        return e;
 }
@@ -316,6 +318,7 @@ static void tracepoint_update_probe_range(struct tracepoint * const *begin,
                if (mark_entry) {
                        set_tracepoint(&mark_entry, *iter,
                                        !!mark_entry->refcount);
+                       mark_entry->enabled = !!mark_entry->refcount;
                } else {
                        disable_tracepoint(*iter);
                }
@@ -380,6 +383,8 @@ tracepoint_add_probe(const char *name, void *probe, void *data)
 int tracepoint_probe_register(const char *name, void *probe, void *data)
 {
        struct tracepoint_func *old;
+       struct tracepoint_entry *entry;
+       int ret = 0;
 
        mutex_lock(&tracepoints_mutex);
        old = tracepoint_add_probe(name, probe, data);
@@ -388,9 +393,13 @@ int tracepoint_probe_register(const char *name, void *probe, void *data)
                return PTR_ERR(old);
        }
        tracepoint_update_probes();             /* may update entry */
+       entry = get_tracepoint(name);
+       /* Make sure the entry was enabled */
+       if (!entry || !entry->enabled)
+               ret = -ENODEV;
        mutex_unlock(&tracepoints_mutex);
        release_probes(old);
-       return 0;
+       return ret;
 }
 EXPORT_SYMBOL_GPL(tracepoint_probe_register);