• Max Filippov's avatar
    xtensa: ISS: fix timer_lock usage in rs_open · efefbcc5
    Max Filippov authored
    This fixes the following lockdep splat:
    
    [   66.460000] =================================
    [   66.460000] [ INFO: inconsistent lock state ]
    [   66.460000] 3.9.0-rc5-00161-ga48dd49 #4 Not tainted
    [   66.460000] ---------------------------------
    [   66.460000] inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
    [   66.460000] swapper/1 [HC0[0]:SC1[1]:HE1:SE0] takes:
    [   66.460000]  (timer_lock){+.?...}, at: [<d0006cde>] rs_poll+0x12/0xdc
    [   66.460000] {SOFTIRQ-ON-W} state was registered at:
    [   66.460000]   [<d00421f0>] lock_acquire+0xec/0x13c
    [   66.460000]   [<d01ea036>] _raw_spin_lock+0x3a/0x84
    [   66.460000]   [<d0006c8c>] rs_open+0x18/0x58
    [   66.460000]   [<d0139ea2>] tty_open+0x262/0x3cc
    [   66.460000]   [<d00942e0>] chrdev_open+0x8c/0xe0
    [   66.460000]   [<d00907b2>] do_dentry_open$isra$16+0x10e/0x190
    [   66.460000]   [<d0091141>] finish_open+0x39/0x48
    [   66.460000]   [<d009a0b4>] do_last$isra$34+0x6c4/0x824
    [   66.460000]   [<d009a27a>] path_openat+0x66/0x310
    [   66.460000]   [<d009a53a>] do_filp_open+0x16/0x44
    [   66.460000]   [<d0091445>] do_sys_open+0xd5/0x13c
    [   66.460000]   [<d00914be>] sys_open+0x12/0x18
    [   66.460000]   [<d0413ffc>] kernel_init_freeable+0xe4/0x12c
    [   66.460000]   [<d01e2a9c>] kernel_init+0xc/0x9c
    [   66.460000]   [<d00044fc>] ret_from_kernel_thread+0x8/0xc
    [   66.460000] irq event stamp: 132542
    [   66.460000] hardirqs last  enabled at (132542): [<d01ea2ec>] _raw_spin_unlock_irq+0x30/0x44
    [   66.460000] hardirqs last disabled at (132541): [<d01ea11e>] _raw_spin_lock_irq+0xe/0x8c
    [   66.460000] softirqs last  enabled at (132234): [<d0017d32>] __do_softirq+0x216/0x2a4
    [   66.460000] softirqs last disabled at (132539): [<d0018024>] irq_exit+0x38/0x40
    [   66.460000]
    [   66.460000] other info that might help us debug this:
    [   66.460000]  Possible unsafe locking scenario:
    [   66.460000]
    [   66.460000]        CPU0
    [   66.460000]        ----
    [   66.460000]   lock(timer_lock);
    [   66.460000]   <Interrupt>
    [   66.460000]     lock(timer_lock);
    [   66.460000]
    [   66.460000]  *** DEADLOCK ***
    [   66.460000]
    [   66.460000] 1 lock held by swapper/1:
    [   66.460000]  #0:  (((&serial_timer))){+.-...}, at: [<d001c65c>] call_timer_fn+0x0/0x1f0
    [   66.460000]
    Stack: d7c2fac0 00000018 00000004 00000001 d7c2faa0 00000004 00000006 d7c2fa90
           9003e87c d7c2fae0 d7c30000 d025a87c 00000001 0000000f 00000000 d7c2fac0
           9004005d d7c2fb10 d7c30000 d7c30338 00000001 00000001 00000000 d7c30338
    [   66.460000] Call Trace:
    [   66.460000]  [<d01e4f93>] print_usage_bug$part$26+0x1c3/0x1c8
    [   66.460000]  [<d003e87c>] mark_lock+0x2b4/0x440
    [   66.460000]  [<d004005d>] __lock_acquire+0x54d/0x16c4
    [   66.460000]  [<d00421f0>] lock_acquire+0xec/0x13c
    [   66.460000]  [<d01ea036>] _raw_spin_lock+0x3a/0x84
    [   66.460000]  [<d0006cde>] rs_poll+0x12/0xdc
    [   66.460000]  [<d001c71a>] call_timer_fn+0xbe/0x1f0
    [   66.460000]  [<d001cd90>] run_timer_softirq+0x198/0x1f4
    [   66.460000]  [<d0017c30>] __do_softirq+0x114/0x2a4
    [   66.460000]  [<d0018024>] irq_exit+0x38/0x40
    [   66.460000]  [<d00046c0>] do_IRQ+0x44/0x48
    [   66.460000]  [<d0005c58>] do_interrupt+0x4c/0x54
    [   66.460000]  [<d0003c80>] common_exception_return+0x0/0x5c
    [   66.460000]  [<d006682c>] free_pcppages_bulk+0x254/0x308
    [   66.460000]
    Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
    Signed-off-by: default avatarChris Zankel <chris@zankel.net>
    efefbcc5
console.c 6.28 KB