Skip to contentSkip to conversation

forcedeth: napi schedule lock fix

PATCH Applied Ayaz Abdulla 3 participants 3 messages Jan 10, 2009 – Jan 27, 2009

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 3/4 forcedeth: napi schedule lock fix

This patch fixes a potential race condition between scheduling napi and completing napi poll. The call to netif_rx_schedule should be under protection of the lock (as is the completion), otherwise, interrupts could be masked off.

drivers/net/forcedeth.c +2 -2
@@ -3407,10 +3407,10 @@
 
 #ifdef CONFIG_FORCEDETH_NAPI
 		if (events & NVREG_IRQ_RX_ALL) {
+			spin_lock(&np->lock);
 			netif_rx_schedule(dev, &np->napi);
 
 			/* Disable furthur receive irq's */
-			spin_lock(&np->lock);
 			np->irqmask &= ~NVREG_IRQ_RX_ALL;
 
 			if (np->msi_flags & NV_MSI_X_ENABLED)
@@ -3524,10 +3524,10 @@
 
 #ifdef CONFIG_FORCEDETH_NAPI
 		if (events & NVREG_IRQ_RX_ALL) {
+			spin_lock(&np->lock);
 			netif_rx_schedule(dev, &np->napi);
 
 			/* Disable furthur receive irq's */
-			spin_lock(&np->lock);
 			np->irqmask &= ~NVREG_IRQ_RX_ALL;
 
 			if (np->msi_flags & NV_MSI_X_ENABLED)
maintainer
#1 lore raw

From: Ayaz Abdulla <[email protected]>
Date: Fri, 09 Jan 2009 16:03:49 -0500

Quoted 3 lines

This patch fixes a potential race condition between scheduling napi and completing napi poll. The call to netif_rx_schedule should be under protection of the lock (as is the completion), otherwise, interrupts could be masked off.

Another patch I had to apply by hand.

The 'dev' argument was removed from the netif_*() NAPI interfaces and then were converted to napi_*() in the net-2.6 tree.

#2 lore raw
In reply to Ayaz Abdulla
Quoted 4 lines · On 10 January 2009 00:03:49 Ayaz Abdulla wrote:

This patch fixes a potential race condition between scheduling napi and completing napi poll. The call to netif_rx_schedule should be under protection of the lock (as is the completion), otherwise, interrupts could be masked off.

Can you explain how this issue or race can occur (interrupts can be masked off) ?

netif_rx_schedule() merely mark soft irq as waked on current CPU. So dev->poll will not be called until irq_exit() or local_bh_enable. As nv_nic_irq() is run under interrupt context, so napi poll will be called only during irq_exit.

Quoted 4 lines
Signature · 2 lines
Thank,
Vitaliy Gusev