730-17-v6.3-net-ethernet-mtk_wed-fix-possible-deadlock-if-mtk_we.patch 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. From: Lorenzo Bianconi <[email protected]>
  2. Date: Wed, 7 Dec 2022 15:04:55 +0100
  3. Subject: [PATCH] net: ethernet: mtk_wed: fix possible deadlock if
  4. mtk_wed_wo_init fails
  5. Introduce __mtk_wed_detach() in order to avoid a deadlock in
  6. mtk_wed_attach routine if mtk_wed_wo_init fails since both
  7. mtk_wed_attach and mtk_wed_detach run holding hw_lock mutex.
  8. Fixes: 4c5de09eb0d0 ("net: ethernet: mtk_wed: add configure wed wo support")
  9. Signed-off-by: Lorenzo Bianconi <[email protected]>
  10. Reviewed-by: Leon Romanovsky <[email protected]>
  11. Signed-off-by: Jakub Kicinski <[email protected]>
  12. ---
  13. --- a/drivers/net/ethernet/mediatek/mtk_wed.c
  14. +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
  15. @@ -619,12 +619,10 @@ mtk_wed_deinit(struct mtk_wed_device *de
  16. }
  17. static void
  18. -mtk_wed_detach(struct mtk_wed_device *dev)
  19. +__mtk_wed_detach(struct mtk_wed_device *dev)
  20. {
  21. struct mtk_wed_hw *hw = dev->hw;
  22. - mutex_lock(&hw_lock);
  23. -
  24. mtk_wed_deinit(dev);
  25. mtk_wdma_rx_reset(dev);
  26. @@ -657,6 +655,13 @@ mtk_wed_detach(struct mtk_wed_device *de
  27. module_put(THIS_MODULE);
  28. hw->wed_dev = NULL;
  29. +}
  30. +
  31. +static void
  32. +mtk_wed_detach(struct mtk_wed_device *dev)
  33. +{
  34. + mutex_lock(&hw_lock);
  35. + __mtk_wed_detach(dev);
  36. mutex_unlock(&hw_lock);
  37. }
  38. @@ -1545,8 +1550,10 @@ mtk_wed_attach(struct mtk_wed_device *de
  39. ret = mtk_wed_wo_init(hw);
  40. }
  41. out:
  42. - if (ret)
  43. - mtk_wed_detach(dev);
  44. + if (ret) {
  45. + dev_err(dev->hw->dev, "failed to attach wed device\n");
  46. + __mtk_wed_detach(dev);
  47. + }
  48. unlock:
  49. mutex_unlock(&hw_lock);