diff mbox

Bug - regression - Via velocity interface coming up freezes kernel

Message ID 20131115000113.GA22051@electric-eye.fr.zoreil.com
State RFC, archived
Delegated to: David Miller
Headers show

Commit Message

Francois Romieu Nov. 15, 2013, 12:01 a.m. UTC
Francois Romieu <romieu@fr.zoreil.com> :
> Michele Baldessari <michele@acksyn.org> :
> [...]
> > any chance you can submit this officially ?
> 
> Yes.
> 
> > Or does this patch need some more work ?
> 
> I'll write some narrative for the commit message.

I would actually rather send the patch below.

The previous patch isn't safe against mtu changes. Please give the patch
below some testing. Test case: receive lots of packets while changing MTU.
Loop. The former patch may crash. The later shouldn't.

--
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

Comments

Michele Baldessari Nov. 23, 2013, 6:28 p.m. UTC | #1
Hi Francois,

On Fri, 15 Nov 2013 01:01:13 +0100 
Francois Romieu <romieu@fr.zoreil.com> wrote:
> Francois Romieu <romieu@fr.zoreil.com> :
> > Michele Baldessari <michele@acksyn.org> :
> > [...]
> > > any chance you can submit this officially ?
> > 
> > Yes.
> > 
> > > Or does this patch need some more work ?
> > 
> > I'll write some narrative for the commit message.
> 
> I would actually rather send the patch below.
> 
> The previous patch isn't safe against mtu changes. Please give the
> patch below some testing. Test case: receive lots of packets while
> changing MTU. Loop. The former patch may crash. The later shouldn't.

testing was performed by Alex A. Schmidt on this second patch variant
with MTU changes and no crashes were observed. Is the patch good
to go now?

thanks,
Michele
--
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
diff mbox

Patch

diff --git a/drivers/net/ethernet/via/via-velocity.c b/drivers/net/ethernet/via/via-velocity.c
index d022bf9..ad61d26 100644
--- a/drivers/net/ethernet/via/via-velocity.c
+++ b/drivers/net/ethernet/via/via-velocity.c
@@ -2172,16 +2172,13 @@  static int velocity_poll(struct napi_struct *napi, int budget)
 	unsigned int rx_done;
 	unsigned long flags;
 
-	spin_lock_irqsave(&vptr->lock, flags);
 	/*
 	 * Do rx and tx twice for performance (taken from the VIA
 	 * out-of-tree driver).
 	 */
-	rx_done = velocity_rx_srv(vptr, budget / 2);
-	velocity_tx_srv(vptr);
-	rx_done += velocity_rx_srv(vptr, budget - rx_done);
+	rx_done = velocity_rx_srv(vptr, budget);
+	spin_lock_irqsave(&vptr->lock, flags);
 	velocity_tx_srv(vptr);
-
 	/* If budget not fully consumed, exit the polling mode */
 	if (rx_done < budget) {
 		napi_complete(napi);
@@ -2342,6 +2339,8 @@  static int velocity_change_mtu(struct net_device *dev, int new_mtu)
 		if (ret < 0)
 			goto out_free_tmp_vptr_1;
 
+		napi_disable(&vptr->napi);
+
 		spin_lock_irqsave(&vptr->lock, flags);
 
 		netif_stop_queue(dev);
@@ -2362,6 +2361,8 @@  static int velocity_change_mtu(struct net_device *dev, int new_mtu)
 
 		velocity_give_many_rx_descs(vptr);
 
+		napi_enable(&vptr->napi);
+
 		mac_enable_int(vptr->mac_regs);
 		netif_start_queue(dev);