Unified · Split
| @@ -247,6 +247,13 @@ You need very few things to get the syscalls tracing in an arch. · 246 unmodified lines | ||
| 247 | 247 | - Support the TIF_SYSCALL_TRACEPOINT thread flags. |
| 248 | 248 | - Put the trace_sys_enter() and trace_sys_exit() tracepoints calls from ptrace |
| 249 | 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 | 257 | - Tag this arch as HAVE_SYSCALL_TRACEPOINTS. |
| 251 | 258 | |
| 252 | 259 | |
| @@ -80,11 +80,11 @@ of ftrace. Here is a list of some of the key files: · 79 unmodified lines | ||
| 80 | 80 | tracers listed here can be configured by |
| 81 | 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 | |
| 86 | − is activated and tracing or not. Echo 0 into this | |
| 87 | − file to disable the tracer or 1 to enable it. | |
| 85 | + This sets or displays whether writing to the trace | |
| 86 | + ring buffer is enabled. Echo 0 into this file to disable | |
| 87 | + the tracer or 1 to enable it. | |
| 88 | 88 | |
| 89 | 89 | trace: |
| 90 | 90 | |
| @@ -202,10 +202,6 @@ Here is the list of current tracers that may be configured. · 111 unmodified lines | ||
| 202 | 202 | to draw a graph of function calls similar to C code |
| 203 | 203 | source. |
| 204 | 204 | |
| 205 | − "sched_switch" | |
| 206 | − | |
| 207 | − Traces the context switches and wakeups between tasks. | |
| 208 | − | |
| 209 | 205 | "irqsoff" |
| 210 | 206 | |
| 211 | 207 | Traces the areas that disable interrupts and saves |
| @@ -273,39 +269,6 @@ format, the function name that was traced "path_put" and the · 61 unmodified lines | ||
| 273 | 269 | parent function that called this function "path_walk". The |
| 274 | 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 | 272 | Latency trace format |
| 310 | 273 | -------------------- |
| 311 | 274 | |
| @@ -491,79 +454,6 @@ x494] <- /root/a.out[+0x4a8] <- /lib/libc-2.7.so[+0x1e1a6] · 179 unmodified lines | ||
| 491 | 454 | latencies, as described in "Latency |
| 492 | 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 | 457 | ftrace_enabled |
| 568 | 458 | -------------- |
| 569 | 459 | |
| @@ -607,10 +497,10 @@ an example: · 37 unmodified lines | ||
| 607 | 497 | # echo irqsoff > current_tracer |
| 608 | 498 | # echo latency-format > trace_options |
| 609 | 499 | # echo 0 > tracing_max_latency |
| 610 | − # echo 1 > tracing_enabled | |
| 500 | + # echo 1 > tracing_on | |
| 611 | 501 | # ls -ltr |
| 612 | 502 | [...] |
| 613 | − # echo 0 > tracing_enabled | |
| 503 | + # echo 0 > tracing_on | |
| 614 | 504 | # cat trace |
| 615 | 505 | # tracer: irqsoff |
| 616 | 506 | # |
| @@ -715,10 +605,10 @@ is much like the irqsoff tracer. · 98 unmodified lines | ||
| 715 | 605 | # echo preemptoff > current_tracer |
| 716 | 606 | # echo latency-format > trace_options |
| 717 | 607 | # echo 0 > tracing_max_latency |
| 718 | − # echo 1 > tracing_enabled | |
| 608 | + # echo 1 > tracing_on | |
| 719 | 609 | # ls -ltr |
| 720 | 610 | [...] |
| 721 | − # echo 0 > tracing_enabled | |
| 611 | + # echo 0 > tracing_on | |
| 722 | 612 | # cat trace |
| 723 | 613 | # tracer: preemptoff |
| 724 | 614 | # |
| @@ -863,10 +753,10 @@ tracers. · 138 unmodified lines | ||
| 863 | 753 | # echo preemptirqsoff > current_tracer |
| 864 | 754 | # echo latency-format > trace_options |
| 865 | 755 | # echo 0 > tracing_max_latency |
| 866 | − # echo 1 > tracing_enabled | |
| 756 | + # echo 1 > tracing_on | |
| 867 | 757 | # ls -ltr |
| 868 | 758 | [...] |
| 869 | − # echo 0 > tracing_enabled | |
| 759 | + # echo 0 > tracing_on | |
| 870 | 760 | # cat trace |
| 871 | 761 | # tracer: preemptirqsoff |
| 872 | 762 | # |
| @@ -1026,9 +916,9 @@ Instead of performing an 'ls', we will run 'sleep 1' under · 153 unmodified lines | ||
| 1026 | 916 | # echo wakeup > current_tracer |
| 1027 | 917 | # echo latency-format > trace_options |
| 1028 | 918 | # echo 0 > tracing_max_latency |
| 1029 | − # echo 1 > tracing_enabled | |
| 919 | + # echo 1 > tracing_on | |
| 1030 | 920 | # chrt -f 5 sleep 1 |
| 1031 | − # echo 0 > tracing_enabled | |
| 921 | + # echo 0 > tracing_on | |
| 1032 | 922 | # cat trace |
| 1033 | 923 | # tracer: wakeup |
| 1034 | 924 | # |
| @@ -1140,9 +1030,9 @@ ftrace_enabled is set; otherwise this tracer is a nop. · 105 unmodified lines | ||
| 1140 | 1030 | |
| 1141 | 1031 | # sysctl kernel.ftrace_enabled=1 |
| 1142 | 1032 | # echo function > current_tracer |
| 1143 | − # echo 1 > tracing_enabled | |
| 1033 | + # echo 1 > tracing_on | |
| 1144 | 1034 | # usleep 1 |
| 1145 | − # echo 0 > tracing_enabled | |
| 1035 | + # echo 0 > tracing_on | |
| 1146 | 1036 | # cat trace |
| 1147 | 1037 | # tracer: function |
| 1148 | 1038 | # |
| @@ -1180,7 +1070,7 @@ int trace_fd; · 31 unmodified lines | ||
| 1180 | 1070 | [...] |
| 1181 | 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 | 1075 | if (condition_hit()) { |
| 1186 | 1076 | write(trace_fd, "0", 1); |
| @@ -1631,9 +1521,9 @@ If I am only interested in sys_nanosleep and hrtimer_interrupt: · 444 unmodified lines | ||
| 1631 | 1521 | # echo sys_nanosleep hrtimer_interrupt \ |
| 1632 | 1522 | > set_ftrace_filter |
| 1633 | 1523 | # echo function > current_tracer |
| 1634 | − # echo 1 > tracing_enabled | |
| 1524 | + # echo 1 > tracing_on | |
| 1635 | 1525 | # usleep 1 |
| 1636 | − # echo 0 > tracing_enabled | |
| 1526 | + # echo 0 > tracing_on | |
| 1637 | 1527 | # cat trace |
| 1638 | 1528 | # tracer: ftrace |
| 1639 | 1529 | # |
| @@ -1879,9 +1769,9 @@ different. The trace is live. · 239 unmodified lines | ||
| 1879 | 1769 | # echo function > current_tracer |
| 1880 | 1770 | # cat trace_pipe > /tmp/trace.out & |
| 1881 | 1771 | [1] 4153 |
| 1882 | − # echo 1 > tracing_enabled | |
| 1772 | + # echo 1 > tracing_on | |
| 1883 | 1773 | # usleep 1 |
| 1884 | − # echo 0 > tracing_enabled | |
| 1774 | + # echo 0 > tracing_on | |
| 1885 | 1775 | # cat trace |
| 1886 | 1776 | # tracer: function |
| 1887 | 1777 | # |
| @@ -132,11 +132,11 @@ extern struct trace_event_functions exit_syscall_print_funcs; · 131 unmodified lines | ||
| 132 | 132 | .class = &event_class_syscall_enter, \ |
| 133 | 133 | .event.funcs = &enter_syscall_print_funcs, \ |
| 134 | 134 | .data = (void *)&__syscall_meta_##sname,\ |
| 135 | + .flags = TRACE_EVENT_FL_CAP_ANY, \ | |
| 135 | 136 | }; \ |
| 136 | 137 | static struct ftrace_event_call __used \ |
| 137 | 138 | __attribute__((section("_ftrace_events"))) \ |
| 138 | − *__event_enter_##sname = &event_enter_##sname; \ | |
| 139 | − __TRACE_EVENT_FLAGS(enter_##sname, TRACE_EVENT_FL_CAP_ANY) | |
| 139 | + *__event_enter_##sname = &event_enter_##sname; | |
| 140 | 140 | |
| 141 | 141 | #define SYSCALL_TRACE_EXIT_EVENT(sname) \ |
| 142 | 142 | static struct syscall_metadata __syscall_meta_##sname; \ |
| @@ -146,11 +146,11 @@ extern struct trace_event_functions exit_syscall_print_funcs; · 3 unmodified lines | ||
| 146 | 146 | .class = &event_class_syscall_exit, \ |
| 147 | 147 | .event.funcs = &exit_syscall_print_funcs, \ |
| 148 | 148 | .data = (void *)&__syscall_meta_##sname,\ |
| 149 | + .flags = TRACE_EVENT_FL_CAP_ANY, \ | |
| 149 | 150 | }; \ |
| 150 | 151 | static struct ftrace_event_call __used \ |
| 151 | 152 | __attribute__((section("_ftrace_events"))) \ |
| 152 | − *__event_exit_##sname = &event_exit_##sname; \ | |
| 153 | − __TRACE_EVENT_FLAGS(exit_##sname, TRACE_EVENT_FL_CAP_ANY) | |
| 153 | + *__event_exit_##sname = &event_exit_##sname; | |
| 154 | 154 | |
| 155 | 155 | #define SYSCALL_METADATA(sname, nb) \ |
| 156 | 156 | SYSCALL_TRACE_ENTER_EVENT(sname); \ |
| @@ -158,6 +158,7 @@ extern struct trace_event_functions exit_syscall_print_funcs; · 1 unmodified line | ||
| 158 | 158 | static struct syscall_metadata __used \ |
| 159 | 159 | __syscall_meta_##sname = { \ |
| 160 | 160 | .name = "sys"#sname, \ |
| 161 | + .syscall_nr = -1, /* Filled in at boot */ \ | |
| 161 | 162 | .nb_args = nb, \ |
| 162 | 163 | .types = types_##sname, \ |
| 163 | 164 | .args = args_##sname, \ |
| @@ -175,6 +176,7 @@ extern struct trace_event_functions exit_syscall_print_funcs; · 11 unmodified lines | ||
| 175 | 176 | static struct syscall_metadata __used \ |
| 176 | 177 | __syscall_meta__##sname = { \ |
| 177 | 178 | .name = "sys_"#sname, \ |
| 179 | + .syscall_nr = -1, /* Filled in at boot */ \ | |
| 178 | 180 | .nb_args = 0, \ |
| 179 | 181 | .enter_event = &event_enter__##sname, \ |
| 180 | 182 | .exit_event = &event_exit__##sname, \ |
| @@ -2163,10 +2163,14 @@ rb_reserve_next_event(struct ring_buffer *buffer, · 2162 unmodified lines | ||
| 2163 | 2163 | delta = diff; |
| 2164 | 2164 | if (unlikely(test_time_stamp(delta))) { |
| 2165 | 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 | 2167 | (unsigned long long)delta, |
| 2168 | 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 | 2174 | add_timestamp = 1; |
| 2171 | 2175 | } |
| 2172 | 2176 | } |
| @@ -2710,6 +2710,10 @@ tracing_ctrl_write(struct file *filp, const char __user *ubuf, · 2709 unmodified lines | ||
| 2710 | 2710 | |
| 2711 | 2711 | mutex_lock(&trace_types_lock); |
| 2712 | 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 | 2717 | if (val) { |
| 2714 | 2718 | tracer_enabled = 1; |
| 2715 | 2719 | if (current_trace->start) |
| @@ -247,51 +247,3 @@ void tracing_sched_switch_assign_trace(struct trace_array *tr) · 246 unmodified lines | ||
| 247 | 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 | − | |
| @@ -60,6 +60,19 @@ extern struct syscall_metadata *__stop_syscalls_metadata[]; · 59 unmodified lines | ||
| 60 | 60 | |
| 61 | 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 | 76 | static __init struct syscall_metadata * |
| 64 | 77 | find_syscall_meta(unsigned long syscall) |
| 65 | 78 | { |
| @@ -72,14 +85,11 @@ find_syscall_meta(unsigned long syscall) · 6 unmodified lines | ||
| 72 | 85 | stop = __stop_syscalls_metadata; |
| 73 | 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 | 91 | for ( ; start < stop; start++) { |
| 76 | − /* | |
| 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)) | |
| 92 | + if ((*start)->name && arch_syscall_match_sym_name(str, (*start)->name)) | |
| 83 | 93 | return *start; |
| 84 | 94 | } |
| 85 | 95 | return NULL; |
| @@ -359,7 +369,7 @@ int reg_event_syscall_enter(struct ftrace_event_call *call) · 273 unmodified lines | ||
| 359 | 369 | int num; |
| 360 | 370 | |
| 361 | 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 | 373 | return -ENOSYS; |
| 364 | 374 | mutex_lock(&syscall_trace_lock); |
| 365 | 375 | if (!sys_refcount_enter) |
| @@ -377,7 +387,7 @@ void unreg_event_syscall_enter(struct ftrace_event_call *call) · 11 unmodified lines | ||
| 377 | 387 | int num; |
| 378 | 388 | |
| 379 | 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 | 391 | return; |
| 382 | 392 | mutex_lock(&syscall_trace_lock); |
| 383 | 393 | sys_refcount_enter--; |
| @@ -393,7 +403,7 @@ int reg_event_syscall_exit(struct ftrace_event_call *call) · 9 unmodified lines | ||
| 393 | 403 | int num; |
| 394 | 404 | |
| 395 | 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 | 407 | return -ENOSYS; |
| 398 | 408 | mutex_lock(&syscall_trace_lock); |
| 399 | 409 | if (!sys_refcount_exit) |
| @@ -411,7 +421,7 @@ void unreg_event_syscall_exit(struct ftrace_event_call *call) · 11 unmodified lines | ||
| 411 | 421 | int num; |
| 412 | 422 | |
| 413 | 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 | 425 | return; |
| 416 | 426 | mutex_lock(&syscall_trace_lock); |
| 417 | 427 | sys_refcount_exit--; |
| @@ -424,6 +434,14 @@ void unreg_event_syscall_exit(struct ftrace_event_call *call) · 6 unmodified lines | ||
| 424 | 434 | int init_syscall_trace(struct ftrace_event_call *call) |
| 425 | 435 | { |
| 426 | 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 | 446 | if (set_syscall_print_fmt(call) < 0) |
| 429 | 447 | return -ENOMEM; |
| @@ -438,7 +456,7 @@ int init_syscall_trace(struct ftrace_event_call *call) · 8 unmodified lines | ||
| 438 | 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 | 461 | return (unsigned long)sys_call_table[nr]; |
| 444 | 462 | } |
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | #!/usr/bin/perl -w |
| 2 | 2 | # |
| 3 | −# Copywrite 2005-2009 - Steven Rostedt | |
| 3 | +# Copyright 2005-2009 - Steven Rostedt | |
| 4 | 4 | # Licensed under the terms of the GNU GPL License version 2 |
| 5 | 5 | # |
| 6 | 6 | # It's simple enough to figure out how this works. |
| @@ -1,6 +1,6 @@ | ||
| 1 | 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 | 4 | # Licensed under the terms of the GNU GPL License version 2 |
| 5 | 5 | # |
| 6 | 6 | |