mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 07:01:57 +00:00
[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>
This commit is contained in:
parent
8eeee8b152
commit
50fd4407b8
@ -383,9 +383,11 @@ static inline void __napi_complete(struct napi_struct *n)
|
||||
|
||||
static inline void napi_complete(struct napi_struct *n)
|
||||
{
|
||||
local_irq_disable();
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
__napi_complete(n);
|
||||
local_irq_enable();
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user