From ae4efd9cdffde2e0bb4d06c99121f389346ec9a2 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Wed, 22 Jun 2011 11:20:09 +0200 Subject: [PATCH] --- yaml --- r: 256996 b: refs/heads/master c: 4f2a8d3cf5e0486fd547633fa86c5d130ae98cad h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/printk.c | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 0a08e389639a..867e543e1c5c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0b5e1c5255e7ee8670e077e8224e5c2281229a5b +refs/heads/master: 4f2a8d3cf5e0486fd547633fa86c5d130ae98cad diff --git a/trunk/kernel/printk.c b/trunk/kernel/printk.c index 751e7b84e9e3..37dff3429adb 100644 --- a/trunk/kernel/printk.c +++ b/trunk/kernel/printk.c @@ -1244,7 +1244,7 @@ void console_unlock(void) { unsigned long flags; unsigned _con_start, _log_end; - unsigned wake_klogd = 0; + unsigned wake_klogd = 0, retry = 0; if (console_suspended) { up(&console_sem); @@ -1253,6 +1253,7 @@ void console_unlock(void) console_may_schedule = 0; +again: for ( ; ; ) { spin_lock_irqsave(&logbuf_lock, flags); wake_klogd |= log_start - log_end; @@ -1273,8 +1274,23 @@ void console_unlock(void) if (unlikely(exclusive_console)) exclusive_console = NULL; - spin_unlock_irqrestore(&logbuf_lock, flags); + spin_unlock(&logbuf_lock); + up(&console_sem); + + /* + * Someone could have filled up the buffer again, so re-check if there's + * something to flush. In case we cannot trylock the console_sem again, + * there's a new owner and the console_unlock() from them will do the + * flush, no worries. + */ + spin_lock(&logbuf_lock); + if (con_start != log_end) + retry = 1; + spin_unlock_irqrestore(&logbuf_lock, flags); + if (retry && console_trylock()) + goto again; + if (wake_klogd) wake_up_klogd(); }