Messages in this thread Patch in this message | | | Date | Sat, 12 Dec 2009 22:48:41 +0100 (CET) | From | Thomas Gleixner <> | Subject | Re: [GIT PATCH] TTY patches for 2.6.33-git |
| |
On Sat, 12 Dec 2009, Alan Cox wrote: > > I think we could possibly add a "__might_sleep()" to _lock_kernel(). It > > doesn't really sleep, but it's invalid to take the kernel lock in an > > atomic region, so __might_sleep() might be the right thing anyway. > > It's only invalid if you don't already hold the lock. The old tty code > worked because every path into tty_fasync already held the lock ! That > specific case - taking it the first time should definitely > __might_sleep(). > > Mind you it's probably still rather dumb and would be a good debugging > aid for -next to be able to warn on all offences if only to catch this > stuff for the future BKL removal work.
Just patched the following in and it catched your problem nicely. With your AB/BA fix patch applied everything is fine.
Thanks,
tglx --- Subject: BKL: Add might sleep to __lock_kernel From: Thomas Gleixner <tglx@linutronix.de> Date: Sat, 12 Dec 2009 20:29:00 +0100
Catches all offenders which take the BKL first time in an atomic region. Recursive lock_kernel calls are not affected.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- lib/kernel_lock.c | 2 ++ 1 file changed, 2 insertions(+)
Index: linux-2.6/lib/kernel_lock.c =================================================================== --- linux-2.6.orig/lib/kernel_lock.c +++ linux-2.6/lib/kernel_lock.c @@ -64,6 +64,8 @@ void __lockfunc __release_kernel_lock(vo #ifdef CONFIG_PREEMPT static inline void __lock_kernel(void) { + might_sleep(); + preempt_disable(); if (unlikely(!_raw_spin_trylock(&kernel_flag))) { /*
| |