summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2009-08-17 19:49:19 +0200
committerClark Williams <williams@redhat.com>2012-01-16 13:00:14 -0600
commit2c3a8097e7b1befabf045eeb5e3f2de0ecdfc356 (patch)
tree498fd410f7f1f071a6eeab6b980d3fc5ead4e041 /drivers
parentf12461bac5a68e3a50cbc6fd8aaa15a76e420e81 (diff)
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/tty/tty_ldisc.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c
index 8e0924f55446..820f7dc90061 100644
--- a/drivers/tty/tty_ldisc.c
+++ b/drivers/tty/tty_ldisc.c
@@ -71,7 +71,7 @@ static void put_ldisc(struct tty_ldisc *ld)
* 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;
@@ -82,7 +82,7 @@ static void put_ldisc(struct tty_ldisc *ld)
kfree(ld);
return;
}
- local_irq_restore(flags);
+ local_irq_restore_nort(flags);
wake_up(&tty_ldisc_idle);
}