diff options
| -rw-r--r-- | kernel/trace/events.c | 4 | ||||
| -rw-r--r-- | kernel/trace/trace_events.c | 48 | ||||
| -rw-r--r-- | kernel/trace/trace_events.h | 2 |
3 files changed, 54 insertions, 0 deletions
diff --git a/kernel/trace/events.c b/kernel/trace/events.c index 46e27ad2487e..4e4e45860c58 100644 --- a/kernel/trace/events.c +++ b/kernel/trace/events.c | |||
| @@ -2,6 +2,10 @@ | |||
| 2 | * This is the place to register all trace points as events. | 2 | * This is the place to register all trace points as events. |
| 3 | */ | 3 | */ |
| 4 | 4 | ||
| 5 | /* someday this needs to go in a generic header */ | ||
| 6 | #define __STR(x) #x | ||
| 7 | #define STR(x) __STR(x) | ||
| 8 | |||
| 5 | #include <trace/trace_events.h> | 9 | #include <trace/trace_events.h> |
| 6 | 10 | ||
| 7 | #include "trace_events.h" | 11 | #include "trace_events.h" |
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 3bcb9df93342..19332200c457 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
| @@ -345,11 +345,59 @@ static struct dentry *event_trace_events_dir(void) | |||
| 345 | return d_events; | 345 | return d_events; |
| 346 | } | 346 | } |
| 347 | 347 | ||
| 348 | struct event_subsystem { | ||
| 349 | struct list_head list; | ||
| 350 | const char *name; | ||
| 351 | struct dentry *entry; | ||
| 352 | }; | ||
| 353 | |||
| 354 | static LIST_HEAD(event_subsystems); | ||
| 355 | |||
| 356 | static struct dentry * | ||
| 357 | event_subsystem_dir(const char *name, struct dentry *d_events) | ||
| 358 | { | ||
| 359 | struct event_subsystem *system; | ||
| 360 | |||
| 361 | /* First see if we did not already create this dir */ | ||
| 362 | list_for_each_entry(system, &event_subsystems, list) { | ||
| 363 | if (strcmp(system->name, name) == 0) | ||
| 364 | return system->entry; | ||
| 365 | } | ||
| 366 | |||
| 367 | /* need to create new entry */ | ||
| 368 | system = kmalloc(sizeof(*system), GFP_KERNEL); | ||
| 369 | if (!system) { | ||
| 370 | pr_warning("No memory to create event subsystem %s\n", | ||
| 371 | name); | ||
| 372 | return d_events; | ||
| 373 | } | ||
| 374 | |||
| 375 | system->entry = debugfs_create_dir(name, d_events); | ||
| 376 | if (!system->entry) { | ||
| 377 | pr_warning("Could not create event subsystem %s\n", | ||
| 378 | name); | ||
| 379 | kfree(system); | ||
| 380 | return d_events; | ||
| 381 | } | ||
| 382 | |||
| 383 | system->name = name; | ||
| 384 | list_add(&system->list, &event_subsystems); | ||
| 385 | |||
| 386 | return system->entry; | ||
| 387 | } | ||
| 388 | |||
| 348 | static int | 389 | static int |
| 349 | event_create_dir(struct ftrace_event_call *call, struct dentry *d_events) | 390 | event_create_dir(struct ftrace_event_call *call, struct dentry *d_events) |
| 350 | { | 391 | { |
| 351 | struct dentry *entry; | 392 | struct dentry *entry; |
| 352 | 393 | ||
| 394 | /* | ||
| 395 | * If the trace point header did not define TRACE_SYSTEM | ||
| 396 | * then the system would be called "TRACE_SYSTEM". | ||
| 397 | */ | ||
| 398 | if (strcmp(call->system, "TRACE_SYSTEM") != 0) | ||
| 399 | d_events = event_subsystem_dir(call->system, d_events); | ||
| 400 | |||
| 353 | call->dir = debugfs_create_dir(call->name, d_events); | 401 | call->dir = debugfs_create_dir(call->name, d_events); |
| 354 | if (!call->dir) { | 402 | if (!call->dir) { |
| 355 | pr_warning("Could not create debugfs " | 403 | pr_warning("Could not create debugfs " |
diff --git a/kernel/trace/trace_events.h b/kernel/trace/trace_events.h index deb95e5006c8..b015d7b19878 100644 --- a/kernel/trace/trace_events.h +++ b/kernel/trace/trace_events.h | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | 7 | ||
| 8 | struct ftrace_event_call { | 8 | struct ftrace_event_call { |
| 9 | char *name; | 9 | char *name; |
| 10 | char *system; | ||
| 10 | struct dentry *dir; | 11 | struct dentry *dir; |
| 11 | int enabled; | 12 | int enabled; |
| 12 | int (*regfunc)(void); | 13 | int (*regfunc)(void); |
| @@ -44,6 +45,7 @@ static struct ftrace_event_call __used \ | |||
| 44 | __attribute__((__aligned__(4))) \ | 45 | __attribute__((__aligned__(4))) \ |
| 45 | __attribute__((section("_ftrace_events"))) event_##call = { \ | 46 | __attribute__((section("_ftrace_events"))) event_##call = { \ |
| 46 | .name = #call, \ | 47 | .name = #call, \ |
| 48 | .system = STR(TRACE_SYSTEM), \ | ||
| 47 | .regfunc = ftrace_reg_event_##call, \ | 49 | .regfunc = ftrace_reg_event_##call, \ |
| 48 | .unregfunc = ftrace_unreg_event_##call, \ | 50 | .unregfunc = ftrace_unreg_event_##call, \ |
| 49 | } | 51 | } |
