diff options
author | Amerigo Wang <amwang@redhat.com> | 2012-08-10 01:24:50 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-08-14 14:33:33 -0700 |
commit | 6bdb7fe31046ac50b47e83c35cd6c6b6160a475d (patch) | |
tree | c74da2bcfb27867bfc2fed58d3b5a9c84d445ef8 /net | |
parent | 689971b44613883ee74ae9c1b31a864aaa3a8e17 (diff) | |
download | lwn-6bdb7fe31046ac50b47e83c35cd6c6b6160a475d.tar.gz lwn-6bdb7fe31046ac50b47e83c35cd6c6b6160a475d.zip |
netpoll: re-enable irq in poll_napi()
napi->poll() needs IRQ enabled, so we have to re-enable IRQ before
calling it.
Cc: David Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <amwang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/netpoll.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index e4ba3e70c174..346b1eb83a1f 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c @@ -168,16 +168,24 @@ static void poll_napi(struct net_device *dev) struct napi_struct *napi; int budget = 16; + WARN_ON_ONCE(!irqs_disabled()); + list_for_each_entry(napi, &dev->napi_list, dev_list) { + local_irq_enable(); if (napi->poll_owner != smp_processor_id() && spin_trylock(&napi->poll_lock)) { + rcu_read_lock_bh(); budget = poll_one_napi(rcu_dereference_bh(dev->npinfo), napi, budget); + rcu_read_unlock_bh(); spin_unlock(&napi->poll_lock); - if (!budget) + if (!budget) { + local_irq_disable(); break; + } } + local_irq_disable(); } } |