History

Merge branch 'linus' into sched/core

Merge reason: we want to queue up dependent cleanup

Ingo Molnar committed 15 years ago

Commit 8e9255e2 parents 5091faa 6313e3c656 files · +15300 −6997Browse files

Showing the changes to kernel/trace (1 of 656 files). Show all

Unified · Split

kernel/trace/trace.c+19−0
@@ -1283,6 +1283,8 @@ void trace_dump_stack(void) · 1282 unmodified lines
12831283 __ftrace_trace_stack(global_trace.buffer, flags, 3, preempt_count());
12841284 }
12851285
1286+static DEFINE_PER_CPU(int, user_stack_count);
1287+
12861288 void
12871289 ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, int pc)
12881290 {
@@ -1301,6 +1303,18 @@ ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, int pc) · 12 unmodified lines
13011303 if (unlikely(in_nmi()))
13021304 return;
13031305
1306+ /*
1307+ * prevent recursion, since the user stack tracing may
1308+ * trigger other kernel events.
1309+ */
1310+ preempt_disable();
1311+ if (__this_cpu_read(user_stack_count))
1312+ goto out;
1313+
1314+ __this_cpu_inc(user_stack_count);
1315+
1316+
1317+
13041318 event = trace_buffer_lock_reserve(buffer, TRACE_USER_STACK,
13051319 sizeof(*entry), flags, pc);
13061320 if (!event)
@@ -1318,6 +1332,11 @@ ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, int pc) · 11 unmodified lines
13181332 save_stack_trace_user(&trace);
13191333 if (!filter_check_discard(call, entry, buffer, event))
13201334 ring_buffer_unlock_commit(buffer, event);
1335+
1336+ __this_cpu_dec(user_stack_count);
1337+
1338+ out:
1339+ preempt_enable();
13211340 }
13221341
13231342 #ifdef UNUSED