These patches fix up issues with interspersed output from multiple simultaneous calls to warn or dump_stack on multi-cpu systems. References: <[email protected]> Content-Disposition: inline; filename=dump-stack-serialize.patch
This patch adds functionality to serialize the output from dump_stack() to avoid mangling of the output when dump_stack is called simultaneously from multiple cpus. Cc: Vineet Gupta <[email protected]> Cc: Andrew Morton <[email protected]> Cc: David S. Miller <[email protected]> Cc: Richard Kuo <[email protected]> Cc: Jesper Nilsson <[email protected]> Reported-by: Russ Anderson <[email protected]> Reviewed-by: Robin Holt <[email protected]> Signed-off-by: Alex Thorlton <[email protected]> --- The original discussion regarding this patch can be found in this thread: [PATCH] x86: Avoid intermixing cpu dump_stack output on multi-processor systems lib/dump_stack.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) --- linux.orig/lib/dump_stack.c +++ linux/lib/dump_stack.c @@ -7,6 +7,8 @@ #include <linux/export.h> #include <linux/sched.h> +static atomic_t dump_lock = ATOMIC_INIT(-1); + /** * dump_stack - dump the current task information and its stack trace * @@ -14,7 +16,30 @@ */ void dump_stack(void) { + int was_locked; + int old; + int cpu; + + preempt_disable(); + +retry: + cpu = smp_processor_id(); + old = atomic_cmpxchg(&dump_lock, -1, cpu); + if (old == -1) { + was_locked = 0; + } else if (old == cpu) { + was_locked = 1; + } else { + cpu_relax(); + goto retry; + } + dump_stack_print_info(KERN_DEFAULT); show_stack(NULL, NULL); + + if (!was_locked) + atomic_set(&dump_lock, -1); + + preempt_enable(); } EXPORT_SYMBOL(dump_stack); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

