Re: [PATCH] net: amd: xgbe: fix possible sleep-in-atomic-context bugs in xgbe_powerdown()

From: Jia-Ju Bai
Date: Wed Dec 18 2019 - 21:40:42 EST




On 2019/12/19 5:26, David Miller wrote:
From: Jia-Ju Bai <baijiaju1990@xxxxxxxxx>
Date: Wed, 18 Dec 2019 22:01:02 +0800

@@ -1257,17 +1257,18 @@ int xgbe_powerdown(struct net_device *netdev, unsigned int caller)
netif_tx_stop_all_queues(netdev);
xgbe_stop_timers(pdata);
- flush_workqueue(pdata->dev_workqueue);
hw_if->powerdown_tx(pdata);
hw_if->powerdown_rx(pdata);
- xgbe_napi_disable(pdata, 0);
-
pdata->power_down = 1;
spin_unlock_irqrestore(&pdata->lock, flags);
+ flush_workqueue(pdata->dev_workqueue);
+
+ xgbe_napi_disable(pdata, 0);
+
Nope, this doesn't work at all.

You can't leave NAPI enabled, and thus packet processing, after the TX
and RX units of the chip have been powered down.

Looking at the code, only xgbe_powerup() and xgbe_powerdown() use the spinlock "pdata->lock".
How about change the spinlock to a mutex?


Best wishes,
Jia-Ju Bai