diff options
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/ftrace.c | 2 | ||||
| -rw-r--r-- | kernel/trace/trace_event_perf.c | 8 | ||||
| -rw-r--r-- | kernel/trace/trace_events.c | 3 | ||||
| -rw-r--r-- | kernel/trace/trace_syscalls.c | 10 |
4 files changed, 11 insertions, 12 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 0e9f9eaade2f..72a0f81dc5a8 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -775,7 +775,7 @@ static int ftrace_profile_init(void) | |||
| 775 | int cpu; | 775 | int cpu; |
| 776 | int ret = 0; | 776 | int ret = 0; |
| 777 | 777 | ||
| 778 | for_each_online_cpu(cpu) { | 778 | for_each_possible_cpu(cpu) { |
| 779 | ret = ftrace_profile_init_cpu(cpu); | 779 | ret = ftrace_profile_init_cpu(cpu); |
| 780 | if (ret) | 780 | if (ret) |
| 781 | break; | 781 | break; |
diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c index 78e27e3b52ac..e854f420e033 100644 --- a/kernel/trace/trace_event_perf.c +++ b/kernel/trace/trace_event_perf.c | |||
| @@ -24,6 +24,12 @@ static int total_ref_count; | |||
| 24 | static int perf_trace_event_perm(struct ftrace_event_call *tp_event, | 24 | static int perf_trace_event_perm(struct ftrace_event_call *tp_event, |
| 25 | struct perf_event *p_event) | 25 | struct perf_event *p_event) |
| 26 | { | 26 | { |
| 27 | if (tp_event->perf_perm) { | ||
| 28 | int ret = tp_event->perf_perm(tp_event, p_event); | ||
| 29 | if (ret) | ||
| 30 | return ret; | ||
| 31 | } | ||
| 32 | |||
| 27 | /* The ftrace function trace is allowed only for root. */ | 33 | /* The ftrace function trace is allowed only for root. */ |
| 28 | if (ftrace_event_is_function(tp_event) && | 34 | if (ftrace_event_is_function(tp_event) && |
| 29 | perf_paranoid_tracepoint_raw() && !capable(CAP_SYS_ADMIN)) | 35 | perf_paranoid_tracepoint_raw() && !capable(CAP_SYS_ADMIN)) |
| @@ -173,7 +179,7 @@ static int perf_trace_event_init(struct ftrace_event_call *tp_event, | |||
| 173 | int perf_trace_init(struct perf_event *p_event) | 179 | int perf_trace_init(struct perf_event *p_event) |
| 174 | { | 180 | { |
| 175 | struct ftrace_event_call *tp_event; | 181 | struct ftrace_event_call *tp_event; |
| 176 | int event_id = p_event->attr.config; | 182 | u64 event_id = p_event->attr.config; |
| 177 | int ret = -EINVAL; | 183 | int ret = -EINVAL; |
| 178 | 184 | ||
| 179 | mutex_lock(&event_mutex); | 185 | mutex_lock(&event_mutex); |
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index f919a2e21bf3..a11800ae96de 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
| @@ -2314,6 +2314,9 @@ int event_trace_del_tracer(struct trace_array *tr) | |||
| 2314 | /* Disable any running events */ | 2314 | /* Disable any running events */ |
| 2315 | __ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0); | 2315 | __ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0); |
| 2316 | 2316 | ||
| 2317 | /* Access to events are within rcu_read_lock_sched() */ | ||
| 2318 | synchronize_sched(); | ||
| 2319 | |||
| 2317 | down_write(&trace_event_sem); | 2320 | down_write(&trace_event_sem); |
| 2318 | __trace_remove_event_dirs(tr); | 2321 | __trace_remove_event_dirs(tr); |
| 2319 | debugfs_remove_recursive(tr->event_dir); | 2322 | debugfs_remove_recursive(tr->event_dir); |
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index e4b6d11bdf78..ea90eb5f6f17 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
| @@ -431,11 +431,6 @@ static void unreg_event_syscall_enter(struct ftrace_event_file *file, | |||
| 431 | if (!tr->sys_refcount_enter) | 431 | if (!tr->sys_refcount_enter) |
| 432 | unregister_trace_sys_enter(ftrace_syscall_enter, tr); | 432 | unregister_trace_sys_enter(ftrace_syscall_enter, tr); |
| 433 | mutex_unlock(&syscall_trace_lock); | 433 | mutex_unlock(&syscall_trace_lock); |
| 434 | /* | ||
| 435 | * Callers expect the event to be completely disabled on | ||
| 436 | * return, so wait for current handlers to finish. | ||
| 437 | */ | ||
| 438 | synchronize_sched(); | ||
| 439 | } | 434 | } |
| 440 | 435 | ||
| 441 | static int reg_event_syscall_exit(struct ftrace_event_file *file, | 436 | static int reg_event_syscall_exit(struct ftrace_event_file *file, |
| @@ -474,11 +469,6 @@ static void unreg_event_syscall_exit(struct ftrace_event_file *file, | |||
| 474 | if (!tr->sys_refcount_exit) | 469 | if (!tr->sys_refcount_exit) |
| 475 | unregister_trace_sys_exit(ftrace_syscall_exit, tr); | 470 | unregister_trace_sys_exit(ftrace_syscall_exit, tr); |
| 476 | mutex_unlock(&syscall_trace_lock); | 471 | mutex_unlock(&syscall_trace_lock); |
| 477 | /* | ||
| 478 | * Callers expect the event to be completely disabled on | ||
| 479 | * return, so wait for current handlers to finish. | ||
| 480 | */ | ||
| 481 | synchronize_sched(); | ||
| 482 | } | 472 | } |
| 483 | 473 | ||
| 484 | static int __init init_syscall_trace(struct ftrace_event_call *call) | 474 | static int __init init_syscall_trace(struct ftrace_event_call *call) |
