Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id ; Thu, 22 Aug 2002 08:05:11 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id ; Thu, 22 Aug 2002 08:05:11 -0400 Received: from dell-paw-3.cambridge.redhat.com ([195.224.55.237]:37622 "EHLO executor.cambridge.redhat.com") by vger.kernel.org with ESMTP id ; Thu, 22 Aug 2002 08:05:10 -0400 To: torvalds@transmeta.com Cc: linux-kernel@vger.kernel.org, dhowells@redhat.com Subject: [PATCH] printk simultaneous oops disentangling User-Agent: EMH/1.14.1 SEMI/1.14.3 (Ushinoya) FLIM/1.14.3 (=?ISO-8859-4?Q?Unebigory=F2mae?=) APEL/10.3 Emacs/21.2 (i386-redhat-linux-gnu) MULE/5.0 (SAKAKI) MIME-Version: 1.0 (generated by SEMI 1.14.3 - "Ushinoya") Content-Type: text/plain; charset=US-ASCII Date: Thu, 22 Aug 2002 13:09:18 +0100 Message-ID: <12669.1030018158@warthog.cambridge.redhat.com> From: David Howells Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2184 Lines: 69 Hi Linus, Here's a patch to stop multiple simultaneous oopses on an SMP system from interleaving with and overwriting bits of each other. It only permits lock breaking if the printk lock is held by the same CPU. David --- linux-2.5.31/kernel/printk.c Mon Jul 22 11:58:29 2002 +++ linux-trace-2531/kernel/printk.c Thu Aug 22 12:51:24 2002 @@ -390,6 +390,9 @@ logged_chars++; } +/* cpu currently holding logbuf_lock */ +static volatile int printk_cpu = -1; + /* * This is printk. It can be called from any context. We want it to work. * @@ -412,8 +415,9 @@ static char printk_buf[1024]; static int log_level_unknown = 1; - if (oops_in_progress) { - /* If a crash is occurring, make sure we can't deadlock */ + if (oops_in_progress && printk_cpu==smp_processor_id()) { + /* If a crash is occurring during printk() on this CPU, + * make sure we can't deadlock */ spin_lock_init(&logbuf_lock); /* And make sure that we print immediately */ init_MUTEX(&console_sem); @@ -421,6 +425,7 @@ /* This stops the holder of console_sem just where we want him */ spin_lock_irqsave(&logbuf_lock, flags); + printk_cpu = smp_processor_id(); /* Emit the output into the temporary buffer */ va_start(args, fmt); @@ -450,6 +455,7 @@ * On some architectures, the consoles are not usable * on secondary CPUs early in the boot process. */ + printk_cpu = -1; spin_unlock_irqrestore(&logbuf_lock, flags); goto out; } @@ -458,6 +464,7 @@ * We own the drivers. We can drop the spinlock and let * release_console_sem() print the text */ + printk_cpu = -1; spin_unlock_irqrestore(&logbuf_lock, flags); console_may_schedule = 0; release_console_sem(); @@ -467,6 +474,7 @@ * allows the semaphore holder to proceed and to call the * console drivers with the output which we just produced. */ + printk_cpu = -1; spin_unlock_irqrestore(&logbuf_lock, flags); } out: - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/