Message ID | 1483522278-36891-1-git-send-email-john@phrozen.org |
---|---|
State | Not Applicable, archived |
Delegated to: | David Miller |
Headers | show |
On 01/04/2017 01:31 AM, John Crispin wrote: > From: Florian Fainelli <f.fainelli@gmail.com> > > Commit beb0babfb77e ("korina: disable napi on close and restart") > introduced calls to napi_disable() that were missing before, > unfortunately this leaves a small window during which NAPI has a chance > to run, yet we just freed resources since korina_free_ring() has been > called: > > Fix this by disabling NAPI first then freeing resource, and make sure > that we also cancel the restart taks before doing the resource freeing. > > Fixes: beb0babfb77e ("korina: disable napi on close and restart") I submitted this patch to 'net' already, but thanks for doing it!
diff --git a/drivers/net/ethernet/korina.c b/drivers/net/ethernet/korina.c index 1799fe1..c051987 100644 --- a/drivers/net/ethernet/korina.c +++ b/drivers/net/ethernet/korina.c @@ -900,10 +900,10 @@ static void korina_restart_task(struct work_struct *work) DMA_STAT_DONE | DMA_STAT_HALT | DMA_STAT_ERR, &lp->rx_dma_regs->dmasm); - korina_free_ring(dev); - napi_disable(&lp->napi); + korina_free_ring(dev); + if (korina_init(dev) < 0) { printk(KERN_ERR "%s: cannot restart device\n", dev->name); return; @@ -1064,12 +1064,12 @@ static int korina_close(struct net_device *dev) tmp = tmp | DMA_STAT_DONE | DMA_STAT_HALT | DMA_STAT_ERR; writel(tmp, &lp->rx_dma_regs->dmasm); - korina_free_ring(dev); - napi_disable(&lp->napi); cancel_work_sync(&lp->restart_task); + korina_free_ring(dev); + free_irq(lp->rx_irq, dev); free_irq(lp->tx_irq, dev); free_irq(lp->ovr_irq, dev);