trace_events.c (16419098e8b301417173d8d2cbfa94a56ac9900b) trace_events.c (5790b1fb3d672d9a1fe3881a7181dfdbe741568f)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * event tracer
4 *
5 * Copyright (C) 2008 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
6 *
7 * - Added format output of fields of the trace point.
8 * This was based off of work by Tom Zanussi <tzanussi@gmail.com>.

--- 970 unchanged lines hidden (view full) ---

979}
980
981static void remove_subsystem(struct trace_subsystem_dir *dir)
982{
983 if (!dir)
984 return;
985
986 if (!--dir->nr_events) {
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * event tracer
4 *
5 * Copyright (C) 2008 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
6 *
7 * - Added format output of fields of the trace point.
8 * This was based off of work by Tom Zanussi <tzanussi@gmail.com>.

--- 970 unchanged lines hidden (view full) ---

979}
980
981static void remove_subsystem(struct trace_subsystem_dir *dir)
982{
983 if (!dir)
984 return;
985
986 if (!--dir->nr_events) {
987 eventfs_remove(dir->ef);
987 eventfs_remove_dir(dir->ei);
988 list_del(&dir->list);
989 __put_system_dir(dir);
990 }
991}
992
993static void remove_event_file_dir(struct trace_event_file *file)
994{
988 list_del(&dir->list);
989 __put_system_dir(dir);
990 }
991}
992
993static void remove_event_file_dir(struct trace_event_file *file)
994{
995 eventfs_remove(file->ef);
995 eventfs_remove_dir(file->ei);
996 list_del(&file->list);
997 remove_subsystem(file->system);
998 free_event_filter(file->filter);
999 kmem_cache_free(file_cachep, file);
1000}
1001
1002/*
1003 * __ftrace_set_clr_event(NULL, NULL, NULL, set) will set/unset all events.

--- 157 unchanged lines hidden (view full) ---

1161 struct trace_parser parser;
1162 struct seq_file *m = file->private_data;
1163 struct trace_array *tr = m->private;
1164 ssize_t read, ret;
1165
1166 if (!cnt)
1167 return 0;
1168
996 list_del(&file->list);
997 remove_subsystem(file->system);
998 free_event_filter(file->filter);
999 kmem_cache_free(file_cachep, file);
1000}
1001
1002/*
1003 * __ftrace_set_clr_event(NULL, NULL, NULL, set) will set/unset all events.

--- 157 unchanged lines hidden (view full) ---

1161 struct trace_parser parser;
1162 struct seq_file *m = file->private_data;
1163 struct trace_array *tr = m->private;
1164 ssize_t read, ret;
1165
1166 if (!cnt)
1167 return 0;
1168
1169 ret = tracing_update_buffers();
1169 ret = tracing_update_buffers(tr);
1170 if (ret < 0)
1171 return ret;
1172
1173 if (trace_parser_get_init(&parser, EVENT_BUF_SIZE + 1))
1174 return -ENOMEM;
1175
1176 read = trace_get_user(&parser, ubuf, cnt, ppos);
1177

--- 214 unchanged lines hidden (view full) ---

1392 struct trace_event_file *file;
1393 unsigned long val;
1394 int ret;
1395
1396 ret = kstrtoul_from_user(ubuf, cnt, 10, &val);
1397 if (ret)
1398 return ret;
1399
1170 if (ret < 0)
1171 return ret;
1172
1173 if (trace_parser_get_init(&parser, EVENT_BUF_SIZE + 1))
1174 return -ENOMEM;
1175
1176 read = trace_get_user(&parser, ubuf, cnt, ppos);
1177

--- 214 unchanged lines hidden (view full) ---

1392 struct trace_event_file *file;
1393 unsigned long val;
1394 int ret;
1395
1396 ret = kstrtoul_from_user(ubuf, cnt, 10, &val);
1397 if (ret)
1398 return ret;
1399
1400 ret = tracing_update_buffers();
1401 if (ret < 0)
1402 return ret;
1403
1404 switch (val) {
1405 case 0:
1406 case 1:
1407 ret = -ENODEV;
1408 mutex_lock(&event_mutex);
1409 file = event_file_data(filp);
1400 switch (val) {
1401 case 0:
1402 case 1:
1403 ret = -ENODEV;
1404 mutex_lock(&event_mutex);
1405 file = event_file_data(filp);
1410 if (likely(file))
1406 if (likely(file)) {
1407 ret = tracing_update_buffers(file->tr);
1408 if (ret < 0) {
1409 mutex_unlock(&event_mutex);
1410 return ret;
1411 }
1411 ret = ftrace_event_enable_disable(file, val);
1412 ret = ftrace_event_enable_disable(file, val);
1413 }
1412 mutex_unlock(&event_mutex);
1413 break;
1414
1415 default:
1416 return -EINVAL;
1417 }
1418
1419 *ppos += cnt;

--- 57 unchanged lines hidden (view full) ---

1477 const char *name = NULL;
1478 unsigned long val;
1479 ssize_t ret;
1480
1481 ret = kstrtoul_from_user(ubuf, cnt, 10, &val);
1482 if (ret)
1483 return ret;
1484
1414 mutex_unlock(&event_mutex);
1415 break;
1416
1417 default:
1418 return -EINVAL;
1419 }
1420
1421 *ppos += cnt;

--- 57 unchanged lines hidden (view full) ---

1479 const char *name = NULL;
1480 unsigned long val;
1481 ssize_t ret;
1482
1483 ret = kstrtoul_from_user(ubuf, cnt, 10, &val);
1484 if (ret)
1485 return ret;
1486
1485 ret = tracing_update_buffers();
1487 ret = tracing_update_buffers(dir->tr);
1486 if (ret < 0)
1487 return ret;
1488
1489 if (val != 0 && val != 1)
1490 return -EINVAL;
1491
1492 /*
1493 * Opening of "enable" adds a ref count to system,

--- 457 unchanged lines hidden (view full) ---

1951 struct trace_pid_list *other_pids = NULL;
1952 struct trace_pid_list *pid_list;
1953 struct trace_event_file *file;
1954 ssize_t ret;
1955
1956 if (!cnt)
1957 return 0;
1958
1488 if (ret < 0)
1489 return ret;
1490
1491 if (val != 0 && val != 1)
1492 return -EINVAL;
1493
1494 /*
1495 * Opening of "enable" adds a ref count to system,

--- 457 unchanged lines hidden (view full) ---

1953 struct trace_pid_list *other_pids = NULL;
1954 struct trace_pid_list *pid_list;
1955 struct trace_event_file *file;
1956 ssize_t ret;
1957
1958 if (!cnt)
1959 return 0;
1960
1959 ret = tracing_update_buffers();
1961 ret = tracing_update_buffers(tr);
1960 if (ret < 0)
1961 return ret;
1962
1963 mutex_lock(&event_mutex);
1964
1965 if (type == TRACE_PIDS) {
1966 filtered_pids = rcu_dereference_protected(tr->filtered_pids,
1967 lockdep_is_held(&event_mutex));

--- 307 unchanged lines hidden (view full) ---

2275 return system;
2276
2277 out_free:
2278 kfree_const(system->name);
2279 kfree(system);
2280 return NULL;
2281}
2282
1962 if (ret < 0)
1963 return ret;
1964
1965 mutex_lock(&event_mutex);
1966
1967 if (type == TRACE_PIDS) {
1968 filtered_pids = rcu_dereference_protected(tr->filtered_pids,
1969 lockdep_is_held(&event_mutex));

--- 307 unchanged lines hidden (view full) ---

2277 return system;
2278
2279 out_free:
2280 kfree_const(system->name);
2281 kfree(system);
2282 return NULL;
2283}
2284
2283static struct eventfs_file *
2285int system_callback(const char *name, umode_t *mode, void **data,
2286 const struct file_operations **fops)
2287{
2288 if (strcmp(name, "filter") == 0)
2289 *fops = &ftrace_subsystem_filter_fops;
2290
2291 else if (strcmp(name, "enable") == 0)
2292 *fops = &ftrace_system_enable_fops;
2293
2294 else
2295 return 0;
2296
2297 *mode = TRACE_MODE_WRITE;
2298 return 1;
2299}
2300
2301static struct eventfs_inode *
2284event_subsystem_dir(struct trace_array *tr, const char *name,
2302event_subsystem_dir(struct trace_array *tr, const char *name,
2285 struct trace_event_file *file, struct dentry *parent)
2303 struct trace_event_file *file, struct eventfs_inode *parent)
2286{
2287 struct event_subsystem *system, *iter;
2288 struct trace_subsystem_dir *dir;
2304{
2305 struct event_subsystem *system, *iter;
2306 struct trace_subsystem_dir *dir;
2289 struct eventfs_file *ef;
2290 int res;
2307 struct eventfs_inode *ei;
2308 int nr_entries;
2309 static struct eventfs_entry system_entries[] = {
2310 {
2311 .name = "filter",
2312 .callback = system_callback,
2313 },
2314 {
2315 .name = "enable",
2316 .callback = system_callback,
2317 }
2318 };
2291
2292 /* First see if we did not already create this dir */
2293 list_for_each_entry(dir, &tr->systems, list) {
2294 system = dir->subsystem;
2295 if (strcmp(system->name, name) == 0) {
2296 dir->nr_events++;
2297 file->system = dir;
2319
2320 /* First see if we did not already create this dir */
2321 list_for_each_entry(dir, &tr->systems, list) {
2322 system = dir->subsystem;
2323 if (strcmp(system->name, name) == 0) {
2324 dir->nr_events++;
2325 file->system = dir;
2298 return dir->ef;
2326 return dir->ei;
2299 }
2300 }
2301
2302 /* Now see if the system itself exists. */
2303 system = NULL;
2304 list_for_each_entry(iter, &event_subsystems, list) {
2305 if (strcmp(iter->name, name) == 0) {
2306 system = iter;

--- 7 unchanged lines hidden (view full) ---

2314
2315 if (!system) {
2316 system = create_new_subsystem(name);
2317 if (!system)
2318 goto out_free;
2319 } else
2320 __get_system(system);
2321
2327 }
2328 }
2329
2330 /* Now see if the system itself exists. */
2331 system = NULL;
2332 list_for_each_entry(iter, &event_subsystems, list) {
2333 if (strcmp(iter->name, name) == 0) {
2334 system = iter;

--- 7 unchanged lines hidden (view full) ---

2342
2343 if (!system) {
2344 system = create_new_subsystem(name);
2345 if (!system)
2346 goto out_free;
2347 } else
2348 __get_system(system);
2349
2322 ef = eventfs_add_subsystem_dir(name, parent);
2323 if (IS_ERR(ef)) {
2350 /* ftrace only has directories no files */
2351 if (strcmp(name, "ftrace") == 0)
2352 nr_entries = 0;
2353 else
2354 nr_entries = ARRAY_SIZE(system_entries);
2355
2356 ei = eventfs_create_dir(name, parent, system_entries, nr_entries, dir);
2357 if (!ei) {
2324 pr_warn("Failed to create system directory %s\n", name);
2325 __put_system(system);
2326 goto out_free;
2327 }
2328
2358 pr_warn("Failed to create system directory %s\n", name);
2359 __put_system(system);
2360 goto out_free;
2361 }
2362
2329 dir->ef = ef;
2363 dir->ei = ei;
2330 dir->tr = tr;
2331 dir->ref_count = 1;
2332 dir->nr_events = 1;
2333 dir->subsystem = system;
2334 file->system = dir;
2335
2364 dir->tr = tr;
2365 dir->ref_count = 1;
2366 dir->nr_events = 1;
2367 dir->subsystem = system;
2368 file->system = dir;
2369
2336 /* the ftrace system is special, do not create enable or filter files */
2337 if (strcmp(name, "ftrace") != 0) {
2338
2339 res = eventfs_add_file("filter", TRACE_MODE_WRITE,
2340 dir->ef, dir,
2341 &ftrace_subsystem_filter_fops);
2342 if (res) {
2343 kfree(system->filter);
2344 system->filter = NULL;
2345 pr_warn("Could not create tracefs '%s/filter' entry\n", name);
2346 }
2347
2348 eventfs_add_file("enable", TRACE_MODE_WRITE, dir->ef, dir,
2349 &ftrace_system_enable_fops);
2350 }
2351
2352 list_add(&dir->list, &tr->systems);
2353
2370 list_add(&dir->list, &tr->systems);
2371
2354 return dir->ef;
2372 return dir->ei;
2355
2356 out_free:
2357 kfree(dir);
2358 out_fail:
2359 /* Only print this message if failed on memory allocation */
2360 if (!dir || !system)
2361 pr_warn("No memory to create event subsystem %s\n", name);
2362 return NULL;

--- 32 unchanged lines hidden (view full) ---

2395
2396 offset += field->size;
2397 }
2398 }
2399
2400 return ret;
2401}
2402
2373
2374 out_free:
2375 kfree(dir);
2376 out_fail:
2377 /* Only print this message if failed on memory allocation */
2378 if (!dir || !system)
2379 pr_warn("No memory to create event subsystem %s\n", name);
2380 return NULL;

--- 32 unchanged lines hidden (view full) ---

2413
2414 offset += field->size;
2415 }
2416 }
2417
2418 return ret;
2419}
2420
2421static int event_callback(const char *name, umode_t *mode, void **data,
2422 const struct file_operations **fops)
2423{
2424 struct trace_event_file *file = *data;
2425 struct trace_event_call *call = file->event_call;
2426
2427 if (strcmp(name, "format") == 0) {
2428 *mode = TRACE_MODE_READ;
2429 *fops = &ftrace_event_format_fops;
2430 *data = call;
2431 return 1;
2432 }
2433
2434 /*
2435 * Only event directories that can be enabled should have
2436 * triggers or filters, with the exception of the "print"
2437 * event that can have a "trigger" file.
2438 */
2439 if (!(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE)) {
2440 if (call->class->reg && strcmp(name, "enable") == 0) {
2441 *mode = TRACE_MODE_WRITE;
2442 *fops = &ftrace_enable_fops;
2443 return 1;
2444 }
2445
2446 if (strcmp(name, "filter") == 0) {
2447 *mode = TRACE_MODE_WRITE;
2448 *fops = &ftrace_event_filter_fops;
2449 return 1;
2450 }
2451 }
2452
2453 if (!(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE) ||
2454 strcmp(trace_event_name(call), "print") == 0) {
2455 if (strcmp(name, "trigger") == 0) {
2456 *mode = TRACE_MODE_WRITE;
2457 *fops = &event_trigger_fops;
2458 return 1;
2459 }
2460 }
2461
2462#ifdef CONFIG_PERF_EVENTS
2463 if (call->event.type && call->class->reg &&
2464 strcmp(name, "id") == 0) {
2465 *mode = TRACE_MODE_READ;
2466 *data = (void *)(long)call->event.type;
2467 *fops = &ftrace_event_id_fops;
2468 return 1;
2469 }
2470#endif
2471
2472#ifdef CONFIG_HIST_TRIGGERS
2473 if (strcmp(name, "hist") == 0) {
2474 *mode = TRACE_MODE_READ;
2475 *fops = &event_hist_fops;
2476 return 1;
2477 }
2478#endif
2479#ifdef CONFIG_HIST_TRIGGERS_DEBUG
2480 if (strcmp(name, "hist_debug") == 0) {
2481 *mode = TRACE_MODE_READ;
2482 *fops = &event_hist_debug_fops;
2483 return 1;
2484 }
2485#endif
2486#ifdef CONFIG_TRACE_EVENT_INJECT
2487 if (call->event.type && call->class->reg &&
2488 strcmp(name, "inject") == 0) {
2489 *mode = 0200;
2490 *fops = &event_inject_fops;
2491 return 1;
2492 }
2493#endif
2494 return 0;
2495}
2496
2403static int
2497static int
2404event_create_dir(struct dentry *parent, struct trace_event_file *file)
2498event_create_dir(struct eventfs_inode *parent, struct trace_event_file *file)
2405{
2406 struct trace_event_call *call = file->event_call;
2499{
2500 struct trace_event_call *call = file->event_call;
2407 struct eventfs_file *ef_subsystem = NULL;
2408 struct trace_array *tr = file->tr;
2501 struct trace_array *tr = file->tr;
2409 struct eventfs_file *ef;
2502 struct eventfs_inode *e_events;
2503 struct eventfs_inode *ei;
2410 const char *name;
2504 const char *name;
2505 int nr_entries;
2411 int ret;
2506 int ret;
2507 static struct eventfs_entry event_entries[] = {
2508 {
2509 .name = "enable",
2510 .callback = event_callback,
2511 },
2512 {
2513 .name = "filter",
2514 .callback = event_callback,
2515 },
2516 {
2517 .name = "trigger",
2518 .callback = event_callback,
2519 },
2520 {
2521 .name = "format",
2522 .callback = event_callback,
2523 },
2524#ifdef CONFIG_PERF_EVENTS
2525 {
2526 .name = "id",
2527 .callback = event_callback,
2528 },
2529#endif
2530#ifdef CONFIG_HIST_TRIGGERS
2531 {
2532 .name = "hist",
2533 .callback = event_callback,
2534 },
2535#endif
2536#ifdef CONFIG_HIST_TRIGGERS_DEBUG
2537 {
2538 .name = "hist_debug",
2539 .callback = event_callback,
2540 },
2541#endif
2542#ifdef CONFIG_TRACE_EVENT_INJECT
2543 {
2544 .name = "inject",
2545 .callback = event_callback,
2546 },
2547#endif
2548 };
2412
2413 /*
2414 * If the trace point header did not define TRACE_SYSTEM
2415 * then the system would be called "TRACE_SYSTEM". This should
2416 * never happen.
2417 */
2418 if (WARN_ON_ONCE(strcmp(call->class->system, TRACE_SYSTEM) == 0))
2419 return -ENODEV;
2420
2549
2550 /*
2551 * If the trace point header did not define TRACE_SYSTEM
2552 * then the system would be called "TRACE_SYSTEM". This should
2553 * never happen.
2554 */
2555 if (WARN_ON_ONCE(strcmp(call->class->system, TRACE_SYSTEM) == 0))
2556 return -ENODEV;
2557
2421 ef_subsystem = event_subsystem_dir(tr, call->class->system, file, parent);
2422 if (!ef_subsystem)
2558 e_events = event_subsystem_dir(tr, call->class->system, file, parent);
2559 if (!e_events)
2423 return -ENOMEM;
2424
2560 return -ENOMEM;
2561
2562 nr_entries = ARRAY_SIZE(event_entries);
2563
2425 name = trace_event_name(call);
2564 name = trace_event_name(call);
2426 ef = eventfs_add_dir(name, ef_subsystem);
2427 if (IS_ERR(ef)) {
2565 ei = eventfs_create_dir(name, e_events, event_entries, nr_entries, file);
2566 if (IS_ERR(ei)) {
2428 pr_warn("Could not create tracefs '%s' directory\n", name);
2429 return -1;
2430 }
2431
2567 pr_warn("Could not create tracefs '%s' directory\n", name);
2568 return -1;
2569 }
2570
2432 file->ef = ef;
2571 file->ei = ei;
2433
2572
2434 if (call->class->reg && !(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE))
2435 eventfs_add_file("enable", TRACE_MODE_WRITE, file->ef, file,
2436 &ftrace_enable_fops);
2437
2438#ifdef CONFIG_PERF_EVENTS
2439 if (call->event.type && call->class->reg)
2440 eventfs_add_file("id", TRACE_MODE_READ, file->ef,
2441 (void *)(long)call->event.type,
2442 &ftrace_event_id_fops);
2443#endif
2444
2445 ret = event_define_fields(call);
2446 if (ret < 0) {
2447 pr_warn("Could not initialize trace point events/%s\n", name);
2448 return ret;
2449 }
2450
2573 ret = event_define_fields(call);
2574 if (ret < 0) {
2575 pr_warn("Could not initialize trace point events/%s\n", name);
2576 return ret;
2577 }
2578
2451 /*
2452 * Only event directories that can be enabled should have
2453 * triggers or filters.
2454 */
2455 if (!(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE)) {
2456 eventfs_add_file("filter", TRACE_MODE_WRITE, file->ef,
2457 file, &ftrace_event_filter_fops);
2458
2459 eventfs_add_file("trigger", TRACE_MODE_WRITE, file->ef,
2460 file, &event_trigger_fops);
2461 }
2462
2463#ifdef CONFIG_HIST_TRIGGERS
2464 eventfs_add_file("hist", TRACE_MODE_READ, file->ef, file,
2465 &event_hist_fops);
2466#endif
2467#ifdef CONFIG_HIST_TRIGGERS_DEBUG
2468 eventfs_add_file("hist_debug", TRACE_MODE_READ, file->ef, file,
2469 &event_hist_debug_fops);
2470#endif
2471 eventfs_add_file("format", TRACE_MODE_READ, file->ef, call,
2472 &ftrace_event_format_fops);
2473
2474#ifdef CONFIG_TRACE_EVENT_INJECT
2475 if (call->event.type && call->class->reg)
2476 eventfs_add_file("inject", 0200, file->ef, file,
2477 &event_inject_fops);
2478#endif
2479
2480 return 0;
2481}
2482
2483static void remove_event_from_tracers(struct trace_event_call *call)
2484{
2485 struct trace_event_file *file;
2486 struct trace_array *tr;
2487

--- 277 unchanged lines hidden (view full) ---

2765 if (first) {
2766 last_i = i;
2767 first = false;
2768 }
2769 update_event_printk(call, map[i]);
2770 update_event_fields(call, map[i]);
2771 }
2772 }
2579 return 0;
2580}
2581
2582static void remove_event_from_tracers(struct trace_event_call *call)
2583{
2584 struct trace_event_file *file;
2585 struct trace_array *tr;
2586

--- 277 unchanged lines hidden (view full) ---

2864 if (first) {
2865 last_i = i;
2866 first = false;
2867 }
2868 update_event_printk(call, map[i]);
2869 update_event_fields(call, map[i]);
2870 }
2871 }
2872 cond_resched();
2773 }
2774 up_write(&trace_event_sem);
2775}
2776
2777static struct trace_event_file *
2778trace_create_new_event(struct trace_event_call *call,
2779 struct trace_array *tr)
2780{

--- 37 unchanged lines hidden (view full) ---

2818
2819static __init int setup_trace_triggers(char *str)
2820{
2821 char *trigger;
2822 char *buf;
2823 int i;
2824
2825 strscpy(bootup_trigger_buf, str, COMMAND_LINE_SIZE);
2873 }
2874 up_write(&trace_event_sem);
2875}
2876
2877static struct trace_event_file *
2878trace_create_new_event(struct trace_event_call *call,
2879 struct trace_array *tr)
2880{

--- 37 unchanged lines hidden (view full) ---

2918
2919static __init int setup_trace_triggers(char *str)
2920{
2921 char *trigger;
2922 char *buf;
2923 int i;
2924
2925 strscpy(bootup_trigger_buf, str, COMMAND_LINE_SIZE);
2826 ring_buffer_expanded = true;
2926 trace_set_ring_buffer_expanded(NULL);
2827 disable_tracing_selftest("running event triggers");
2828
2829 buf = bootup_trigger_buf;
2830 for (i = 0; i < MAX_BOOT_TRIGGERS; i++) {
2831 trigger = strsep(&buf, ",");
2832 if (!trigger)
2833 break;
2834 bootup_triggers[i].event = strsep(&trigger, ".");

--- 773 unchanged lines hidden (view full) ---

3608extern struct trace_event_call *__start_ftrace_events[];
3609extern struct trace_event_call *__stop_ftrace_events[];
3610
3611static char bootup_event_buf[COMMAND_LINE_SIZE] __initdata;
3612
3613static __init int setup_trace_event(char *str)
3614{
3615 strscpy(bootup_event_buf, str, COMMAND_LINE_SIZE);
2927 disable_tracing_selftest("running event triggers");
2928
2929 buf = bootup_trigger_buf;
2930 for (i = 0; i < MAX_BOOT_TRIGGERS; i++) {
2931 trigger = strsep(&buf, ",");
2932 if (!trigger)
2933 break;
2934 bootup_triggers[i].event = strsep(&trigger, ".");

--- 773 unchanged lines hidden (view full) ---

3708extern struct trace_event_call *__start_ftrace_events[];
3709extern struct trace_event_call *__stop_ftrace_events[];
3710
3711static char bootup_event_buf[COMMAND_LINE_SIZE] __initdata;
3712
3713static __init int setup_trace_event(char *str)
3714{
3715 strscpy(bootup_event_buf, str, COMMAND_LINE_SIZE);
3616 ring_buffer_expanded = true;
3716 trace_set_ring_buffer_expanded(NULL);
3617 disable_tracing_selftest("running event tracing");
3618
3619 return 1;
3620}
3621__setup("trace_event=", setup_trace_event);
3622
3717 disable_tracing_selftest("running event tracing");
3718
3719 return 1;
3720}
3721__setup("trace_event=", setup_trace_event);
3722
3723static int events_callback(const char *name, umode_t *mode, void **data,
3724 const struct file_operations **fops)
3725{
3726 if (strcmp(name, "enable") == 0) {
3727 *mode = TRACE_MODE_WRITE;
3728 *fops = &ftrace_tr_enable_fops;
3729 return 1;
3730 }
3731
3732 if (strcmp(name, "header_page") == 0)
3733 *data = ring_buffer_print_page_header;
3734
3735 else if (strcmp(name, "header_event") == 0)
3736 *data = ring_buffer_print_entry_header;
3737
3738 else
3739 return 0;
3740
3741 *mode = TRACE_MODE_READ;
3742 *fops = &ftrace_show_header_fops;
3743 return 1;
3744}
3745
3623/* Expects to have event_mutex held when called */
3624static int
3625create_event_toplevel_files(struct dentry *parent, struct trace_array *tr)
3626{
3746/* Expects to have event_mutex held when called */
3747static int
3748create_event_toplevel_files(struct dentry *parent, struct trace_array *tr)
3749{
3627 struct dentry *d_events;
3750 struct eventfs_inode *e_events;
3628 struct dentry *entry;
3751 struct dentry *entry;
3629 int error = 0;
3752 int nr_entries;
3753 static struct eventfs_entry events_entries[] = {
3754 {
3755 .name = "enable",
3756 .callback = events_callback,
3757 },
3758 {
3759 .name = "header_page",
3760 .callback = events_callback,
3761 },
3762 {
3763 .name = "header_event",
3764 .callback = events_callback,
3765 },
3766 };
3630
3631 entry = trace_create_file("set_event", TRACE_MODE_WRITE, parent,
3632 tr, &ftrace_set_event_fops);
3633 if (!entry)
3634 return -ENOMEM;
3635
3767
3768 entry = trace_create_file("set_event", TRACE_MODE_WRITE, parent,
3769 tr, &ftrace_set_event_fops);
3770 if (!entry)
3771 return -ENOMEM;
3772
3636 d_events = eventfs_create_events_dir("events", parent);
3637 if (IS_ERR(d_events)) {
3773 nr_entries = ARRAY_SIZE(events_entries);
3774
3775 e_events = eventfs_create_events_dir("events", parent, events_entries,
3776 nr_entries, tr);
3777 if (IS_ERR(e_events)) {
3638 pr_warn("Could not create tracefs 'events' directory\n");
3639 return -ENOMEM;
3640 }
3641
3778 pr_warn("Could not create tracefs 'events' directory\n");
3779 return -ENOMEM;
3780 }
3781
3642 error = eventfs_add_events_file("enable", TRACE_MODE_WRITE, d_events,
3643 tr, &ftrace_tr_enable_fops);
3644 if (error)
3645 return -ENOMEM;
3646
3647 /* There are not as crucial, just warn if they are not created */
3648
3649 trace_create_file("set_event_pid", TRACE_MODE_WRITE, parent,
3650 tr, &ftrace_set_event_pid_fops);
3651
3652 trace_create_file("set_event_notrace_pid",
3653 TRACE_MODE_WRITE, parent, tr,
3654 &ftrace_set_event_notrace_pid_fops);
3655
3782 /* There are not as crucial, just warn if they are not created */
3783
3784 trace_create_file("set_event_pid", TRACE_MODE_WRITE, parent,
3785 tr, &ftrace_set_event_pid_fops);
3786
3787 trace_create_file("set_event_notrace_pid",
3788 TRACE_MODE_WRITE, parent, tr,
3789 &ftrace_set_event_notrace_pid_fops);
3790
3656 /* ring buffer internal formats */
3657 eventfs_add_events_file("header_page", TRACE_MODE_READ, d_events,
3658 ring_buffer_print_page_header,
3659 &ftrace_show_header_fops);
3791 tr->event_dir = e_events;
3660
3792
3661 eventfs_add_events_file("header_event", TRACE_MODE_READ, d_events,
3662 ring_buffer_print_entry_header,
3663 &ftrace_show_header_fops);
3664
3665 tr->event_dir = d_events;
3666
3667 return 0;
3668}
3669
3670/**
3671 * event_trace_add_tracer - add a instance of a trace_array to events
3672 * @parent: The parent dentry to place the files/directories for events in
3673 * @tr: The trace array associated with these events
3674 *

--- 66 unchanged lines hidden (view full) ---

3741 /* Disable any running events */
3742 __ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0);
3743
3744 /* Make sure no more events are being executed */
3745 tracepoint_synchronize_unregister();
3746
3747 down_write(&trace_event_sem);
3748 __trace_remove_event_dirs(tr);
3793 return 0;
3794}
3795
3796/**
3797 * event_trace_add_tracer - add a instance of a trace_array to events
3798 * @parent: The parent dentry to place the files/directories for events in
3799 * @tr: The trace array associated with these events
3800 *

--- 66 unchanged lines hidden (view full) ---

3867 /* Disable any running events */
3868 __ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0);
3869
3870 /* Make sure no more events are being executed */
3871 tracepoint_synchronize_unregister();
3872
3873 down_write(&trace_event_sem);
3874 __trace_remove_event_dirs(tr);
3749 eventfs_remove_events_dir(tr->event_dir);
3875 eventfs_remove_dir(tr->event_dir);
3750 up_write(&trace_event_sem);
3751
3752 tr->event_dir = NULL;
3753
3754 return 0;
3755}
3756
3757static __init int event_trace_memsetup(void)

--- 392 unchanged lines hidden ---
3876 up_write(&trace_event_sem);
3877
3878 tr->event_dir = NULL;
3879
3880 return 0;
3881}
3882
3883static __init int event_trace_memsetup(void)

--- 392 unchanged lines hidden ---