[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>
This commit is contained in:
committed by
Linus Torvalds
parent
5fcce7432a
commit
256a6b4136
@@ -820,15 +820,8 @@ void release_console_sem(void)
|
|||||||
console_locked = 0;
|
console_locked = 0;
|
||||||
up(&console_sem);
|
up(&console_sem);
|
||||||
spin_unlock_irqrestore(&logbuf_lock, flags);
|
spin_unlock_irqrestore(&logbuf_lock, flags);
|
||||||
if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait)) {
|
if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait))
|
||||||
/*
|
|
||||||
* If we printk from within the lock dependency code,
|
|
||||||
* from within the scheduler code, then do not lock
|
|
||||||
* up due to self-recursion:
|
|
||||||
*/
|
|
||||||
if (!lockdep_internal())
|
|
||||||
wake_up_interruptible(&log_wait);
|
wake_up_interruptible(&log_wait);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(release_console_sem);
|
EXPORT_SYMBOL(release_console_sem);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user