Răsfoiți Sursa

e1000e: fix close interrupt race

As noticed by Alan Cox, it is possible for e1000e to exit its interrupt
handler or NAPI with interrupts enabled even when the driver is unloading or
being configured administratively down.

fix related to fix for: http://bugzilla.kernel.org/show_bug.cgi?id=12876

Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
CC: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Jesse Brandeburg 16 ani în urmă
părinte
comite
a3c69fef7a
1 a modificat fișierele cu 10 adăugiri și 6 ștergeri
  1. 10 6
      drivers/net/e1000e/netdev.c

+ 10 - 6
drivers/net/e1000e/netdev.c

@@ -1261,7 +1261,8 @@ static irqreturn_t e1000_msix_other(int irq, void *data)
 	u32 icr = er32(ICR);
 	u32 icr = er32(ICR);
 
 
 	if (!(icr & E1000_ICR_INT_ASSERTED)) {
 	if (!(icr & E1000_ICR_INT_ASSERTED)) {
-		ew32(IMS, E1000_IMS_OTHER);
+		if (!test_bit(__E1000_DOWN, &adapter->state))
+			ew32(IMS, E1000_IMS_OTHER);
 		return IRQ_NONE;
 		return IRQ_NONE;
 	}
 	}
 
 
@@ -1278,7 +1279,8 @@ static irqreturn_t e1000_msix_other(int irq, void *data)
 	}
 	}
 
 
 no_link_interrupt:
 no_link_interrupt:
-	ew32(IMS, E1000_IMS_LSC | E1000_IMS_OTHER);
+	if (!test_bit(__E1000_DOWN, &adapter->state))
+		ew32(IMS, E1000_IMS_LSC | E1000_IMS_OTHER);
 
 
 	return IRQ_HANDLED;
 	return IRQ_HANDLED;
 }
 }
@@ -2015,10 +2017,12 @@ clean_rx:
 		if (adapter->itr_setting & 3)
 		if (adapter->itr_setting & 3)
 			e1000_set_itr(adapter);
 			e1000_set_itr(adapter);
 		napi_complete(napi);
 		napi_complete(napi);
-		if (adapter->msix_entries)
-			ew32(IMS, adapter->rx_ring->ims_val);
-		else
-			e1000_irq_enable(adapter);
+		if (!test_bit(__E1000_DOWN, &adapter->state)) {
+			if (adapter->msix_entries)
+				ew32(IMS, adapter->rx_ring->ims_val);
+			else
+				e1000_irq_enable(adapter);
+		}
 	}
 	}
 
 
 	return work_done;
 	return work_done;