| From 001f3f134dee0ca96ae61a9a24430ed4640b89cf Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Mon, 17 Aug 2009 19:49:19 +0200 |
| Subject: [PATCH 072/256] 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(-) |
| |
| diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c |
| index 24b95db..7894759 100644 |
| --- a/drivers/tty/tty_ldisc.c |
| +++ b/drivers/tty/tty_ldisc.c |
| @@ -53,7 +53,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; |
| |
| @@ -64,7 +64,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); |
| } |
| |
| -- |
| 1.7.10.4 |
| |