Fix sleeping with interrupts disabled warning in simserial.c:

BUG: sleeping function called from invalid context at mm/slub.c:925
in_atomic(): 0, irqs_disabled(): 1, pid: 1, name: init

Call Trace:
 [<a000000100011180>] show_stack+0x40/0x90
                                sp=e0000000070b7b40 bsp=e0000000070b12c8
 [<a000000100563e20>] dump_stack+0x20/0x40
                                sp=e0000000070b7d10 bsp=e0000000070b12b0
 [<a000000100090220>] __might_sleep+0x1e0/0x200
                                sp=e0000000070b7d10 bsp=e0000000070b1280
 [<a00000010012f060>] kmem_cache_alloc+0x70/0x430
                                sp=e0000000070b7d10 bsp=e0000000070b1230
 [<a0000001000af8c0>] request_threaded_irq+0x150/0x370
                                sp=e0000000070b7d20 bsp=e0000000070b11c0
 [<a0000001003c3b30>] activate+0x180/0x350
                                sp=e0000000070b7d20 bsp=e0000000070b1188
 [<a00000010033d2b0>] tty_port_open+0x1b0/0x280
                                sp=e0000000070b7d20 bsp=e0000000070b1140
 [<a0000001003c42b0>] rs_open+0x150/0x1a0
                                sp=e0000000070b7d20 bsp=e0000000070b1118
 [<a00000010032d930>] tty_open+0x790/0xb00
                                sp=e0000000070b7d20 bsp=e0000000070b1038
 [<a000000100144d10>] chrdev_open+0x250/0x2d0
                                sp=e0000000070b7d30 bsp=e0000000070b0ff0
 [<a000000100138b40>] do_dentry_open.isra.14+0x3d0/0x650
                                sp=e0000000070b7d40 bsp=e0000000070b0f80
 [<a00000010013a8e0>] finish_open+0x90/0xc0
                                sp=e0000000070b7d40 bsp=e0000000070b0f48
 [<a0000001001579d0>] do_last.isra.41+0x1490/0x18c0
                                sp=e0000000070b7d40 bsp=e0000000070b0e60
 [<a000000100157f60>] path_openat.isra.42+0x160/0xa00
                                sp=e0000000070b7d60 bsp=e0000000070b0d58
 [<a000000100158830>] do_filp_open+0x30/0xb0
                                sp=e0000000070b7d90 bsp=e0000000070b0d20
 [<a00000010013b190>] do_sys_open+0x200/0x330
                                sp=e0000000070b7e20 bsp=e0000000070b0cb8
 [<a00000010013b310>] sys_open+0x50/0x70
                                sp=e0000000070b7e30 bsp=e0000000070b0c60
 [<a00000010000b340>] ia64_ret_from_syscall+0x0/0x20
                                sp=e0000000070b7e30 bsp=e0000000070b0c60
 [<a000000000040720>] ia64_ivt+0xffffffff00040720/0x400
                                sp=e0000000070b8000 bsp=e0000000070b0c60

Signed-off-by: Mikulas Patocka <mpato...@redhat.com>

---
 arch/ia64/hp/sim/simserial.c |   20 +++++++++-----------
 1 file changed, 9 insertions(+), 11 deletions(-)

Index: linux-2.6-ia64/arch/ia64/hp/sim/simserial.c
===================================================================
--- linux-2.6-ia64.orig/arch/ia64/hp/sim/simserial.c    2014-01-23 
23:06:12.000000000 +0100
+++ linux-2.6-ia64/arch/ia64/hp/sim/simserial.c 2014-01-23 23:13:44.000000000 
+0100
@@ -365,7 +365,6 @@ static int activate(struct tty_port *por
        struct serial_state *state = container_of(port, struct serial_state,
                        port);
        unsigned long flags, page;
-       int retval = 0;
 
        page = get_zeroed_page(GFP_KERNEL);
        if (!page)
@@ -378,13 +377,6 @@ static int activate(struct tty_port *por
        else
                state->xmit.buf = (unsigned char *) page;
 
-       if (state->irq) {
-               retval = request_irq(state->irq, rs_interrupt_single, 0,
-                               "simserial", state);
-               if (retval)
-                       goto errout;
-       }
-
        state->xmit.head = state->xmit.tail = 0;
 
        /*
@@ -398,10 +390,16 @@ static int activate(struct tty_port *por
                tty->alt_speed = 230400;
        if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
                tty->alt_speed = 460800;
-
-errout:
        local_irq_restore(flags);
-       return retval;
+
+       if (state->irq) {
+               int retval = request_irq(state->irq, rs_interrupt_single, 0,
+                               "simserial", state);
+               if (retval)
+                       return retval;
+       }
+
+       return 0;
 }
 
 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to