Thread (9 messages) flat view 9 messages, 4 authors, 2012-12-13

Re: [RFT PATCH] 8139cp: properly support change of MTU values [v2]

From: John Greene <hidden>
Date: 2012-12-13 19:56:53

On 12/03/2012 03:46 PM, Francois Romieu wrote:
quoted hunk ↗ jump to hunk
David Miller [off-list ref] :
[...]
quoted
I've applied this to net-next, if it triggers any problems we have
some time to work it out before 3.8 is released.
I have bounced the messages to David Woodhouse since he authored the
last 8139cp changes in net-next and owns the hardware to notice
regressions.

My message of two days ago was wrong : it is not possible for the irq
handler to process a Tx event after the rings have been freed. Things
still look racy wrt netpoll though.

Any objection against the patch below ?

(I did not gotoize the dev == NULL test: it is really unlikely and
should go away).
diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c
index 0da3f5e..57cd542 100644
--- a/drivers/net/ethernet/realtek/8139cp.c
+++ b/drivers/net/ethernet/realtek/8139cp.c
@@ -577,28 +577,30 @@ static irqreturn_t cp_interrupt (int irq, void *dev_instance)
  {
  	struct net_device *dev = dev_instance;
  	struct cp_private *cp;
+	int handled = 0;
  	u16 status;

  	if (unlikely(dev == NULL))
  		return IRQ_NONE;
  	cp = netdev_priv(dev);

+	spin_lock(&cp->lock);
+
  	status = cpr16(IntrStatus);
  	if (!status || (status == 0xFFFF))
-		return IRQ_NONE;
+		goto out_unlock;
+
+	handled = 1;

  	netif_dbg(cp, intr, dev, "intr, status %04x cmd %02x cpcmd %04x\n",
  		  status, cpr8(Cmd), cpr16(CpCmd));

  	cpw16(IntrStatus, status & ~cp_rx_intr_mask);

-	spin_lock(&cp->lock);
-
  	/* close possible race's with dev_close */
  	if (unlikely(!netif_running(dev))) {
  		cpw16(IntrMask, 0);
-		spin_unlock(&cp->lock);
-		return IRQ_HANDLED;
+		goto out_unlock;
  	}

  	if (status & (RxOK | RxErr | RxEmpty | RxFIFOOvr))
@@ -612,8 +614,6 @@ static irqreturn_t cp_interrupt (int irq, void *dev_instance)
  	if (status & LinkChg)
  		mii_check_media(&cp->mii_if, netif_msg_link(cp), false);

-	spin_unlock(&cp->lock);
-
  	if (status & PciErr) {
  		u16 pci_status;
@@ -625,7 +625,10 @@ static irqreturn_t cp_interrupt (int irq, void *dev_instance)
  		/* TODO: reset hardware */
  	}

-	return IRQ_HANDLED;
+out_unlock:
+	spin_unlock(&cp->lock);
+
+	return IRQ_RETVAL(handled);
  }

  #ifdef CONFIG_NET_POLL_CONTROLLER
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Francois,

Have incorporated this and test it on virtual hardware with on top of
  cb64edb6b89491edfdbae52ba7db9a8b8391d339 (my original work now 
upstream).  I plan to submit your work herein upstream as well, with 
attribution to you, if that's ok?


-- 
John Greene
jogreene@redhat.com
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help