projects/linux·commit 256a6b41

[PATCH] lockdep: fix printk recursion logic

256a6b41 · Ingo Molnar <[email protected]> · 2006-10-11 01:22:08 -07:00

Bug reported and fixed by Tilman Schmidt <[email protected]>: 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 <[email protected]>
Cc: Tilman Schmidt <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Commit
256a6b41365e17cebe5c2fc91ddff716c9aa055a
Parents
5fcce743

Changes

1 files changed · +2 −9

FileStatusAddDelContent
kernel/printk.cmodified+2−9View file

kernel/printk.c

View file
diff --git a/kernel/printk.c b/kernel/printk.c
index 771f5e8..f7d427e 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -820,15 +820,8 @@ void release_console_sem(void)
console_locked = 0;
up(&console_sem);
spin_unlock_irqrestore(&logbuf_lock, flags);
- 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);
- }
+ if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait))
+ wake_up_interruptible(&log_wait);
}
EXPORT_SYMBOL(release_console_sem);