aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/tracepoint.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
index 0d4ef26574ff..0058f33d05c1 100644
--- a/kernel/tracepoint.c
+++ b/kernel/tracepoint.c
@@ -62,6 +62,7 @@ struct tracepoint_entry {
62 struct hlist_node hlist; 62 struct hlist_node hlist;
63 struct tracepoint_func *funcs; 63 struct tracepoint_func *funcs;
64 int refcount; /* Number of times armed. 0 if disarmed. */ 64 int refcount; /* Number of times armed. 0 if disarmed. */
65 int enabled; /* Tracepoint enabled */
65 char name[0]; 66 char name[0];
66}; 67};
67 68
@@ -237,6 +238,7 @@ static struct tracepoint_entry *add_tracepoint(const char *name)
237 memcpy(&e->name[0], name, name_len); 238 memcpy(&e->name[0], name, name_len);
238 e->funcs = NULL; 239 e->funcs = NULL;
239 e->refcount = 0; 240 e->refcount = 0;
241 e->enabled = 0;
240 hlist_add_head(&e->hlist, head); 242 hlist_add_head(&e->hlist, head);
241 return e; 243 return e;
242} 244}
@@ -316,6 +318,7 @@ static void tracepoint_update_probe_range(struct tracepoint * const *begin,
316 if (mark_entry) { 318 if (mark_entry) {
317 set_tracepoint(&mark_entry, *iter, 319 set_tracepoint(&mark_entry, *iter,
318 !!mark_entry->refcount); 320 !!mark_entry->refcount);
321 mark_entry->enabled = !!mark_entry->refcount;
319 } else { 322 } else {
320 disable_tracepoint(*iter); 323 disable_tracepoint(*iter);
321 } 324 }
@@ -380,6 +383,8 @@ tracepoint_add_probe(const char *name, void *probe, void *data)
380int tracepoint_probe_register(const char *name, void *probe, void *data) 383int tracepoint_probe_register(const char *name, void *probe, void *data)
381{ 384{
382 struct tracepoint_func *old; 385 struct tracepoint_func *old;
386 struct tracepoint_entry *entry;
387 int ret = 0;
383 388
384 mutex_lock(&tracepoints_mutex); 389 mutex_lock(&tracepoints_mutex);
385 old = tracepoint_add_probe(name, probe, data); 390 old = tracepoint_add_probe(name, probe, data);
@@ -388,9 +393,13 @@ int tracepoint_probe_register(const char *name, void *probe, void *data)
388 return PTR_ERR(old); 393 return PTR_ERR(old);
389 } 394 }
390 tracepoint_update_probes(); /* may update entry */ 395 tracepoint_update_probes(); /* may update entry */
396 entry = get_tracepoint(name);
397 /* Make sure the entry was enabled */
398 if (!entry || !entry->enabled)
399 ret = -ENODEV;
391 mutex_unlock(&tracepoints_mutex); 400 mutex_unlock(&tracepoints_mutex);
392 release_probes(old); 401 release_probes(old);
393 return 0; 402 return ret;
394} 403}
395EXPORT_SYMBOL_GPL(tracepoint_probe_register); 404EXPORT_SYMBOL_GPL(tracepoint_probe_register);
396 405