diff mbox series

net: zynq: Free allocated buffers in case of error

Message ID f4dd9257dc7942752798fc44c310078002a8630e.1581001461.git.michal.simek@xilinx.com
State Accepted
Commit 58ecd9ad0be3b0c4c3e278b718dada687f7e0d9d
Headers show
Series net: zynq: Free allocated buffers in case of error | expand

Commit Message

Michal Simek Feb. 6, 2020, 3:04 p.m. UTC
Driver probe function is called again and again in case of error.
Malloc space is getting full which is is reported by:
 Insufficient RAM for page table: 0x15000 > 0x14000.
 Please increase the size in get_page_table_size()
 ### ERROR ### Please RESET the board ###

The patch is freeing allocated buffers on error path to avoid panic.

Signed-off-by: Michal Simek <michal.simek at xilinx.com>
---

 drivers/net/zynq_gem.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

Comments

Michal Simek Feb. 28, 2020, 11:18 a.m. UTC | #1
?t 6. 2. 2020 v 16:04 odes?latel Michal Simek <michal.simek at xilinx.com> napsal:
>
> Driver probe function is called again and again in case of error.
> Malloc space is getting full which is is reported by:
>  Insufficient RAM for page table: 0x15000 > 0x14000.
>  Please increase the size in get_page_table_size()
>  ### ERROR ### Please RESET the board ###
>
> The patch is freeing allocated buffers on error path to avoid panic.
>
> Signed-off-by: Michal Simek <michal.simek at xilinx.com>
> ---
>
>  drivers/net/zynq_gem.c | 22 +++++++++++++++++-----
>  1 file changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c
> index 879129653df3..745c65cf471c 100644
> --- a/drivers/net/zynq_gem.c
> +++ b/drivers/net/zynq_gem.c
> @@ -659,8 +659,10 @@ static int zynq_gem_probe(struct udevice *dev)
>
>         /* Align bd_space to MMU_SECTION_SHIFT */
>         bd_space = memalign(1 << MMU_SECTION_SHIFT, BD_SPACE);
> -       if (!bd_space)
> -               return -ENOMEM;
> +       if (!bd_space) {
> +               ret = -ENOMEM;
> +               goto err1;
> +       }
>
>         mmu_set_region_dcache_behaviour((phys_addr_t)bd_space,
>                                         BD_SPACE, DCACHE_OFF);
> @@ -672,7 +674,7 @@ static int zynq_gem_probe(struct udevice *dev)
>         ret = clk_get_by_name(dev, "tx_clk", &priv->clk);
>         if (ret < 0) {
>                 dev_err(dev, "failed to get clock\n");
> -               return -EINVAL;
> +               goto err1;
>         }
>
>         priv->bus = mdio_alloc();
> @@ -682,9 +684,19 @@ static int zynq_gem_probe(struct udevice *dev)
>
>         ret = mdio_register_seq(priv->bus, dev->seq);
>         if (ret)
> -               return ret;
> +               goto err2;
>
> -       return zynq_phy_init(dev);
> +       ret = zynq_phy_init(dev);
> +       if (ret)
> +               goto err2;
> +
> +       return ret;
> +
> +err2:
> +       free(priv->rxbuffers);
> +err1:
> +       free(priv->tx_bd);
> +       return ret;
>  }
>
>  static int zynq_gem_remove(struct udevice *dev)
> --
> 2.25.0
>

Applied.
M
diff mbox series

Patch

diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c
index 879129653df3..745c65cf471c 100644
--- a/drivers/net/zynq_gem.c
+++ b/drivers/net/zynq_gem.c
@@ -659,8 +659,10 @@  static int zynq_gem_probe(struct udevice *dev)
 
 	/* Align bd_space to MMU_SECTION_SHIFT */
 	bd_space = memalign(1 << MMU_SECTION_SHIFT, BD_SPACE);
-	if (!bd_space)
-		return -ENOMEM;
+	if (!bd_space) {
+		ret = -ENOMEM;
+		goto err1;
+	}
 
 	mmu_set_region_dcache_behaviour((phys_addr_t)bd_space,
 					BD_SPACE, DCACHE_OFF);
@@ -672,7 +674,7 @@  static int zynq_gem_probe(struct udevice *dev)
 	ret = clk_get_by_name(dev, "tx_clk", &priv->clk);
 	if (ret < 0) {
 		dev_err(dev, "failed to get clock\n");
-		return -EINVAL;
+		goto err1;
 	}
 
 	priv->bus = mdio_alloc();
@@ -682,9 +684,19 @@  static int zynq_gem_probe(struct udevice *dev)
 
 	ret = mdio_register_seq(priv->bus, dev->seq);
 	if (ret)
-		return ret;
+		goto err2;
 
-	return zynq_phy_init(dev);
+	ret = zynq_phy_init(dev);
+	if (ret)
+		goto err2;
+
+	return ret;
+
+err2:
+	free(priv->rxbuffers);
+err1:
+	free(priv->tx_bd);
+	return ret;
 }
 
 static int zynq_gem_remove(struct udevice *dev)