]> git.baikalelectronics.ru Git - kernel.git/commit
[NET]: Use local_irq_{save,restore}() in napi_complete().
authorDavid S. Miller <davem@davemloft.net>
Fri, 28 Mar 2008 00:42:50 +0000 (17:42 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 28 Mar 2008 00:42:50 +0000 (17:42 -0700)
commit80b7eef546f55d38a88e92d6b6f3d7778b3d6d6c
tree57a9f05b130903fb2c6c12412352928bb24dc3a7
parent6ba128524e75f3092798327d9a8c10e91d1c344a
[NET]: Use local_irq_{save,restore}() in napi_complete().

Based upon a lockdep report.

Since ->poll() can be invoked from netpoll with interrupts
disabled, we must not unconditionally enable interrupts
in napi_complete().

Instead we must use local_irq_{save,restore}().

Noticed by Peter Zijlstra:

<irqs disabled>

  netpoll_poll()
    poll_napi()
      spin_trylock(&napi->poll_lock)
      poll_one_napi()
        napi->poll() := sky2_poll()
          napi_complete()
            local_irq_disable()
            local_irq_enable() <--- *BUG*

  <irq>
    irq_exit()
      do_softirq()
        net_rx_action()
          spin_lock(&napi->poll_lock) <--- Deadlock!

Because we still hold the lock....

Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h