Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=59845b1ffd9121e5ef474ea5f27405fd7a83c85b
Commit:     59845b1ffd9121e5ef474ea5f27405fd7a83c85b
Parent:     2aeb3db17fc33443d21b11d7121c5627d55717c6
Author:     Jarek Poplawski <[EMAIL PROTECTED]>
AuthorDate: Thu Aug 30 23:56:34 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Fri Aug 31 01:42:23 2007 -0700

    request_irq: fix DEBUG_SHIRQ handling
    
    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: Mariusz Kozlowski <[EMAIL PROTECTED]>
    Signed-off-by: Jarek Poplawski <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 kernel/irq/manage.c |   11 ++++-------
 1 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 853aefb..7230d91 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -547,14 +547,11 @@ int request_irq(unsigned int irq, irq_handler_t handler,
                 * We do this before actually registering it, to make sure that
                 * a 'real' IRQ doesn't run in parallel with our fake
                 */
-               if (irqflags & IRQF_DISABLED) {
-                       unsigned long flags;
+               unsigned long flags;
 
-                       local_irq_save(flags);
-                       handler(irq, dev_id);
-                       local_irq_restore(flags);
-               } else
-                       handler(irq, dev_id);
+               local_irq_save(flags);
+               handler(irq, dev_id);
+               local_irq_restore(flags);
        }
 #endif
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to