diff options
| author | Ingo Molnar <mingo@elte.hu> | 2011-02-17 08:11:15 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2011-02-17 08:11:15 -0500 |
| commit | 5beda5f6e4e4523e8dbe596bf163a01b45776808 (patch) | |
| tree | 61d1551430687b712325cdfec81b7800aa759076 /kernel/trace | |
| parent | ba3dd36c6775264ee6e7354ba1aabcd6e86d7298 (diff) | |
| parent | 6752ab4a9c30d5411b2dfdb251a3f1cb18aae487 (diff) | |
Merge branch 'tip/perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into perf/core
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/ring_buffer.c | 8 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 4 | ||||
| -rw-r--r-- | kernel/trace/trace_sched_switch.c | 48 | ||||
| -rw-r--r-- | kernel/trace/trace_syscalls.c | 42 |
4 files changed, 40 insertions, 62 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index bd1c35a4fbcc..7739893a1d0a 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -2163,10 +2163,14 @@ rb_reserve_next_event(struct ring_buffer *buffer, | |||
| 2163 | delta = diff; | 2163 | delta = diff; |
| 2164 | if (unlikely(test_time_stamp(delta))) { | 2164 | if (unlikely(test_time_stamp(delta))) { |
| 2165 | WARN_ONCE(delta > (1ULL << 59), | 2165 | WARN_ONCE(delta > (1ULL << 59), |
| 2166 | KERN_WARNING "Delta way too big! %llu ts=%llu write stamp = %llu\n", | 2166 | KERN_WARNING "Delta way too big! %llu ts=%llu write stamp = %llu\n%s", |
| 2167 | (unsigned long long)delta, | 2167 | (unsigned long long)delta, |
| 2168 | (unsigned long long)ts, | 2168 | (unsigned long long)ts, |
| 2169 | (unsigned long long)cpu_buffer->write_stamp); | 2169 | (unsigned long long)cpu_buffer->write_stamp, |
| 2170 | sched_clock_stable ? "" : | ||
| 2171 | "If you just came from a suspend/resume,\n" | ||
| 2172 | "please switch to the trace global clock:\n" | ||
| 2173 | " echo global > /sys/kernel/debug/tracing/trace_clock\n"); | ||
| 2170 | add_timestamp = 1; | 2174 | add_timestamp = 1; |
| 2171 | } | 2175 | } |
| 2172 | } | 2176 | } |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index dc53ecb80589..8dc8da6733f9 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -2710,6 +2710,10 @@ tracing_ctrl_write(struct file *filp, const char __user *ubuf, | |||
| 2710 | 2710 | ||
| 2711 | mutex_lock(&trace_types_lock); | 2711 | mutex_lock(&trace_types_lock); |
| 2712 | if (tracer_enabled ^ val) { | 2712 | if (tracer_enabled ^ val) { |
| 2713 | |||
| 2714 | /* Only need to warn if this is used to change the state */ | ||
| 2715 | WARN_ONCE(1, "tracing_enabled is deprecated. Use tracing_on"); | ||
| 2716 | |||
| 2713 | if (val) { | 2717 | if (val) { |
| 2714 | tracer_enabled = 1; | 2718 | tracer_enabled = 1; |
| 2715 | if (current_trace->start) | 2719 | if (current_trace->start) |
diff --git a/kernel/trace/trace_sched_switch.c b/kernel/trace/trace_sched_switch.c index 8f758d070c43..7e62c0a18456 100644 --- a/kernel/trace/trace_sched_switch.c +++ b/kernel/trace/trace_sched_switch.c | |||
| @@ -247,51 +247,3 @@ void tracing_sched_switch_assign_trace(struct trace_array *tr) | |||
| 247 | ctx_trace = tr; | 247 | ctx_trace = tr; |
| 248 | } | 248 | } |
| 249 | 249 | ||
| 250 | static void stop_sched_trace(struct trace_array *tr) | ||
| 251 | { | ||
| 252 | tracing_stop_sched_switch_record(); | ||
| 253 | } | ||
| 254 | |||
| 255 | static int sched_switch_trace_init(struct trace_array *tr) | ||
| 256 | { | ||
| 257 | ctx_trace = tr; | ||
| 258 | tracing_reset_online_cpus(tr); | ||
| 259 | tracing_start_sched_switch_record(); | ||
| 260 | return 0; | ||
| 261 | } | ||
| 262 | |||
| 263 | static void sched_switch_trace_reset(struct trace_array *tr) | ||
| 264 | { | ||
| 265 | if (sched_ref) | ||
| 266 | stop_sched_trace(tr); | ||
| 267 | } | ||
| 268 | |||
| 269 | static void sched_switch_trace_start(struct trace_array *tr) | ||
| 270 | { | ||
| 271 | sched_stopped = 0; | ||
| 272 | } | ||
| 273 | |||
| 274 | static void sched_switch_trace_stop(struct trace_array *tr) | ||
| 275 | { | ||
| 276 | sched_stopped = 1; | ||
| 277 | } | ||
| 278 | |||
| 279 | static struct tracer sched_switch_trace __read_mostly = | ||
| 280 | { | ||
| 281 | .name = "sched_switch", | ||
| 282 | .init = sched_switch_trace_init, | ||
| 283 | .reset = sched_switch_trace_reset, | ||
| 284 | .start = sched_switch_trace_start, | ||
| 285 | .stop = sched_switch_trace_stop, | ||
| 286 | .wait_pipe = poll_wait_pipe, | ||
| 287 | #ifdef CONFIG_FTRACE_SELFTEST | ||
| 288 | .selftest = trace_selftest_startup_sched_switch, | ||
| 289 | #endif | ||
| 290 | }; | ||
| 291 | |||
| 292 | __init static int init_sched_switch_trace(void) | ||
| 293 | { | ||
| 294 | return register_tracer(&sched_switch_trace); | ||
| 295 | } | ||
| 296 | device_initcall(init_sched_switch_trace); | ||
| 297 | |||
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index 5c9fe08d2093..ee7b5a0bb9f8 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
| @@ -60,6 +60,19 @@ extern struct syscall_metadata *__stop_syscalls_metadata[]; | |||
| 60 | 60 | ||
| 61 | static struct syscall_metadata **syscalls_metadata; | 61 | static struct syscall_metadata **syscalls_metadata; |
| 62 | 62 | ||
| 63 | #ifndef ARCH_HAS_SYSCALL_MATCH_SYM_NAME | ||
| 64 | static inline bool arch_syscall_match_sym_name(const char *sym, const char *name) | ||
| 65 | { | ||
| 66 | /* | ||
| 67 | * Only compare after the "sys" prefix. Archs that use | ||
| 68 | * syscall wrappers may have syscalls symbols aliases prefixed | ||
| 69 | * with "SyS" instead of "sys", leading to an unwanted | ||
| 70 | * mismatch. | ||
| 71 | */ | ||
| 72 | return !strcmp(sym + 3, name + 3); | ||
| 73 | } | ||
| 74 | #endif | ||
| 75 | |||
| 63 | static __init struct syscall_metadata * | 76 | static __init struct syscall_metadata * |
| 64 | find_syscall_meta(unsigned long syscall) | 77 | find_syscall_meta(unsigned long syscall) |
| 65 | { | 78 | { |
| @@ -72,14 +85,11 @@ find_syscall_meta(unsigned long syscall) | |||
| 72 | stop = __stop_syscalls_metadata; | 85 | stop = __stop_syscalls_metadata; |
| 73 | kallsyms_lookup(syscall, NULL, NULL, NULL, str); | 86 | kallsyms_lookup(syscall, NULL, NULL, NULL, str); |
| 74 | 87 | ||
| 88 | if (arch_syscall_match_sym_name(str, "sys_ni_syscall")) | ||
| 89 | return NULL; | ||
| 90 | |||
| 75 | for ( ; start < stop; start++) { | 91 | for ( ; start < stop; start++) { |
| 76 | /* | 92 | if ((*start)->name && arch_syscall_match_sym_name(str, (*start)->name)) |
| 77 | * Only compare after the "sys" prefix. Archs that use | ||
| 78 | * syscall wrappers may have syscalls symbols aliases prefixed | ||
| 79 | * with "SyS" instead of "sys", leading to an unwanted | ||
| 80 | * mismatch. | ||
| 81 | */ | ||
| 82 | if ((*start)->name && !strcmp((*start)->name + 3, str + 3)) | ||
| 83 | return *start; | 93 | return *start; |
| 84 | } | 94 | } |
| 85 | return NULL; | 95 | return NULL; |
| @@ -359,7 +369,7 @@ int reg_event_syscall_enter(struct ftrace_event_call *call) | |||
| 359 | int num; | 369 | int num; |
| 360 | 370 | ||
| 361 | num = ((struct syscall_metadata *)call->data)->syscall_nr; | 371 | num = ((struct syscall_metadata *)call->data)->syscall_nr; |
| 362 | if (num < 0 || num >= NR_syscalls) | 372 | if (WARN_ON_ONCE(num < 0 || num >= NR_syscalls)) |
| 363 | return -ENOSYS; | 373 | return -ENOSYS; |
| 364 | mutex_lock(&syscall_trace_lock); | 374 | mutex_lock(&syscall_trace_lock); |
| 365 | if (!sys_refcount_enter) | 375 | if (!sys_refcount_enter) |
| @@ -377,7 +387,7 @@ void unreg_event_syscall_enter(struct ftrace_event_call *call) | |||
| 377 | int num; | 387 | int num; |
| 378 | 388 | ||
| 379 | num = ((struct syscall_metadata *)call->data)->syscall_nr; | 389 | num = ((struct syscall_metadata *)call->data)->syscall_nr; |
| 380 | if (num < 0 || num >= NR_syscalls) | 390 | if (WARN_ON_ONCE(num < 0 || num >= NR_syscalls)) |
| 381 | return; | 391 | return; |
| 382 | mutex_lock(&syscall_trace_lock); | 392 | mutex_lock(&syscall_trace_lock); |
| 383 | sys_refcount_enter--; | 393 | sys_refcount_enter--; |
| @@ -393,7 +403,7 @@ int reg_event_syscall_exit(struct ftrace_event_call *call) | |||
| 393 | int num; | 403 | int num; |
| 394 | 404 | ||
| 395 | num = ((struct syscall_metadata *)call->data)->syscall_nr; | 405 | num = ((struct syscall_metadata *)call->data)->syscall_nr; |
| 396 | if (num < 0 || num >= NR_syscalls) | 406 | if (WARN_ON_ONCE(num < 0 || num >= NR_syscalls)) |
| 397 | return -ENOSYS; | 407 | return -ENOSYS; |
| 398 | mutex_lock(&syscall_trace_lock); | 408 | mutex_lock(&syscall_trace_lock); |
| 399 | if (!sys_refcount_exit) | 409 | if (!sys_refcount_exit) |
| @@ -411,7 +421,7 @@ void unreg_event_syscall_exit(struct ftrace_event_call *call) | |||
| 411 | int num; | 421 | int num; |
| 412 | 422 | ||
| 413 | num = ((struct syscall_metadata *)call->data)->syscall_nr; | 423 | num = ((struct syscall_metadata *)call->data)->syscall_nr; |
| 414 | if (num < 0 || num >= NR_syscalls) | 424 | if (WARN_ON_ONCE(num < 0 || num >= NR_syscalls)) |
| 415 | return; | 425 | return; |
| 416 | mutex_lock(&syscall_trace_lock); | 426 | mutex_lock(&syscall_trace_lock); |
| 417 | sys_refcount_exit--; | 427 | sys_refcount_exit--; |
| @@ -424,6 +434,14 @@ void unreg_event_syscall_exit(struct ftrace_event_call *call) | |||
| 424 | int init_syscall_trace(struct ftrace_event_call *call) | 434 | int init_syscall_trace(struct ftrace_event_call *call) |
| 425 | { | 435 | { |
| 426 | int id; | 436 | int id; |
| 437 | int num; | ||
| 438 | |||
| 439 | num = ((struct syscall_metadata *)call->data)->syscall_nr; | ||
| 440 | if (num < 0 || num >= NR_syscalls) { | ||
| 441 | pr_debug("syscall %s metadata not mapped, disabling ftrace event\n", | ||
| 442 | ((struct syscall_metadata *)call->data)->name); | ||
| 443 | return -ENOSYS; | ||
| 444 | } | ||
| 427 | 445 | ||
| 428 | if (set_syscall_print_fmt(call) < 0) | 446 | if (set_syscall_print_fmt(call) < 0) |
| 429 | return -ENOMEM; | 447 | return -ENOMEM; |
| @@ -438,7 +456,7 @@ int init_syscall_trace(struct ftrace_event_call *call) | |||
| 438 | return id; | 456 | return id; |
| 439 | } | 457 | } |
| 440 | 458 | ||
| 441 | unsigned long __init arch_syscall_addr(int nr) | 459 | unsigned long __init __weak arch_syscall_addr(int nr) |
| 442 | { | 460 | { |
| 443 | return (unsigned long)sys_call_table[nr]; | 461 | return (unsigned long)sys_call_table[nr]; |
| 444 | } | 462 | } |
