diff options
-rw-r--r-- | Documentation/trace/ftrace-design.txt | 7 | ||||
-rw-r--r-- | Documentation/trace/ftrace.txt | 148 | ||||
-rw-r--r-- | include/linux/syscalls.h | 10 | ||||
-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 | ||||
-rw-r--r-- | scripts/kconfig/streamline_config.pl | 2 | ||||
-rwxr-xr-x | tools/testing/ktest/ktest.pl | 2 |
9 files changed, 74 insertions, 197 deletions
diff --git a/Documentation/trace/ftrace-design.txt b/Documentation/trace/ftrace-design.txt index dc52bd442c92..79fcafc7fd64 100644 --- a/Documentation/trace/ftrace-design.txt +++ b/Documentation/trace/ftrace-design.txt | |||
@@ -247,6 +247,13 @@ You need very few things to get the syscalls tracing in an arch. | |||
247 | - Support the TIF_SYSCALL_TRACEPOINT thread flags. | 247 | - Support the TIF_SYSCALL_TRACEPOINT thread flags. |
248 | - Put the trace_sys_enter() and trace_sys_exit() tracepoints calls from ptrace | 248 | - Put the trace_sys_enter() and trace_sys_exit() tracepoints calls from ptrace |
249 | in the ptrace syscalls tracing path. | 249 | in the ptrace syscalls tracing path. |
250 | - If the system call table on this arch is more complicated than a simple array | ||
251 | of addresses of the system calls, implement an arch_syscall_addr to return | ||
252 | the address of a given system call. | ||
253 | - If the symbol names of the system calls do not match the function names on | ||
254 | this arch, define ARCH_HAS_SYSCALL_MATCH_SYM_NAME in asm/ftrace.h and | ||
255 | implement arch_syscall_match_sym_name with the appropriate logic to return | ||
256 | true if the function name corresponds with the symbol name. | ||
250 | - Tag this arch as HAVE_SYSCALL_TRACEPOINTS. | 257 | - Tag this arch as HAVE_SYSCALL_TRACEPOINTS. |
251 | 258 | ||
252 | 259 | ||
diff --git a/Documentation/trace/ftrace.txt b/Documentation/trace/ftrace.txt index 557c1edeccaf..67f1cc473257 100644 --- a/Documentation/trace/ftrace.txt +++ b/Documentation/trace/ftrace.txt | |||
@@ -80,11 +80,11 @@ of ftrace. Here is a list of some of the key files: | |||
80 | tracers listed here can be configured by | 80 | tracers listed here can be configured by |
81 | echoing their name into current_tracer. | 81 | echoing their name into current_tracer. |
82 | 82 | ||
83 | tracing_enabled: | 83 | tracing_on: |
84 | 84 | ||
85 | This sets or displays whether the current_tracer | 85 | This sets or displays whether writing to the trace |
86 | is activated and tracing or not. Echo 0 into this | 86 | ring buffer is enabled. Echo 0 into this file to disable |
87 | file to disable the tracer or 1 to enable it. | 87 | the tracer or 1 to enable it. |
88 | 88 | ||
89 | trace: | 89 | trace: |
90 | 90 | ||
@@ -202,10 +202,6 @@ Here is the list of current tracers that may be configured. | |||
202 | to draw a graph of function calls similar to C code | 202 | to draw a graph of function calls similar to C code |
203 | source. | 203 | source. |
204 | 204 | ||
205 | "sched_switch" | ||
206 | |||
207 | Traces the context switches and wakeups between tasks. | ||
208 | |||
209 | "irqsoff" | 205 | "irqsoff" |
210 | 206 | ||
211 | Traces the areas that disable interrupts and saves | 207 | Traces the areas that disable interrupts and saves |
@@ -273,39 +269,6 @@ format, the function name that was traced "path_put" and the | |||
273 | parent function that called this function "path_walk". The | 269 | parent function that called this function "path_walk". The |
274 | timestamp is the time at which the function was entered. | 270 | timestamp is the time at which the function was entered. |
275 | 271 | ||
276 | The sched_switch tracer also includes tracing of task wakeups | ||
277 | and context switches. | ||
278 | |||
279 | ksoftirqd/1-7 [01] 1453.070013: 7:115:R + 2916:115:S | ||
280 | ksoftirqd/1-7 [01] 1453.070013: 7:115:R + 10:115:S | ||
281 | ksoftirqd/1-7 [01] 1453.070013: 7:115:R ==> 10:115:R | ||
282 | events/1-10 [01] 1453.070013: 10:115:S ==> 2916:115:R | ||
283 | kondemand/1-2916 [01] 1453.070013: 2916:115:S ==> 7:115:R | ||
284 | ksoftirqd/1-7 [01] 1453.070013: 7:115:S ==> 0:140:R | ||
285 | |||
286 | Wake ups are represented by a "+" and the context switches are | ||
287 | shown as "==>". The format is: | ||
288 | |||
289 | Context switches: | ||
290 | |||
291 | Previous task Next Task | ||
292 | |||
293 | <pid>:<prio>:<state> ==> <pid>:<prio>:<state> | ||
294 | |||
295 | Wake ups: | ||
296 | |||
297 | Current task Task waking up | ||
298 | |||
299 | <pid>:<prio>:<state> + <pid>:<prio>:<state> | ||
300 | |||
301 | The prio is the internal kernel priority, which is the inverse | ||
302 | of the priority that is usually displayed by user-space tools. | ||
303 | Zero represents the highest priority (99). Prio 100 starts the | ||
304 | "nice" priorities with 100 being equal to nice -20 and 139 being | ||
305 | nice 19. The prio "140" is reserved for the idle task which is | ||
306 | the lowest priority thread (pid 0). | ||
307 | |||
308 | |||
309 | Latency trace format | 272 | Latency trace format |
310 | -------------------- | 273 | -------------------- |
311 | 274 | ||
@@ -491,79 +454,6 @@ x494] <- /root/a.out[+0x4a8] <- /lib/libc-2.7.so[+0x1e1a6] | |||
491 | latencies, as described in "Latency | 454 | latencies, as described in "Latency |
492 | trace format". | 455 | trace format". |
493 | 456 | ||
494 | sched_switch | ||
495 | ------------ | ||
496 | |||
497 | This tracer simply records schedule switches. Here is an example | ||
498 | of how to use it. | ||
499 | |||
500 | # echo sched_switch > current_tracer | ||
501 | # echo 1 > tracing_enabled | ||
502 | # sleep 1 | ||
503 | # echo 0 > tracing_enabled | ||
504 | # cat trace | ||
505 | |||
506 | # tracer: sched_switch | ||
507 | # | ||
508 | # TASK-PID CPU# TIMESTAMP FUNCTION | ||
509 | # | | | | | | ||
510 | bash-3997 [01] 240.132281: 3997:120:R + 4055:120:R | ||
511 | bash-3997 [01] 240.132284: 3997:120:R ==> 4055:120:R | ||
512 | sleep-4055 [01] 240.132371: 4055:120:S ==> 3997:120:R | ||
513 | bash-3997 [01] 240.132454: 3997:120:R + 4055:120:S | ||
514 | bash-3997 [01] 240.132457: 3997:120:R ==> 4055:120:R | ||
515 | sleep-4055 [01] 240.132460: 4055:120:D ==> 3997:120:R | ||
516 | bash-3997 [01] 240.132463: 3997:120:R + 4055:120:D | ||
517 | bash-3997 [01] 240.132465: 3997:120:R ==> 4055:120:R | ||
518 | <idle>-0 [00] 240.132589: 0:140:R + 4:115:S | ||
519 | <idle>-0 [00] 240.132591: 0:140:R ==> 4:115:R | ||
520 | ksoftirqd/0-4 [00] 240.132595: 4:115:S ==> 0:140:R | ||
521 | <idle>-0 [00] 240.132598: 0:140:R + 4:115:S | ||
522 | <idle>-0 [00] 240.132599: 0:140:R ==> 4:115:R | ||
523 | ksoftirqd/0-4 [00] 240.132603: 4:115:S ==> 0:140:R | ||
524 | sleep-4055 [01] 240.133058: 4055:120:S ==> 3997:120:R | ||
525 | [...] | ||
526 | |||
527 | |||
528 | As we have discussed previously about this format, the header | ||
529 | shows the name of the trace and points to the options. The | ||
530 | "FUNCTION" is a misnomer since here it represents the wake ups | ||
531 | and context switches. | ||
532 | |||
533 | The sched_switch file only lists the wake ups (represented with | ||
534 | '+') and context switches ('==>') with the previous task or | ||
535 | current task first followed by the next task or task waking up. | ||
536 | The format for both of these is PID:KERNEL-PRIO:TASK-STATE. | ||
537 | Remember that the KERNEL-PRIO is the inverse of the actual | ||
538 | priority with zero (0) being the highest priority and the nice | ||
539 | values starting at 100 (nice -20). Below is a quick chart to map | ||
540 | the kernel priority to user land priorities. | ||
541 | |||
542 | Kernel Space User Space | ||
543 | =============================================================== | ||
544 | 0(high) to 98(low) user RT priority 99(high) to 1(low) | ||
545 | with SCHED_RR or SCHED_FIFO | ||
546 | --------------------------------------------------------------- | ||
547 | 99 sched_priority is not used in scheduling | ||
548 | decisions(it must be specified as 0) | ||
549 | --------------------------------------------------------------- | ||
550 | 100(high) to 139(low) user nice -20(high) to 19(low) | ||
551 | --------------------------------------------------------------- | ||
552 | 140 idle task priority | ||
553 | --------------------------------------------------------------- | ||
554 | |||
555 | The task states are: | ||
556 | |||
557 | R - running : wants to run, may not actually be running | ||
558 | S - sleep : process is waiting to be woken up (handles signals) | ||
559 | D - disk sleep (uninterruptible sleep) : process must be woken up | ||
560 | (ignores signals) | ||
561 | T - stopped : process suspended | ||
562 | t - traced : process is being traced (with something like gdb) | ||
563 | Z - zombie : process waiting to be cleaned up | ||
564 | X - unknown | ||
565 | |||
566 | |||
567 | ftrace_enabled | 457 | ftrace_enabled |
568 | -------------- | 458 | -------------- |
569 | 459 | ||
@@ -607,10 +497,10 @@ an example: | |||
607 | # echo irqsoff > current_tracer | 497 | # echo irqsoff > current_tracer |
608 | # echo latency-format > trace_options | 498 | # echo latency-format > trace_options |
609 | # echo 0 > tracing_max_latency | 499 | # echo 0 > tracing_max_latency |
610 | # echo 1 > tracing_enabled | 500 | # echo 1 > tracing_on |
611 | # ls -ltr | 501 | # ls -ltr |
612 | [...] | 502 | [...] |
613 | # echo 0 > tracing_enabled | 503 | # echo 0 > tracing_on |
614 | # cat trace | 504 | # cat trace |
615 | # tracer: irqsoff | 505 | # tracer: irqsoff |
616 | # | 506 | # |
@@ -715,10 +605,10 @@ is much like the irqsoff tracer. | |||
715 | # echo preemptoff > current_tracer | 605 | # echo preemptoff > current_tracer |
716 | # echo latency-format > trace_options | 606 | # echo latency-format > trace_options |
717 | # echo 0 > tracing_max_latency | 607 | # echo 0 > tracing_max_latency |
718 | # echo 1 > tracing_enabled | 608 | # echo 1 > tracing_on |
719 | # ls -ltr | 609 | # ls -ltr |
720 | [...] | 610 | [...] |
721 | # echo 0 > tracing_enabled | 611 | # echo 0 > tracing_on |
722 | # cat trace | 612 | # cat trace |
723 | # tracer: preemptoff | 613 | # tracer: preemptoff |
724 | # | 614 | # |
@@ -863,10 +753,10 @@ tracers. | |||
863 | # echo preemptirqsoff > current_tracer | 753 | # echo preemptirqsoff > current_tracer |
864 | # echo latency-format > trace_options | 754 | # echo latency-format > trace_options |
865 | # echo 0 > tracing_max_latency | 755 | # echo 0 > tracing_max_latency |
866 | # echo 1 > tracing_enabled | 756 | # echo 1 > tracing_on |
867 | # ls -ltr | 757 | # ls -ltr |
868 | [...] | 758 | [...] |
869 | # echo 0 > tracing_enabled | 759 | # echo 0 > tracing_on |
870 | # cat trace | 760 | # cat trace |
871 | # tracer: preemptirqsoff | 761 | # tracer: preemptirqsoff |
872 | # | 762 | # |
@@ -1026,9 +916,9 @@ Instead of performing an 'ls', we will run 'sleep 1' under | |||
1026 | # echo wakeup > current_tracer | 916 | # echo wakeup > current_tracer |
1027 | # echo latency-format > trace_options | 917 | # echo latency-format > trace_options |
1028 | # echo 0 > tracing_max_latency | 918 | # echo 0 > tracing_max_latency |
1029 | # echo 1 > tracing_enabled | 919 | # echo 1 > tracing_on |
1030 | # chrt -f 5 sleep 1 | 920 | # chrt -f 5 sleep 1 |
1031 | # echo 0 > tracing_enabled | 921 | # echo 0 > tracing_on |
1032 | # cat trace | 922 | # cat trace |
1033 | # tracer: wakeup | 923 | # tracer: wakeup |
1034 | # | 924 | # |
@@ -1140,9 +1030,9 @@ ftrace_enabled is set; otherwise this tracer is a nop. | |||
1140 | 1030 | ||
1141 | # sysctl kernel.ftrace_enabled=1 | 1031 | # sysctl kernel.ftrace_enabled=1 |
1142 | # echo function > current_tracer | 1032 | # echo function > current_tracer |
1143 | # echo 1 > tracing_enabled | 1033 | # echo 1 > tracing_on |
1144 | # usleep 1 | 1034 | # usleep 1 |
1145 | # echo 0 > tracing_enabled | 1035 | # echo 0 > tracing_on |
1146 | # cat trace | 1036 | # cat trace |
1147 | # tracer: function | 1037 | # tracer: function |
1148 | # | 1038 | # |
@@ -1180,7 +1070,7 @@ int trace_fd; | |||
1180 | [...] | 1070 | [...] |
1181 | int main(int argc, char *argv[]) { | 1071 | int main(int argc, char *argv[]) { |
1182 | [...] | 1072 | [...] |
1183 | trace_fd = open(tracing_file("tracing_enabled"), O_WRONLY); | 1073 | trace_fd = open(tracing_file("tracing_on"), O_WRONLY); |
1184 | [...] | 1074 | [...] |
1185 | if (condition_hit()) { | 1075 | if (condition_hit()) { |
1186 | write(trace_fd, "0", 1); | 1076 | write(trace_fd, "0", 1); |
@@ -1631,9 +1521,9 @@ If I am only interested in sys_nanosleep and hrtimer_interrupt: | |||
1631 | # echo sys_nanosleep hrtimer_interrupt \ | 1521 | # echo sys_nanosleep hrtimer_interrupt \ |
1632 | > set_ftrace_filter | 1522 | > set_ftrace_filter |
1633 | # echo function > current_tracer | 1523 | # echo function > current_tracer |
1634 | # echo 1 > tracing_enabled | 1524 | # echo 1 > tracing_on |
1635 | # usleep 1 | 1525 | # usleep 1 |
1636 | # echo 0 > tracing_enabled | 1526 | # echo 0 > tracing_on |
1637 | # cat trace | 1527 | # cat trace |
1638 | # tracer: ftrace | 1528 | # tracer: ftrace |
1639 | # | 1529 | # |
@@ -1879,9 +1769,9 @@ different. The trace is live. | |||
1879 | # echo function > current_tracer | 1769 | # echo function > current_tracer |
1880 | # cat trace_pipe > /tmp/trace.out & | 1770 | # cat trace_pipe > /tmp/trace.out & |
1881 | [1] 4153 | 1771 | [1] 4153 |
1882 | # echo 1 > tracing_enabled | 1772 | # echo 1 > tracing_on |
1883 | # usleep 1 | 1773 | # usleep 1 |
1884 | # echo 0 > tracing_enabled | 1774 | # echo 0 > tracing_on |
1885 | # cat trace | 1775 | # cat trace |
1886 | # tracer: function | 1776 | # tracer: function |
1887 | # | 1777 | # |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 98664db1be47..a17fcea2ca58 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -132,11 +132,11 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
132 | .class = &event_class_syscall_enter, \ | 132 | .class = &event_class_syscall_enter, \ |
133 | .event.funcs = &enter_syscall_print_funcs, \ | 133 | .event.funcs = &enter_syscall_print_funcs, \ |
134 | .data = (void *)&__syscall_meta_##sname,\ | 134 | .data = (void *)&__syscall_meta_##sname,\ |
135 | .flags = TRACE_EVENT_FL_CAP_ANY, \ | ||
135 | }; \ | 136 | }; \ |
136 | static struct ftrace_event_call __used \ | 137 | static struct ftrace_event_call __used \ |
137 | __attribute__((section("_ftrace_events"))) \ | 138 | __attribute__((section("_ftrace_events"))) \ |
138 | *__event_enter_##sname = &event_enter_##sname; \ | 139 | *__event_enter_##sname = &event_enter_##sname; |
139 | __TRACE_EVENT_FLAGS(enter_##sname, TRACE_EVENT_FL_CAP_ANY) | ||
140 | 140 | ||
141 | #define SYSCALL_TRACE_EXIT_EVENT(sname) \ | 141 | #define SYSCALL_TRACE_EXIT_EVENT(sname) \ |
142 | static struct syscall_metadata __syscall_meta_##sname; \ | 142 | static struct syscall_metadata __syscall_meta_##sname; \ |
@@ -146,11 +146,11 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
146 | .class = &event_class_syscall_exit, \ | 146 | .class = &event_class_syscall_exit, \ |
147 | .event.funcs = &exit_syscall_print_funcs, \ | 147 | .event.funcs = &exit_syscall_print_funcs, \ |
148 | .data = (void *)&__syscall_meta_##sname,\ | 148 | .data = (void *)&__syscall_meta_##sname,\ |
149 | .flags = TRACE_EVENT_FL_CAP_ANY, \ | ||
149 | }; \ | 150 | }; \ |
150 | static struct ftrace_event_call __used \ | 151 | static struct ftrace_event_call __used \ |
151 | __attribute__((section("_ftrace_events"))) \ | 152 | __attribute__((section("_ftrace_events"))) \ |
152 | *__event_exit_##sname = &event_exit_##sname; \ | 153 | *__event_exit_##sname = &event_exit_##sname; |
153 | __TRACE_EVENT_FLAGS(exit_##sname, TRACE_EVENT_FL_CAP_ANY) | ||
154 | 154 | ||
155 | #define SYSCALL_METADATA(sname, nb) \ | 155 | #define SYSCALL_METADATA(sname, nb) \ |
156 | SYSCALL_TRACE_ENTER_EVENT(sname); \ | 156 | SYSCALL_TRACE_ENTER_EVENT(sname); \ |
@@ -158,6 +158,7 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
158 | static struct syscall_metadata __used \ | 158 | static struct syscall_metadata __used \ |
159 | __syscall_meta_##sname = { \ | 159 | __syscall_meta_##sname = { \ |
160 | .name = "sys"#sname, \ | 160 | .name = "sys"#sname, \ |
161 | .syscall_nr = -1, /* Filled in at boot */ \ | ||
161 | .nb_args = nb, \ | 162 | .nb_args = nb, \ |
162 | .types = types_##sname, \ | 163 | .types = types_##sname, \ |
163 | .args = args_##sname, \ | 164 | .args = args_##sname, \ |
@@ -175,6 +176,7 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
175 | static struct syscall_metadata __used \ | 176 | static struct syscall_metadata __used \ |
176 | __syscall_meta__##sname = { \ | 177 | __syscall_meta__##sname = { \ |
177 | .name = "sys_"#sname, \ | 178 | .name = "sys_"#sname, \ |
179 | .syscall_nr = -1, /* Filled in at boot */ \ | ||
178 | .nb_args = 0, \ | 180 | .nb_args = 0, \ |
179 | .enter_event = &event_enter__##sname, \ | 181 | .enter_event = &event_enter__##sname, \ |
180 | .exit_event = &event_exit__##sname, \ | 182 | .exit_event = &event_exit__##sname, \ |
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 | } |
diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl index fd81fc33d633..a4fe923c0131 100644 --- a/scripts/kconfig/streamline_config.pl +++ b/scripts/kconfig/streamline_config.pl | |||
@@ -1,6 +1,6 @@ | |||
1 | #!/usr/bin/perl -w | 1 | #!/usr/bin/perl -w |
2 | # | 2 | # |
3 | # Copywrite 2005-2009 - Steven Rostedt | 3 | # Copyright 2005-2009 - Steven Rostedt |
4 | # Licensed under the terms of the GNU GPL License version 2 | 4 | # Licensed under the terms of the GNU GPL License version 2 |
5 | # | 5 | # |
6 | # It's simple enough to figure out how this works. | 6 | # It's simple enough to figure out how this works. |
diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl index e1c62eeb88f5..ba7c63af6f3b 100755 --- a/tools/testing/ktest/ktest.pl +++ b/tools/testing/ktest/ktest.pl | |||
@@ -1,6 +1,6 @@ | |||
1 | #!/usr/bin/perl -w | 1 | #!/usr/bin/perl -w |
2 | # | 2 | # |
3 | # Copywrite 2010 - Steven Rostedt <srostedt@redhat.com>, Red Hat Inc. | 3 | # Copyright 2010 - Steven Rostedt <srostedt@redhat.com>, Red Hat Inc. |
4 | # Licensed under the terms of the GNU GPL License version 2 | 4 | # Licensed under the terms of the GNU GPL License version 2 |
5 | # | 5 | # |
6 | 6 | ||