200-ag71xx-Handle-allocation-errors-in-ag71xx_rings_init.patch 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. From 2cee757eaf5cc6175bc0ac7b0b808794124ec40a Mon Sep 17 00:00:00 2001
  2. From: Hauke Mehrtens <[email protected]>
  3. Date: Mon, 17 Feb 2020 23:40:14 +0100
  4. Subject: [PATCH 1/3] ag71xx: Handle allocation errors in ag71xx_rings_init()
  5. Free the allocated resources in ag71xx_rings_init() in case
  6. ag71xx_ring_rx_init() returns an error.
  7. This is only a potential problem, I did not ran into this one.
  8. Signed-off-by: Hauke Mehrtens <[email protected]>
  9. Fixes: d51b6ce441d3 ("net: ethernet: add ag71xx driver")
  10. ---
  11. drivers/net/ethernet/atheros/ag71xx.c | 22 ++++++++++++++++++----
  12. 1 file changed, 18 insertions(+), 4 deletions(-)
  13. --- a/drivers/net/ethernet/atheros/ag71xx.c
  14. +++ b/drivers/net/ethernet/atheros/ag71xx.c
  15. @@ -1133,6 +1133,7 @@ static int ag71xx_rings_init(struct ag71
  16. struct ag71xx_ring *tx = &ag->tx_ring;
  17. struct ag71xx_ring *rx = &ag->rx_ring;
  18. int ring_size, tx_size;
  19. + int ret;
  20. ring_size = BIT(tx->order) + BIT(rx->order);
  21. tx_size = BIT(tx->order);
  22. @@ -1145,9 +1146,8 @@ static int ag71xx_rings_init(struct ag71
  23. ring_size * AG71XX_DESC_SIZE,
  24. &tx->descs_dma, GFP_KERNEL);
  25. if (!tx->descs_cpu) {
  26. - kfree(tx->buf);
  27. - tx->buf = NULL;
  28. - return -ENOMEM;
  29. + ret = -ENOMEM;
  30. + goto err_free_buf;
  31. }
  32. rx->buf = &tx->buf[tx_size];
  33. @@ -1155,7 +1155,21 @@ static int ag71xx_rings_init(struct ag71
  34. rx->descs_dma = tx->descs_dma + tx_size * AG71XX_DESC_SIZE;
  35. ag71xx_ring_tx_init(ag);
  36. - return ag71xx_ring_rx_init(ag);
  37. + ret = ag71xx_ring_rx_init(ag);
  38. + if (ret)
  39. + goto err_free_dma;
  40. +
  41. + return 0;
  42. +
  43. +err_free_dma:
  44. + dma_free_coherent(&ag->pdev->dev, ring_size * AG71XX_DESC_SIZE,
  45. + tx->descs_cpu, tx->descs_dma);
  46. + rx->buf = NULL;
  47. +err_free_buf:
  48. + kfree(tx->buf);
  49. + tx->buf = NULL;
  50. +
  51. + return ret;
  52. }
  53. static void ag71xx_rings_free(struct ag71xx *ag)