• J
    request_irq: fix DEBUG_SHIRQ handling · 59845b1f
    Jarek Poplawski 提交于
    Mariusz Kozlowski reported lockdep's warning:
    
    > =================================
    > [ INFO: inconsistent lock state ]
    > 2.6.23-rc2-mm1 #7
    > ---------------------------------
    > inconsistent {in-hardirq-W} -> {hardirq-on-W} usage.
    > ifconfig/5492 [HC0[0]:SC0[0]:HE1:SE1] takes:
    >  (&tp->lock){+...}, at: [<de8706e0>] rtl8139_interrupt+0x27/0x46b [8139too]
    > {in-hardirq-W} state was registered at:
    >   [<c0138eeb>] __lock_acquire+0x949/0x11ac
    >   [<c01397e7>] lock_acquire+0x99/0xb2
    >   [<c0452ff3>] _spin_lock+0x35/0x42
    >   [<de8706e0>] rtl8139_interrupt+0x27/0x46b [8139too]
    >   [<c0147a5d>] handle_IRQ_event+0x28/0x59
    >   [<c01493ca>] handle_level_irq+0xad/0x10b
    >   [<c0105a13>] do_IRQ+0x93/0xd0
    >   [<c010441e>] common_interrupt+0x2e/0x34
    ...
    > other info that might help us debug this:
    > 1 lock held by ifconfig/5492:
    >  #0:  (rtnl_mutex){--..}, at: [<c0451778>] mutex_lock+0x1c/0x1f
    >
    > stack backtrace:
    ...
    >  [<c0452ff3>] _spin_lock+0x35/0x42
    >  [<de8706e0>] rtl8139_interrupt+0x27/0x46b [8139too]
    >  [<c01480fd>] free_irq+0x11b/0x146
    >  [<de871d59>] rtl8139_close+0x8a/0x14a [8139too]
    >  [<c03bde63>] dev_close+0x57/0x74
    ...
    
    This shows that a driver's irq handler was running both in hard interrupt
    and process contexts with irqs enabled. The latter was done during
    free_irq() call and was possible only with CONFIG_DEBUG_SHIRQ enabled.
    This was fixed by another patch.
    
    But similar problem is possible with request_irq(): any locks taken from
    irq handler could be vulnerable - especially with soft interrupts. This
    patch fixes it by disabling local interrupts during handler's run. (It
    seems, disabling softirqs should be enough, but it needs more checking
    on possible races or other special cases).
    Reported-by: NMariusz Kozlowski <m.kozlowski@tuxland.pl>
    Signed-off-by: NJarek Poplawski <jarkao2@o2.pl>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    59845b1f
manage.c 13.9 KB