Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757622AbYHHSP4 (ORCPT ); Fri, 8 Aug 2008 14:15:56 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752200AbYHHSPs (ORCPT ); Fri, 8 Aug 2008 14:15:48 -0400 Received: from casper.infradead.org ([85.118.1.10]:56034 "EHLO casper.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751713AbYHHSPr (ORCPT ); Fri, 8 Aug 2008 14:15:47 -0400 Subject: [PATCH] printk: robustify printk From: Peter Zijlstra To: Linus Torvalds Cc: Andrew Morton , mingo@elte.hu, tglx@linutronix.de, marcin.slusarz@gmail.com, linux-kernel@vger.kernel.org, David Miller , Steven Rostedt , Paul E McKenney In-Reply-To: References: <20080324122424.671168000@chello.nl> <1206382547.6437.131.camel@lappy> <20080324115738.85c72bb5.akpm@linux-foundation.org> <1218202249.8625.106.camel@twins> <1218215454.8625.133.camel@twins> <1218217257.29098.2.camel@lappy.programming.kicks-ass.net> Content-Type: text/plain Date: Fri, 08 Aug 2008 20:14:28 +0200 Message-Id: <1218219269.29098.5.camel@lappy.programming.kicks-ass.net> Mime-Version: 1.0 X-Mailer: Evolution 2.22.3.1 Content-Transfer-Encoding: 7bit X-Bad-Reply: References and In-Reply-To but no 'Re:' in Subject. Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1546 Lines: 65 Avoid deadlocks against rq->lock and xtime_lock by using RCU to defer the klogd wakeup. Signed-off-by: Peter Zijlstra Acked-by: Steven Rostedt --- diff --git a/kernel/printk.c b/kernel/printk.c index b51b156..8870c2e 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -32,6 +32,7 @@ #include #include #include +#include #include @@ -982,10 +983,37 @@ int is_console_locked(void) return console_locked; } +struct klogd_wakeup_state { + struct rcu_head head; + int pending; +}; + +DEFINE_PER_CPU(struct klogd_wakeup_state, kws); + +void __wake_up_klogd(struct rcu_head *head) +{ + struct klogd_wakeup_state *kws = + container_of(head, struct klogd_wakeup_state, head); + + wake_up_interruptible(&log_wait); + kws->pending = 0; +} + void wake_up_klogd(void) { - if (!oops_in_progress && waitqueue_active(&log_wait)) - wake_up_interruptible(&log_wait); + unsigned long flags; + struct klogd_wakeup_state *kws; + + if (!waitqueue_active(&log_wait)) + return; + + local_irq_save(flags); + kws = &__get_cpu_var(kws); + if (!kws->pending) { + kws->pending = 1; + call_rcu(&kws->head, __wake_up_klogd); + } + local_irq_restore(flags); } /** -- 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/