realtek: Fix Ethernet driver IRQ service routine for SMP
Do not lock the register structure in IRQ context. It is not necessary and leads to lockups under SMP load. Signed-off-by: Birger Koblitz <git@birger-koblitz.de>
This commit is contained in:
		 Birger Koblitz
					Birger Koblitz
				
			
				
					committed by
					
						 Daniel Golle
						Daniel Golle
					
				
			
			
				
	
			
			
			 Daniel Golle
						Daniel Golle
					
				
			
						parent
						
							9d847244d9
						
					
				
				
					commit
					1b1f05f682
				
			| @@ -331,7 +331,6 @@ bool rtl931x_decode_tag(struct p_hdr *h, struct dsa_tag *t) | |||||||
| /* | /* | ||||||
|  * Discard the RX ring-buffers, called as part of the net-ISR |  * Discard the RX ring-buffers, called as part of the net-ISR | ||||||
|  * when the buffer runs over |  * when the buffer runs over | ||||||
|  * Caller needs to hold priv->lock |  | ||||||
|  */ |  */ | ||||||
| static void rtl838x_rb_cleanup(struct rtl838x_eth_priv *priv, int status) | static void rtl838x_rb_cleanup(struct rtl838x_eth_priv *priv, int status) | ||||||
| { | { | ||||||
| @@ -439,7 +438,6 @@ static irqreturn_t rtl83xx_net_irq(int irq, void *dev_id) | |||||||
|  |  | ||||||
| 	pr_debug("IRQ: %08x\n", status); | 	pr_debug("IRQ: %08x\n", status); | ||||||
|  |  | ||||||
| 	spin_lock(&priv->lock); |  | ||||||
| 	/*  Ignore TX interrupt */ | 	/*  Ignore TX interrupt */ | ||||||
| 	if ((status & 0xf0000)) { | 	if ((status & 0xf0000)) { | ||||||
| 		/* Clear ISR */ | 		/* Clear ISR */ | ||||||
| @@ -482,7 +480,6 @@ static irqreturn_t rtl83xx_net_irq(int irq, void *dev_id) | |||||||
| 		rtl839x_l2_notification_handler(priv); | 		rtl839x_l2_notification_handler(priv); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	spin_unlock(&priv->lock); |  | ||||||
| 	return IRQ_HANDLED; | 	return IRQ_HANDLED; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -497,7 +494,6 @@ static irqreturn_t rtl93xx_net_irq(int irq, void *dev_id) | |||||||
|  |  | ||||||
| 	pr_debug("In %s, status_tx: %08x, status_rx: %08x, status_rx_r: %08x\n", | 	pr_debug("In %s, status_tx: %08x, status_rx: %08x, status_rx_r: %08x\n", | ||||||
| 		__func__, status_tx, status_rx, status_rx_r); | 		__func__, status_tx, status_rx, status_rx_r); | ||||||
| 	spin_lock(&priv->lock); |  | ||||||
|  |  | ||||||
| 	/*  Ignore TX interrupt */ | 	/*  Ignore TX interrupt */ | ||||||
| 	if (status_tx) { | 	if (status_tx) { | ||||||
| @@ -528,7 +524,6 @@ static irqreturn_t rtl93xx_net_irq(int irq, void *dev_id) | |||||||
| 		rtl838x_rb_cleanup(priv, status_rx_r); | 		rtl838x_rb_cleanup(priv, status_rx_r); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	spin_unlock(&priv->lock); |  | ||||||
| 	return IRQ_HANDLED; | 	return IRQ_HANDLED; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user