Commit f01eb364 authored by Linus Torvalds's avatar Linus Torvalds

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

As shown by the previous patch (6698e347: "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: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6698e347
...@@ -122,8 +122,10 @@ void __lockfunc _lock_kernel(const char *func, const char *file, int line) ...@@ -122,8 +122,10 @@ void __lockfunc _lock_kernel(const char *func, const char *file, int line)
trace_lock_kernel(func, file, line); trace_lock_kernel(func, file, line);
if (likely(!depth)) if (likely(!depth)) {
might_sleep();
__lock_kernel(); __lock_kernel();
}
current->lock_depth = depth; current->lock_depth = depth;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment