728-v6.1-05-net-ethernet-mtk_eth_soc-fix-memory-leak-in-error-pa.patch 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. From 603ea5e7ffa73c7fac07d8713d97285990695213 Mon Sep 17 00:00:00 2001
  2. From: Yan Cangang <[email protected]>
  3. Date: Sun, 20 Nov 2022 13:52:59 +0800
  4. Subject: [PATCH] net: ethernet: mtk_eth_soc: fix memory leak in error path
  5. In mtk_ppe_init(), when dmam_alloc_coherent() or devm_kzalloc() failed,
  6. the rhashtable ppe->l2_flows isn't destroyed. Fix it.
  7. In mtk_probe(), when mtk_ppe_init() or mtk_eth_offload_init() or
  8. register_netdev() failed, have the same problem. Fix it.
  9. Fixes: 33fc42de3327 ("net: ethernet: mtk_eth_soc: support creating mac address based offload entries")
  10. Signed-off-by: Yan Cangang <[email protected]>
  11. Reviewed-by: Leon Romanovsky <[email protected]>
  12. Signed-off-by: Jakub Kicinski <[email protected]>
  13. ---
  14. drivers/net/ethernet/mediatek/mtk_eth_soc.c | 9 +++++----
  15. drivers/net/ethernet/mediatek/mtk_ppe.c | 19 +++++++++++++++++--
  16. drivers/net/ethernet/mediatek/mtk_ppe.h | 1 +
  17. 3 files changed, 23 insertions(+), 6 deletions(-)
  18. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  19. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  20. @@ -4089,13 +4089,13 @@ static int mtk_probe(struct platform_dev
  21. eth->soc->offload_version, i);
  22. if (!eth->ppe[i]) {
  23. err = -ENOMEM;
  24. - goto err_deinit_mdio;
  25. + goto err_deinit_ppe;
  26. }
  27. }
  28. err = mtk_eth_offload_init(eth);
  29. if (err)
  30. - goto err_deinit_mdio;
  31. + goto err_deinit_ppe;
  32. }
  33. for (i = 0; i < MTK_MAX_DEVS; i++) {
  34. @@ -4105,7 +4105,7 @@ static int mtk_probe(struct platform_dev
  35. err = register_netdev(eth->netdev[i]);
  36. if (err) {
  37. dev_err(eth->dev, "error bringing up device\n");
  38. - goto err_deinit_mdio;
  39. + goto err_deinit_ppe;
  40. } else
  41. netif_info(eth, probe, eth->netdev[i],
  42. "mediatek frame engine at 0x%08lx, irq %d\n",
  43. @@ -4125,7 +4125,8 @@ static int mtk_probe(struct platform_dev
  44. return 0;
  45. -err_deinit_mdio:
  46. +err_deinit_ppe:
  47. + mtk_ppe_deinit(eth);
  48. mtk_mdio_cleanup(eth);
  49. err_free_dev:
  50. mtk_free_dev(eth);
  51. --- a/drivers/net/ethernet/mediatek/mtk_ppe.c
  52. +++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
  53. @@ -743,7 +743,7 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_
  54. MTK_PPE_ENTRIES * soc->foe_entry_size,
  55. &ppe->foe_phys, GFP_KERNEL);
  56. if (!foe)
  57. - return NULL;
  58. + goto err_free_l2_flows;
  59. ppe->foe_table = foe;
  60. @@ -751,11 +751,26 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_
  61. sizeof(*ppe->foe_flow);
  62. ppe->foe_flow = devm_kzalloc(dev, foe_flow_size, GFP_KERNEL);
  63. if (!ppe->foe_flow)
  64. - return NULL;
  65. + goto err_free_l2_flows;
  66. mtk_ppe_debugfs_init(ppe, index);
  67. return ppe;
  68. +
  69. +err_free_l2_flows:
  70. + rhashtable_destroy(&ppe->l2_flows);
  71. + return NULL;
  72. +}
  73. +
  74. +void mtk_ppe_deinit(struct mtk_eth *eth)
  75. +{
  76. + int i;
  77. +
  78. + for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) {
  79. + if (!eth->ppe[i])
  80. + return;
  81. + rhashtable_destroy(&eth->ppe[i]->l2_flows);
  82. + }
  83. }
  84. static void mtk_ppe_init_foe_table(struct mtk_ppe *ppe)
  85. --- a/drivers/net/ethernet/mediatek/mtk_ppe.h
  86. +++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
  87. @@ -304,6 +304,7 @@ struct mtk_ppe {
  88. struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base,
  89. int version, int index);
  90. +void mtk_ppe_deinit(struct mtk_eth *eth);
  91. void mtk_ppe_start(struct mtk_ppe *ppe);
  92. int mtk_ppe_stop(struct mtk_ppe *ppe);