via-velocity: fix netif_receive_skb use in irq disabled section.
2fdac010bd
("via-velocity.c: update napi implementation") overlooked an irq disabling spinlock when the Rx part of the NAPI poll handler was converted from netif_rx to netif_receive_skb. NAPI Rx processing can be taken out of the locked section with a pair of napi_{disable / enable} since it only races with the MTU change function. An heavier rework of the NAPI locking would be able to perform NAPI Tx before Rx where I simply removed one of velocity_tx_srv calls. References: https://bugzilla.redhat.com/show_bug.cgi?id=1022733 Fixes:2fdac010bd
(via-velocity.c: update napi implementation) Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Tested-by: Alex A. Schmidt <aaschmidt1@gmail.com> Cc: Jamie Heilman <jamie@audible.transient.net> Cc: Michele Baldessari <michele@acksyn.org> Cc: Julia Lawall <Julia.Lawall@lip6.fr> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e63e60be62
commit
bc9627e7e9
|
@ -2172,16 +2172,13 @@ static int velocity_poll(struct napi_struct *napi, int budget)
|
||||||
unsigned int rx_done;
|
unsigned int rx_done;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&vptr->lock, flags);
|
|
||||||
/*
|
/*
|
||||||
* Do rx and tx twice for performance (taken from the VIA
|
* Do rx and tx twice for performance (taken from the VIA
|
||||||
* out-of-tree driver).
|
* out-of-tree driver).
|
||||||
*/
|
*/
|
||||||
rx_done = velocity_rx_srv(vptr, budget / 2);
|
rx_done = velocity_rx_srv(vptr, budget);
|
||||||
|
spin_lock_irqsave(&vptr->lock, flags);
|
||||||
velocity_tx_srv(vptr);
|
velocity_tx_srv(vptr);
|
||||||
rx_done += velocity_rx_srv(vptr, budget - rx_done);
|
|
||||||
velocity_tx_srv(vptr);
|
|
||||||
|
|
||||||
/* If budget not fully consumed, exit the polling mode */
|
/* If budget not fully consumed, exit the polling mode */
|
||||||
if (rx_done < budget) {
|
if (rx_done < budget) {
|
||||||
napi_complete(napi);
|
napi_complete(napi);
|
||||||
|
@ -2342,6 +2339,8 @@ static int velocity_change_mtu(struct net_device *dev, int new_mtu)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out_free_tmp_vptr_1;
|
goto out_free_tmp_vptr_1;
|
||||||
|
|
||||||
|
napi_disable(&vptr->napi);
|
||||||
|
|
||||||
spin_lock_irqsave(&vptr->lock, flags);
|
spin_lock_irqsave(&vptr->lock, flags);
|
||||||
|
|
||||||
netif_stop_queue(dev);
|
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);
|
velocity_give_many_rx_descs(vptr);
|
||||||
|
|
||||||
|
napi_enable(&vptr->napi);
|
||||||
|
|
||||||
mac_enable_int(vptr->mac_regs);
|
mac_enable_int(vptr->mac_regs);
|
||||||
netif_start_queue(dev);
|
netif_start_queue(dev);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue