diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/tracepoint.c | 11 |
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) | |||
| 380 | int tracepoint_probe_register(const char *name, void *probe, void *data) | 383 | int 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 | } |
| 395 | EXPORT_SYMBOL_GPL(tracepoint_probe_register); | 404 | EXPORT_SYMBOL_GPL(tracepoint_probe_register); |
| 396 | 405 | ||
