Subject: net: fix race in process_backlog The recent NAPI rework (4fa57c9ea9f36f9ca852f3a88ca5d2f1aebbc960) introduced a race between netif_rx() and process_backlog() which resulted in softirq processing to drop dead.
netif_rx() process_backlog() irq_disable(); skb = __skb_dequeue(); irq_enable(); irq_disable(); __skb_queue_tail(); napi_schedule(); irq_enable(); if (!skb) napi_complete(); <-- oops! we cleared the napi bit, even though there is data to process. Signed-off-by: Peter Zijlstra <[EMAIL PROTECTED]> --- net/core/dev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) Index: linux-2.6/net/core/dev.c =================================================================== --- linux-2.6.orig/net/core/dev.c +++ linux-2.6/net/core/dev.c @@ -2095,11 +2095,11 @@ static int process_backlog(struct napi_s local_irq_disable(); skb = __skb_dequeue(&queue->input_pkt_queue); - local_irq_enable(); if (!skb) { - napi_complete(napi); + __napi_complete(napi); break; } + local_irq_enable(); dev = skb->dev; - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html