Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[BKL] add 'might_sleep()' to the outermost lock taker

As shown by the previous patch (6698e3472: "tty: Fix BKL taken under a
spinlock bug introduced in the BKL split") the BKL removal is prone to
some subtle issues, where removing the BKL in one place may in fact make
a previously nested BKL call the new outer call, and then prone to nasty
deadlocks with other spinlocks.

In general, we should never take the BKL while we're holding a spinlock,
so let's just add a "might_sleep()" to it (even though the BKL doesn't
technically sleep - at least not yet), and we'll get nice warnings the
next time this kind of problem happens during BKL removal.

Acked-and-Tested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+3 -1
+3 -1
lib/kernel_lock.c
··· 122 122 123 123 trace_lock_kernel(func, file, line); 124 124 125 - if (likely(!depth)) 125 + if (likely(!depth)) { 126 + might_sleep(); 126 127 __lock_kernel(); 128 + } 127 129 current->lock_depth = depth; 128 130 } 129 131