diff options
author | Steven Rostedt <rostedt@goodmis.org> | 2008-10-04 02:01:00 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-10-14 04:39:20 -0400 |
commit | 3ea2e6d71aafe35b8aaf89ed711a283815acfae6 (patch) | |
tree | e4bae61f9bbe5ff7ccf6eac95416b98ebd4974a4 /kernel | |
parent | bf41a158cacba6ca5fc6407a54e7ad8ce1567e2e (diff) |
ftrace: make some tracers reentrant
Now that the ring buffer is reentrant, some of the ftrace tracers
(sched_swich, debugging traces) can also be reentrant.
Note: Never make the function tracer reentrant, that can cause
recursion problems all over the kernel. The function tracer
must disable reentrancy.
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/trace.c | 10 | ||||
-rw-r--r-- | kernel/trace/trace_sched_switch.c | 10 |
2 files changed, 4 insertions, 16 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 1cd2e8143bb4..caa4051ce778 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -839,7 +839,6 @@ ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) | |||
839 | { | 839 | { |
840 | struct trace_array *tr = &global_trace; | 840 | struct trace_array *tr = &global_trace; |
841 | struct trace_array_cpu *data; | 841 | struct trace_array_cpu *data; |
842 | long disabled; | ||
843 | int cpu; | 842 | int cpu; |
844 | int pc; | 843 | int pc; |
845 | 844 | ||
@@ -850,12 +849,10 @@ ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) | |||
850 | preempt_disable_notrace(); | 849 | preempt_disable_notrace(); |
851 | cpu = raw_smp_processor_id(); | 850 | cpu = raw_smp_processor_id(); |
852 | data = tr->data[cpu]; | 851 | data = tr->data[cpu]; |
853 | disabled = atomic_inc_return(&data->disabled); | ||
854 | 852 | ||
855 | if (likely(disabled == 1)) | 853 | if (likely(!atomic_read(&data->disabled))) |
856 | ftrace_trace_special(tr, data, arg1, arg2, arg3, pc); | 854 | ftrace_trace_special(tr, data, arg1, arg2, arg3, pc); |
857 | 855 | ||
858 | atomic_dec(&data->disabled); | ||
859 | preempt_enable_notrace(); | 856 | preempt_enable_notrace(); |
860 | } | 857 | } |
861 | 858 | ||
@@ -2961,7 +2958,6 @@ int trace_vprintk(unsigned long ip, const char *fmt, va_list args) | |||
2961 | struct trace_array_cpu *data; | 2958 | struct trace_array_cpu *data; |
2962 | struct print_entry *entry; | 2959 | struct print_entry *entry; |
2963 | unsigned long flags, irq_flags; | 2960 | unsigned long flags, irq_flags; |
2964 | long disabled; | ||
2965 | int cpu, len = 0, size, pc; | 2961 | int cpu, len = 0, size, pc; |
2966 | 2962 | ||
2967 | if (!tr->ctrl || tracing_disabled) | 2963 | if (!tr->ctrl || tracing_disabled) |
@@ -2971,9 +2967,8 @@ int trace_vprintk(unsigned long ip, const char *fmt, va_list args) | |||
2971 | preempt_disable_notrace(); | 2967 | preempt_disable_notrace(); |
2972 | cpu = raw_smp_processor_id(); | 2968 | cpu = raw_smp_processor_id(); |
2973 | data = tr->data[cpu]; | 2969 | data = tr->data[cpu]; |
2974 | disabled = atomic_inc_return(&data->disabled); | ||
2975 | 2970 | ||
2976 | if (unlikely(disabled != 1)) | 2971 | if (unlikely(atomic_read(&data->disabled))) |
2977 | goto out; | 2972 | goto out; |
2978 | 2973 | ||
2979 | spin_lock_irqsave(&trace_buf_lock, flags); | 2974 | spin_lock_irqsave(&trace_buf_lock, flags); |
@@ -2999,7 +2994,6 @@ int trace_vprintk(unsigned long ip, const char *fmt, va_list args) | |||
2999 | spin_unlock_irqrestore(&trace_buf_lock, flags); | 2994 | spin_unlock_irqrestore(&trace_buf_lock, flags); |
3000 | 2995 | ||
3001 | out: | 2996 | out: |
3002 | atomic_dec(&data->disabled); | ||
3003 | preempt_enable_notrace(); | 2997 | preempt_enable_notrace(); |
3004 | 2998 | ||
3005 | return len; | 2999 | return len; |
diff --git a/kernel/trace/trace_sched_switch.c b/kernel/trace/trace_sched_switch.c index c7fa08a5b7f4..b8f56beb1a62 100644 --- a/kernel/trace/trace_sched_switch.c +++ b/kernel/trace/trace_sched_switch.c | |||
@@ -24,7 +24,6 @@ probe_sched_switch(struct rq *__rq, struct task_struct *prev, | |||
24 | { | 24 | { |
25 | struct trace_array_cpu *data; | 25 | struct trace_array_cpu *data; |
26 | unsigned long flags; | 26 | unsigned long flags; |
27 | long disabled; | ||
28 | int cpu; | 27 | int cpu; |
29 | int pc; | 28 | int pc; |
30 | 29 | ||
@@ -41,12 +40,10 @@ probe_sched_switch(struct rq *__rq, struct task_struct *prev, | |||
41 | local_irq_save(flags); | 40 | local_irq_save(flags); |
42 | cpu = raw_smp_processor_id(); | 41 | cpu = raw_smp_processor_id(); |
43 | data = ctx_trace->data[cpu]; | 42 | data = ctx_trace->data[cpu]; |
44 | disabled = atomic_inc_return(&data->disabled); | ||
45 | 43 | ||
46 | if (likely(disabled == 1)) | 44 | if (likely(!atomic_read(&data->disabled))) |
47 | tracing_sched_switch_trace(ctx_trace, data, prev, next, flags, pc); | 45 | tracing_sched_switch_trace(ctx_trace, data, prev, next, flags, pc); |
48 | 46 | ||
49 | atomic_dec(&data->disabled); | ||
50 | local_irq_restore(flags); | 47 | local_irq_restore(flags); |
51 | } | 48 | } |
52 | 49 | ||
@@ -55,7 +52,6 @@ probe_sched_wakeup(struct rq *__rq, struct task_struct *wakee) | |||
55 | { | 52 | { |
56 | struct trace_array_cpu *data; | 53 | struct trace_array_cpu *data; |
57 | unsigned long flags; | 54 | unsigned long flags; |
58 | long disabled; | ||
59 | int cpu, pc; | 55 | int cpu, pc; |
60 | 56 | ||
61 | if (!likely(tracer_enabled)) | 57 | if (!likely(tracer_enabled)) |
@@ -67,13 +63,11 @@ probe_sched_wakeup(struct rq *__rq, struct task_struct *wakee) | |||
67 | local_irq_save(flags); | 63 | local_irq_save(flags); |
68 | cpu = raw_smp_processor_id(); | 64 | cpu = raw_smp_processor_id(); |
69 | data = ctx_trace->data[cpu]; | 65 | data = ctx_trace->data[cpu]; |
70 | disabled = atomic_inc_return(&data->disabled); | ||
71 | 66 | ||
72 | if (likely(disabled == 1)) | 67 | if (likely(!atomic_read(&data->disabled))) |
73 | tracing_sched_wakeup_trace(ctx_trace, data, wakee, current, | 68 | tracing_sched_wakeup_trace(ctx_trace, data, wakee, current, |
74 | flags, pc); | 69 | flags, pc); |
75 | 70 | ||
76 | atomic_dec(&data->disabled); | ||
77 | local_irq_restore(flags); | 71 | local_irq_restore(flags); |
78 | } | 72 | } |
79 | 73 | ||