12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- From: Lorenzo Bianconi <[email protected]>
- Date: Wed, 7 Dec 2022 15:04:55 +0100
- Subject: [PATCH] net: ethernet: mtk_wed: fix possible deadlock if
- mtk_wed_wo_init fails
- Introduce __mtk_wed_detach() in order to avoid a deadlock in
- mtk_wed_attach routine if mtk_wed_wo_init fails since both
- mtk_wed_attach and mtk_wed_detach run holding hw_lock mutex.
- Fixes: 4c5de09eb0d0 ("net: ethernet: mtk_wed: add configure wed wo support")
- Signed-off-by: Lorenzo Bianconi <[email protected]>
- Reviewed-by: Leon Romanovsky <[email protected]>
- Signed-off-by: Jakub Kicinski <[email protected]>
- ---
- --- a/drivers/net/ethernet/mediatek/mtk_wed.c
- +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
- @@ -619,12 +619,10 @@ mtk_wed_deinit(struct mtk_wed_device *de
- }
-
- static void
- -mtk_wed_detach(struct mtk_wed_device *dev)
- +__mtk_wed_detach(struct mtk_wed_device *dev)
- {
- struct mtk_wed_hw *hw = dev->hw;
-
- - mutex_lock(&hw_lock);
- -
- mtk_wed_deinit(dev);
-
- mtk_wdma_rx_reset(dev);
- @@ -657,6 +655,13 @@ mtk_wed_detach(struct mtk_wed_device *de
- module_put(THIS_MODULE);
-
- hw->wed_dev = NULL;
- +}
- +
- +static void
- +mtk_wed_detach(struct mtk_wed_device *dev)
- +{
- + mutex_lock(&hw_lock);
- + __mtk_wed_detach(dev);
- mutex_unlock(&hw_lock);
- }
-
- @@ -1545,8 +1550,10 @@ mtk_wed_attach(struct mtk_wed_device *de
- ret = mtk_wed_wo_init(hw);
- }
- out:
- - if (ret)
- - mtk_wed_detach(dev);
- + if (ret) {
- + dev_err(dev->hw->dev, "failed to attach wed device\n");
- + __mtk_wed_detach(dev);
- + }
- unlock:
- mutex_unlock(&hw_lock);
-
|