diff options
author | Ingo Molnar <mingo@elte.hu> | 2006-10-11 04:22:08 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-11 14:14:24 -0400 |
commit | 256a6b41365e17cebe5c2fc91ddff716c9aa055a (patch) | |
tree | c491008b3e2fefed6a42ac7f824d191e023fb11f | |
parent | 5fcce7432a731e67f1cd3ef1e71dca9ea84dedb1 (diff) |
[PATCH] lockdep: fix printk recursion logic
Bug reported and fixed by Tilman Schmidt <tilman@imap.cc>: if lockdep is
enabled then log messages make it to /var/log/messages belatedly. The
reason is a missed wakeup of klogd.
Initially there was only a lockdep_internal() protection against lockdep
recursion within vprintk() - it grew the 'outer' lockdep_off()/on()
protection only later on. But that lockdep_off() made the
release_console_sem() within vprintk() always happen under the
lockdep_internal() condition, causing the bug.
The right solution to remove the inner protection against recursion here -
the outer one is enough.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Cc: Tilman Schmidt <tilman@imap.cc>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | kernel/printk.c | 11 |
1 files changed, 2 insertions, 9 deletions
diff --git a/kernel/printk.c b/kernel/printk.c index 771f5e861bcd..f7d427ef5038 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
@@ -820,15 +820,8 @@ void release_console_sem(void) | |||
820 | console_locked = 0; | 820 | console_locked = 0; |
821 | up(&console_sem); | 821 | up(&console_sem); |
822 | spin_unlock_irqrestore(&logbuf_lock, flags); | 822 | spin_unlock_irqrestore(&logbuf_lock, flags); |
823 | if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait)) { | 823 | if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait)) |
824 | /* | 824 | wake_up_interruptible(&log_wait); |
825 | * If we printk from within the lock dependency code, | ||
826 | * from within the scheduler code, then do not lock | ||
827 | * up due to self-recursion: | ||
828 | */ | ||
829 | if (!lockdep_internal()) | ||
830 | wake_up_interruptible(&log_wait); | ||
831 | } | ||
832 | } | 825 | } |
833 | EXPORT_SYMBOL(release_console_sem); | 826 | EXPORT_SYMBOL(release_console_sem); |
834 | 827 | ||