mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-23 17:55:05 +03:00
nvethernet: fix kernel panic by adding napi_synchronize
Issue: Kernel panic if NAPI scheduled in ether_close() path. Fix: Disable NAPI before freeing dma resources as well as call napi_synchronize() before napi_disable() for scheduled NAPI to be completed. Bug 200650229 Change-Id: I8c57ba90b5094ab3a130ca56221b3e1b16b96025 Signed-off-by: rakesh goyal <rgoyal@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2404266 Tested-by: mobile promotions <svcmobile_promotions@nvidia.com> Reviewed-by: Bhadram Varka <vbhadram@nvidia.com> Reviewed-by: Bitan Biswas <bbiswas@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> GVS: Gerrit_Virtual_Submit
This commit is contained in:
committed by
Revanth Kumar Uppala
parent
3ff1678205
commit
3dd509ad9c
@@ -910,7 +910,10 @@ err_chan_irq:
|
||||
/**
|
||||
* @brief Disable NAPI.
|
||||
*
|
||||
* Algorithm: Disable Tx and Rx NAPI for the channels which are enabled.
|
||||
* Algorithm:
|
||||
* 1) Wait for scheduled Tx and Rx NAPI to be completed.
|
||||
* 2) Disable Tx and Rx NAPI for the channels which
|
||||
* are enabled.
|
||||
*
|
||||
* @param[in] pdata: OSD private data structure.
|
||||
*
|
||||
@@ -924,8 +927,9 @@ static void ether_napi_disable(struct ether_priv_data *pdata)
|
||||
|
||||
for (i = 0; i < osi_dma->num_dma_chans; i++) {
|
||||
chan = osi_dma->dma_chans[i];
|
||||
|
||||
napi_synchronize(&pdata->tx_napi[chan]->napi);
|
||||
napi_disable(&pdata->tx_napi[chan]->napi);
|
||||
napi_synchronize(&pdata->rx_napi[chan]->napi);
|
||||
napi_disable(&pdata->rx_napi[chan]->napi);
|
||||
}
|
||||
}
|
||||
@@ -1853,6 +1857,8 @@ static int ether_close(struct net_device *ndev)
|
||||
thermal_cooling_device_unregister(pdata->tcd);
|
||||
#endif /* THERMAL_CAL */
|
||||
|
||||
ether_napi_disable(pdata);
|
||||
|
||||
/* free DMA resources after DMA stop */
|
||||
free_dma_resources(pdata);
|
||||
|
||||
@@ -1862,8 +1868,6 @@ static int ether_close(struct net_device *ndev)
|
||||
/* MAC deinit which inturn stop MAC Tx,Rx */
|
||||
osi_hw_core_deinit(pdata->osi_core);
|
||||
|
||||
ether_napi_disable(pdata);
|
||||
|
||||
/* Assert MAC RST gpio */
|
||||
if (!pdata->osi_core->pre_si && pdata->mac_rst) {
|
||||
reset_control_assert(pdata->mac_rst);
|
||||
|
||||
Reference in New Issue
Block a user