diff options
Diffstat (limited to 'kernel/trace/trace_selftest.c')
| -rw-r--r-- | kernel/trace/trace_selftest.c | 69 |
1 files changed, 37 insertions, 32 deletions
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index e98fca60974f..5ef60499dc8e 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c | |||
| @@ -65,7 +65,7 @@ static int trace_test_buffer(struct trace_buffer *buf, unsigned long *count) | |||
| 65 | 65 | ||
| 66 | /* Don't allow flipping of max traces now */ | 66 | /* Don't allow flipping of max traces now */ |
| 67 | local_irq_save(flags); | 67 | local_irq_save(flags); |
| 68 | arch_spin_lock(&ftrace_max_lock); | 68 | arch_spin_lock(&buf->tr->max_lock); |
| 69 | 69 | ||
| 70 | cnt = ring_buffer_entries(buf->buffer); | 70 | cnt = ring_buffer_entries(buf->buffer); |
| 71 | 71 | ||
| @@ -83,7 +83,7 @@ static int trace_test_buffer(struct trace_buffer *buf, unsigned long *count) | |||
| 83 | break; | 83 | break; |
| 84 | } | 84 | } |
| 85 | tracing_on(); | 85 | tracing_on(); |
| 86 | arch_spin_unlock(&ftrace_max_lock); | 86 | arch_spin_unlock(&buf->tr->max_lock); |
| 87 | local_irq_restore(flags); | 87 | local_irq_restore(flags); |
| 88 | 88 | ||
| 89 | if (count) | 89 | if (count) |
| @@ -161,11 +161,6 @@ static struct ftrace_ops test_probe3 = { | |||
| 161 | .flags = FTRACE_OPS_FL_RECURSION_SAFE, | 161 | .flags = FTRACE_OPS_FL_RECURSION_SAFE, |
| 162 | }; | 162 | }; |
| 163 | 163 | ||
| 164 | static struct ftrace_ops test_global = { | ||
| 165 | .func = trace_selftest_test_global_func, | ||
| 166 | .flags = FTRACE_OPS_FL_GLOBAL | FTRACE_OPS_FL_RECURSION_SAFE, | ||
| 167 | }; | ||
| 168 | |||
| 169 | static void print_counts(void) | 164 | static void print_counts(void) |
| 170 | { | 165 | { |
| 171 | printk("(%d %d %d %d %d) ", | 166 | printk("(%d %d %d %d %d) ", |
| @@ -185,7 +180,7 @@ static void reset_counts(void) | |||
| 185 | trace_selftest_test_dyn_cnt = 0; | 180 | trace_selftest_test_dyn_cnt = 0; |
| 186 | } | 181 | } |
| 187 | 182 | ||
| 188 | static int trace_selftest_ops(int cnt) | 183 | static int trace_selftest_ops(struct trace_array *tr, int cnt) |
| 189 | { | 184 | { |
| 190 | int save_ftrace_enabled = ftrace_enabled; | 185 | int save_ftrace_enabled = ftrace_enabled; |
| 191 | struct ftrace_ops *dyn_ops; | 186 | struct ftrace_ops *dyn_ops; |
| @@ -220,7 +215,11 @@ static int trace_selftest_ops(int cnt) | |||
| 220 | register_ftrace_function(&test_probe1); | 215 | register_ftrace_function(&test_probe1); |
| 221 | register_ftrace_function(&test_probe2); | 216 | register_ftrace_function(&test_probe2); |
| 222 | register_ftrace_function(&test_probe3); | 217 | register_ftrace_function(&test_probe3); |
| 223 | register_ftrace_function(&test_global); | 218 | /* First time we are running with main function */ |
| 219 | if (cnt > 1) { | ||
| 220 | ftrace_init_array_ops(tr, trace_selftest_test_global_func); | ||
| 221 | register_ftrace_function(tr->ops); | ||
| 222 | } | ||
| 224 | 223 | ||
| 225 | DYN_FTRACE_TEST_NAME(); | 224 | DYN_FTRACE_TEST_NAME(); |
| 226 | 225 | ||
| @@ -232,8 +231,10 @@ static int trace_selftest_ops(int cnt) | |||
| 232 | goto out; | 231 | goto out; |
| 233 | if (trace_selftest_test_probe3_cnt != 1) | 232 | if (trace_selftest_test_probe3_cnt != 1) |
| 234 | goto out; | 233 | goto out; |
| 235 | if (trace_selftest_test_global_cnt == 0) | 234 | if (cnt > 1) { |
| 236 | goto out; | 235 | if (trace_selftest_test_global_cnt == 0) |
| 236 | goto out; | ||
| 237 | } | ||
| 237 | 238 | ||
| 238 | DYN_FTRACE_TEST_NAME2(); | 239 | DYN_FTRACE_TEST_NAME2(); |
| 239 | 240 | ||
| @@ -269,8 +270,10 @@ static int trace_selftest_ops(int cnt) | |||
| 269 | goto out_free; | 270 | goto out_free; |
| 270 | if (trace_selftest_test_probe3_cnt != 3) | 271 | if (trace_selftest_test_probe3_cnt != 3) |
| 271 | goto out_free; | 272 | goto out_free; |
| 272 | if (trace_selftest_test_global_cnt == 0) | 273 | if (cnt > 1) { |
| 273 | goto out; | 274 | if (trace_selftest_test_global_cnt == 0) |
| 275 | goto out; | ||
| 276 | } | ||
| 274 | if (trace_selftest_test_dyn_cnt == 0) | 277 | if (trace_selftest_test_dyn_cnt == 0) |
| 275 | goto out_free; | 278 | goto out_free; |
| 276 | 279 | ||
| @@ -295,7 +298,9 @@ static int trace_selftest_ops(int cnt) | |||
| 295 | unregister_ftrace_function(&test_probe1); | 298 | unregister_ftrace_function(&test_probe1); |
| 296 | unregister_ftrace_function(&test_probe2); | 299 | unregister_ftrace_function(&test_probe2); |
| 297 | unregister_ftrace_function(&test_probe3); | 300 | unregister_ftrace_function(&test_probe3); |
| 298 | unregister_ftrace_function(&test_global); | 301 | if (cnt > 1) |
| 302 | unregister_ftrace_function(tr->ops); | ||
| 303 | ftrace_reset_array_ops(tr); | ||
| 299 | 304 | ||
| 300 | /* Make sure everything is off */ | 305 | /* Make sure everything is off */ |
| 301 | reset_counts(); | 306 | reset_counts(); |
| @@ -315,9 +320,9 @@ static int trace_selftest_ops(int cnt) | |||
| 315 | } | 320 | } |
| 316 | 321 | ||
| 317 | /* Test dynamic code modification and ftrace filters */ | 322 | /* Test dynamic code modification and ftrace filters */ |
| 318 | int trace_selftest_startup_dynamic_tracing(struct tracer *trace, | 323 | static int trace_selftest_startup_dynamic_tracing(struct tracer *trace, |
| 319 | struct trace_array *tr, | 324 | struct trace_array *tr, |
| 320 | int (*func)(void)) | 325 | int (*func)(void)) |
| 321 | { | 326 | { |
| 322 | int save_ftrace_enabled = ftrace_enabled; | 327 | int save_ftrace_enabled = ftrace_enabled; |
| 323 | unsigned long count; | 328 | unsigned long count; |
| @@ -388,7 +393,7 @@ int trace_selftest_startup_dynamic_tracing(struct tracer *trace, | |||
| 388 | } | 393 | } |
| 389 | 394 | ||
| 390 | /* Test the ops with global tracing running */ | 395 | /* Test the ops with global tracing running */ |
| 391 | ret = trace_selftest_ops(1); | 396 | ret = trace_selftest_ops(tr, 1); |
| 392 | trace->reset(tr); | 397 | trace->reset(tr); |
| 393 | 398 | ||
| 394 | out: | 399 | out: |
| @@ -399,7 +404,7 @@ int trace_selftest_startup_dynamic_tracing(struct tracer *trace, | |||
| 399 | 404 | ||
| 400 | /* Test the ops with global tracing off */ | 405 | /* Test the ops with global tracing off */ |
| 401 | if (!ret) | 406 | if (!ret) |
| 402 | ret = trace_selftest_ops(2); | 407 | ret = trace_selftest_ops(tr, 2); |
| 403 | 408 | ||
| 404 | return ret; | 409 | return ret; |
| 405 | } | 410 | } |
| @@ -802,7 +807,7 @@ out: | |||
| 802 | int | 807 | int |
| 803 | trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) | 808 | trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) |
| 804 | { | 809 | { |
| 805 | unsigned long save_max = tracing_max_latency; | 810 | unsigned long save_max = tr->max_latency; |
| 806 | unsigned long count; | 811 | unsigned long count; |
| 807 | int ret; | 812 | int ret; |
| 808 | 813 | ||
| @@ -814,7 +819,7 @@ trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) | |||
| 814 | } | 819 | } |
| 815 | 820 | ||
| 816 | /* reset the max latency */ | 821 | /* reset the max latency */ |
| 817 | tracing_max_latency = 0; | 822 | tr->max_latency = 0; |
| 818 | /* disable interrupts for a bit */ | 823 | /* disable interrupts for a bit */ |
| 819 | local_irq_disable(); | 824 | local_irq_disable(); |
| 820 | udelay(100); | 825 | udelay(100); |
| @@ -841,7 +846,7 @@ trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) | |||
| 841 | ret = -1; | 846 | ret = -1; |
| 842 | } | 847 | } |
| 843 | 848 | ||
| 844 | tracing_max_latency = save_max; | 849 | tr->max_latency = save_max; |
| 845 | 850 | ||
| 846 | return ret; | 851 | return ret; |
| 847 | } | 852 | } |
| @@ -851,7 +856,7 @@ trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) | |||
| 851 | int | 856 | int |
| 852 | trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr) | 857 | trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr) |
| 853 | { | 858 | { |
| 854 | unsigned long save_max = tracing_max_latency; | 859 | unsigned long save_max = tr->max_latency; |
| 855 | unsigned long count; | 860 | unsigned long count; |
| 856 | int ret; | 861 | int ret; |
| 857 | 862 | ||
| @@ -876,7 +881,7 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr) | |||
| 876 | } | 881 | } |
| 877 | 882 | ||
| 878 | /* reset the max latency */ | 883 | /* reset the max latency */ |
| 879 | tracing_max_latency = 0; | 884 | tr->max_latency = 0; |
| 880 | /* disable preemption for a bit */ | 885 | /* disable preemption for a bit */ |
| 881 | preempt_disable(); | 886 | preempt_disable(); |
| 882 | udelay(100); | 887 | udelay(100); |
| @@ -903,7 +908,7 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr) | |||
| 903 | ret = -1; | 908 | ret = -1; |
| 904 | } | 909 | } |
| 905 | 910 | ||
| 906 | tracing_max_latency = save_max; | 911 | tr->max_latency = save_max; |
| 907 | 912 | ||
| 908 | return ret; | 913 | return ret; |
| 909 | } | 914 | } |
| @@ -913,7 +918,7 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr) | |||
| 913 | int | 918 | int |
| 914 | trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *tr) | 919 | trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *tr) |
| 915 | { | 920 | { |
| 916 | unsigned long save_max = tracing_max_latency; | 921 | unsigned long save_max = tr->max_latency; |
| 917 | unsigned long count; | 922 | unsigned long count; |
| 918 | int ret; | 923 | int ret; |
| 919 | 924 | ||
| @@ -938,7 +943,7 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array * | |||
| 938 | } | 943 | } |
| 939 | 944 | ||
| 940 | /* reset the max latency */ | 945 | /* reset the max latency */ |
| 941 | tracing_max_latency = 0; | 946 | tr->max_latency = 0; |
| 942 | 947 | ||
| 943 | /* disable preemption and interrupts for a bit */ | 948 | /* disable preemption and interrupts for a bit */ |
| 944 | preempt_disable(); | 949 | preempt_disable(); |
| @@ -973,7 +978,7 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array * | |||
| 973 | } | 978 | } |
| 974 | 979 | ||
| 975 | /* do the test by disabling interrupts first this time */ | 980 | /* do the test by disabling interrupts first this time */ |
| 976 | tracing_max_latency = 0; | 981 | tr->max_latency = 0; |
| 977 | tracing_start(); | 982 | tracing_start(); |
| 978 | trace->start(tr); | 983 | trace->start(tr); |
| 979 | 984 | ||
| @@ -1004,7 +1009,7 @@ out: | |||
| 1004 | tracing_start(); | 1009 | tracing_start(); |
| 1005 | out_no_start: | 1010 | out_no_start: |
| 1006 | trace->reset(tr); | 1011 | trace->reset(tr); |
| 1007 | tracing_max_latency = save_max; | 1012 | tr->max_latency = save_max; |
| 1008 | 1013 | ||
| 1009 | return ret; | 1014 | return ret; |
| 1010 | } | 1015 | } |
| @@ -1057,7 +1062,7 @@ static int trace_wakeup_test_thread(void *data) | |||
| 1057 | int | 1062 | int |
| 1058 | trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr) | 1063 | trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr) |
| 1059 | { | 1064 | { |
| 1060 | unsigned long save_max = tracing_max_latency; | 1065 | unsigned long save_max = tr->max_latency; |
| 1061 | struct task_struct *p; | 1066 | struct task_struct *p; |
| 1062 | struct completion is_ready; | 1067 | struct completion is_ready; |
| 1063 | unsigned long count; | 1068 | unsigned long count; |
| @@ -1083,7 +1088,7 @@ trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr) | |||
| 1083 | } | 1088 | } |
| 1084 | 1089 | ||
| 1085 | /* reset the max latency */ | 1090 | /* reset the max latency */ |
| 1086 | tracing_max_latency = 0; | 1091 | tr->max_latency = 0; |
| 1087 | 1092 | ||
| 1088 | while (p->on_rq) { | 1093 | while (p->on_rq) { |
| 1089 | /* | 1094 | /* |
| @@ -1113,7 +1118,7 @@ trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr) | |||
| 1113 | trace->reset(tr); | 1118 | trace->reset(tr); |
| 1114 | tracing_start(); | 1119 | tracing_start(); |
| 1115 | 1120 | ||
| 1116 | tracing_max_latency = save_max; | 1121 | tr->max_latency = save_max; |
| 1117 | 1122 | ||
| 1118 | /* kill the thread */ | 1123 | /* kill the thread */ |
| 1119 | kthread_stop(p); | 1124 | kthread_stop(p); |
