diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2010-12-06 09:36:17 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2010-12-06 09:36:17 +0100 |
commit | 0e44e059588e1d91f3a1974d2ce3348864d1d799 (patch) | |
tree | 1161c2508bd9eeab010ebc40ef87860fd85a35fd /kernel/trace/trace.c | |
parent | 96886c4361f1ae3f6c775d7c9295e2d557101d0f (diff) | |
parent | e8a7e48bb248a1196484d3f8afa53bded2b24e71 (diff) | |
download | talos-op-linux-0e44e059588e1d91f3a1974d2ce3348864d1d799.tar.gz talos-op-linux-0e44e059588e1d91f3a1974d2ce3348864d1d799.zip |
Merge commit 'v2.6.37-rc4' into imx-for-2.6.38
Done to resolve merge conflict:
Conflicts:
arch/arm/mach-mx25/devices-imx25.h
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r-- | kernel/trace/trace.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 042084157980..c380612273bf 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1283,6 +1283,8 @@ void trace_dump_stack(void) __ftrace_trace_stack(global_trace.buffer, flags, 3, preempt_count()); } +static DEFINE_PER_CPU(int, user_stack_count); + void ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, int pc) { @@ -1301,6 +1303,18 @@ ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, int pc) if (unlikely(in_nmi())) return; + /* + * prevent recursion, since the user stack tracing may + * trigger other kernel events. + */ + preempt_disable(); + if (__this_cpu_read(user_stack_count)) + goto out; + + __this_cpu_inc(user_stack_count); + + + event = trace_buffer_lock_reserve(buffer, TRACE_USER_STACK, sizeof(*entry), flags, pc); if (!event) @@ -1318,6 +1332,11 @@ ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, int pc) save_stack_trace_user(&trace); if (!filter_check_discard(call, entry, buffer, event)) ring_buffer_unlock_commit(buffer, event); + + __this_cpu_dec(user_stack_count); + + out: + preempt_enable(); } #ifdef UNUSED |