diff options
Diffstat (limited to 'kernel/trace/trace_selftest.c')
-rw-r--r-- | kernel/trace/trace_selftest.c | 151 |
1 files changed, 4 insertions, 147 deletions
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index 81003b4d617f..155a415b3209 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c | |||
@@ -13,12 +13,9 @@ static inline int trace_valid_entry(struct trace_entry *entry) | |||
13 | case TRACE_WAKE: | 13 | case TRACE_WAKE: |
14 | case TRACE_STACK: | 14 | case TRACE_STACK: |
15 | case TRACE_PRINT: | 15 | case TRACE_PRINT: |
16 | case TRACE_SPECIAL: | ||
17 | case TRACE_BRANCH: | 16 | case TRACE_BRANCH: |
18 | case TRACE_GRAPH_ENT: | 17 | case TRACE_GRAPH_ENT: |
19 | case TRACE_GRAPH_RET: | 18 | case TRACE_GRAPH_RET: |
20 | case TRACE_HW_BRANCHES: | ||
21 | case TRACE_KSYM: | ||
22 | return 1; | 19 | return 1; |
23 | } | 20 | } |
24 | return 0; | 21 | return 0; |
@@ -30,7 +27,7 @@ static int trace_test_buffer_cpu(struct trace_array *tr, int cpu) | |||
30 | struct trace_entry *entry; | 27 | struct trace_entry *entry; |
31 | unsigned int loops = 0; | 28 | unsigned int loops = 0; |
32 | 29 | ||
33 | while ((event = ring_buffer_consume(tr->buffer, cpu, NULL))) { | 30 | while ((event = ring_buffer_consume(tr->buffer, cpu, NULL, NULL))) { |
34 | entry = ring_buffer_event_data(event); | 31 | entry = ring_buffer_event_data(event); |
35 | 32 | ||
36 | /* | 33 | /* |
@@ -256,7 +253,8 @@ trace_selftest_startup_function(struct tracer *trace, struct trace_array *tr) | |||
256 | /* Maximum number of functions to trace before diagnosing a hang */ | 253 | /* Maximum number of functions to trace before diagnosing a hang */ |
257 | #define GRAPH_MAX_FUNC_TEST 100000000 | 254 | #define GRAPH_MAX_FUNC_TEST 100000000 |
258 | 255 | ||
259 | static void __ftrace_dump(bool disable_tracing); | 256 | static void |
257 | __ftrace_dump(bool disable_tracing, enum ftrace_dump_mode oops_dump_mode); | ||
260 | static unsigned int graph_hang_thresh; | 258 | static unsigned int graph_hang_thresh; |
261 | 259 | ||
262 | /* Wrap the real function entry probe to avoid possible hanging */ | 260 | /* Wrap the real function entry probe to avoid possible hanging */ |
@@ -267,7 +265,7 @@ static int trace_graph_entry_watchdog(struct ftrace_graph_ent *trace) | |||
267 | ftrace_graph_stop(); | 265 | ftrace_graph_stop(); |
268 | printk(KERN_WARNING "BUG: Function graph tracer hang!\n"); | 266 | printk(KERN_WARNING "BUG: Function graph tracer hang!\n"); |
269 | if (ftrace_dump_on_oops) | 267 | if (ftrace_dump_on_oops) |
270 | __ftrace_dump(false); | 268 | __ftrace_dump(false, DUMP_ALL); |
271 | return 0; | 269 | return 0; |
272 | } | 270 | } |
273 | 271 | ||
@@ -691,38 +689,6 @@ trace_selftest_startup_sched_switch(struct tracer *trace, struct trace_array *tr | |||
691 | } | 689 | } |
692 | #endif /* CONFIG_CONTEXT_SWITCH_TRACER */ | 690 | #endif /* CONFIG_CONTEXT_SWITCH_TRACER */ |
693 | 691 | ||
694 | #ifdef CONFIG_SYSPROF_TRACER | ||
695 | int | ||
696 | trace_selftest_startup_sysprof(struct tracer *trace, struct trace_array *tr) | ||
697 | { | ||
698 | unsigned long count; | ||
699 | int ret; | ||
700 | |||
701 | /* start the tracing */ | ||
702 | ret = tracer_init(trace, tr); | ||
703 | if (ret) { | ||
704 | warn_failed_init_tracer(trace, ret); | ||
705 | return ret; | ||
706 | } | ||
707 | |||
708 | /* Sleep for a 1/10 of a second */ | ||
709 | msleep(100); | ||
710 | /* stop the tracing. */ | ||
711 | tracing_stop(); | ||
712 | /* check the trace buffer */ | ||
713 | ret = trace_test_buffer(tr, &count); | ||
714 | trace->reset(tr); | ||
715 | tracing_start(); | ||
716 | |||
717 | if (!ret && !count) { | ||
718 | printk(KERN_CONT ".. no entries found .."); | ||
719 | ret = -1; | ||
720 | } | ||
721 | |||
722 | return ret; | ||
723 | } | ||
724 | #endif /* CONFIG_SYSPROF_TRACER */ | ||
725 | |||
726 | #ifdef CONFIG_BRANCH_TRACER | 692 | #ifdef CONFIG_BRANCH_TRACER |
727 | int | 693 | int |
728 | trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr) | 694 | trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr) |
@@ -755,112 +721,3 @@ trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr) | |||
755 | } | 721 | } |
756 | #endif /* CONFIG_BRANCH_TRACER */ | 722 | #endif /* CONFIG_BRANCH_TRACER */ |
757 | 723 | ||
758 | #ifdef CONFIG_HW_BRANCH_TRACER | ||
759 | int | ||
760 | trace_selftest_startup_hw_branches(struct tracer *trace, | ||
761 | struct trace_array *tr) | ||
762 | { | ||
763 | struct trace_iterator *iter; | ||
764 | struct tracer tracer; | ||
765 | unsigned long count; | ||
766 | int ret; | ||
767 | |||
768 | if (!trace->open) { | ||
769 | printk(KERN_CONT "missing open function..."); | ||
770 | return -1; | ||
771 | } | ||
772 | |||
773 | ret = tracer_init(trace, tr); | ||
774 | if (ret) { | ||
775 | warn_failed_init_tracer(trace, ret); | ||
776 | return ret; | ||
777 | } | ||
778 | |||
779 | /* | ||
780 | * The hw-branch tracer needs to collect the trace from the various | ||
781 | * cpu trace buffers - before tracing is stopped. | ||
782 | */ | ||
783 | iter = kzalloc(sizeof(*iter), GFP_KERNEL); | ||
784 | if (!iter) | ||
785 | return -ENOMEM; | ||
786 | |||
787 | memcpy(&tracer, trace, sizeof(tracer)); | ||
788 | |||
789 | iter->trace = &tracer; | ||
790 | iter->tr = tr; | ||
791 | iter->pos = -1; | ||
792 | mutex_init(&iter->mutex); | ||
793 | |||
794 | trace->open(iter); | ||
795 | |||
796 | mutex_destroy(&iter->mutex); | ||
797 | kfree(iter); | ||
798 | |||
799 | tracing_stop(); | ||
800 | |||
801 | ret = trace_test_buffer(tr, &count); | ||
802 | trace->reset(tr); | ||
803 | tracing_start(); | ||
804 | |||
805 | if (!ret && !count) { | ||
806 | printk(KERN_CONT "no entries found.."); | ||
807 | ret = -1; | ||
808 | } | ||
809 | |||
810 | return ret; | ||
811 | } | ||
812 | #endif /* CONFIG_HW_BRANCH_TRACER */ | ||
813 | |||
814 | #ifdef CONFIG_KSYM_TRACER | ||
815 | static int ksym_selftest_dummy; | ||
816 | |||
817 | int | ||
818 | trace_selftest_startup_ksym(struct tracer *trace, struct trace_array *tr) | ||
819 | { | ||
820 | unsigned long count; | ||
821 | int ret; | ||
822 | |||
823 | /* start the tracing */ | ||
824 | ret = tracer_init(trace, tr); | ||
825 | if (ret) { | ||
826 | warn_failed_init_tracer(trace, ret); | ||
827 | return ret; | ||
828 | } | ||
829 | |||
830 | ksym_selftest_dummy = 0; | ||
831 | /* Register the read-write tracing request */ | ||
832 | |||
833 | ret = process_new_ksym_entry("ksym_selftest_dummy", | ||
834 | HW_BREAKPOINT_R | HW_BREAKPOINT_W, | ||
835 | (unsigned long)(&ksym_selftest_dummy)); | ||
836 | |||
837 | if (ret < 0) { | ||
838 | printk(KERN_CONT "ksym_trace read-write startup test failed\n"); | ||
839 | goto ret_path; | ||
840 | } | ||
841 | /* Perform a read and a write operation over the dummy variable to | ||
842 | * trigger the tracer | ||
843 | */ | ||
844 | if (ksym_selftest_dummy == 0) | ||
845 | ksym_selftest_dummy++; | ||
846 | |||
847 | /* stop the tracing. */ | ||
848 | tracing_stop(); | ||
849 | /* check the trace buffer */ | ||
850 | ret = trace_test_buffer(tr, &count); | ||
851 | trace->reset(tr); | ||
852 | tracing_start(); | ||
853 | |||
854 | /* read & write operations - one each is performed on the dummy variable | ||
855 | * triggering two entries in the trace buffer | ||
856 | */ | ||
857 | if (!ret && count != 2) { | ||
858 | printk(KERN_CONT "Ksym tracer startup test failed"); | ||
859 | ret = -1; | ||
860 | } | ||
861 | |||
862 | ret_path: | ||
863 | return ret; | ||
864 | } | ||
865 | #endif /* CONFIG_KSYM_TRACER */ | ||
866 | |||