blob: cecab62c563e928b646add40ba32d46b8c3700e0 [file] [log] [blame]
From: Thomas Gleixner <tglx@linutronix.de>
Date: Mon, 17 Aug 2009 19:49:19 +0200
Subject: tty: Do not disable interrupts in put_ldisc on -rt
Fixes the following on PREEMPT_RT:
BUG: sleeping function called from invalid context at kernel/rtmutex.c:684
in_atomic(): 0, irqs_disabled(): 1, pid: 9116, name: sshd
Pid: 9116, comm: sshd Not tainted 2.6.31-rc6-rt2 #6
Call Trace:
[<ffffffff81034a4f>] __might_sleep+0xec/0xee
[<ffffffff812fbc6d>] rt_spin_lock+0x34/0x75
[ffffffff81064a83>] atomic_dec_and_spin_lock+0x36/0x54
[<ffffffff811df7c7>] put_ldisc+0x57/0xa6
[<ffffffff811dfb87>] tty_ldisc_hangup+0xe7/0x19f
[<ffffffff811d9224>] do_tty_hangup+0xff/0x319
[<ffffffff811d9453>] tty_vhangup+0x15/0x17
[<ffffffff811e1263>] pty_close+0x127/0x12b
[<ffffffff811dac41>] tty_release_dev+0x1ad/0x4c0
....
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/tty/tty_ldisc.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: linux-stable/drivers/tty/tty_ldisc.c
===================================================================
--- linux-stable.orig/drivers/tty/tty_ldisc.c
+++ linux-stable/drivers/tty/tty_ldisc.c
@@ -52,7 +52,7 @@ static void put_ldisc(struct tty_ldisc *
* We really want an "atomic_dec_and_lock_irqsave()",
* but we don't have it, so this does it by hand.
*/
- local_irq_save(flags);
+ local_irq_save_nort(flags);
if (atomic_dec_and_lock(&ld->users, &tty_ldisc_lock)) {
struct tty_ldisc_ops *ldo = ld->ops;
@@ -63,7 +63,7 @@ static void put_ldisc(struct tty_ldisc *
kfree(ld);
return;
}
- local_irq_restore(flags);
+ local_irq_restore_nort(flags);
wake_up(&ld->wq_idle);
}