All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 3/4] ll_temac: free everything on error path
@ 2010-07-08 12:10 ` Kulikov Vasiliy
  0 siblings, 0 replies; 12+ messages in thread
From: Kulikov Vasiliy @ 2010-07-08 12:10 UTC (permalink / raw)
  To: Kernel Janitors
  Cc: David S. Miller, John Linn, Grant Likely, Jiri Pirko, Brian Hill, netdev

temac_dma_bd_init() must free all allocated resources: memory, dma, skbs.

Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
---
 drivers/net/ll_temac_main.c |   30 +++++++++++++++++++++++++-----
 1 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c
index a2da3d7..38d658a 100644
--- a/drivers/net/ll_temac_main.c
+++ b/drivers/net/ll_temac_main.c
@@ -200,6 +200,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
 	struct temac_local *lp = netdev_priv(ndev);
 	struct sk_buff *skb;
 	int i;
+	int tx_bd_v_size, rx_bd_v_size;
 
 	lp->rx_skb = kzalloc(sizeof(*lp->rx_skb) * RX_BD_NUM, GFP_KERNEL);
 	if (!lp->rx_skb) {
@@ -209,21 +210,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
 	}
 	/* allocate the tx and rx ring buffer descriptors. */
 	/* returns a virtual addres and a physical address. */
+	tx_bd_v_size = sizeof(*lp->tx_bd_v) * TX_BD_NUM;
 	lp->tx_bd_v = dma_alloc_coherent(ndev->dev.parent,
-					 sizeof(*lp->tx_bd_v) * TX_BD_NUM,
+					tx_bd_v_size,
 					 &lp->tx_bd_p, GFP_KERNEL);
 	if (!lp->tx_bd_v) {
 		dev_err(&ndev->dev,
 				"unable to allocate DMA TX buffer descriptors");
-		goto out;
+		goto err_rx_skb;
 	}
+	rx_bd_v_size = sizeof(*lp->rx_bd_v) * RX_BD_NUM;
 	lp->rx_bd_v = dma_alloc_coherent(ndev->dev.parent,
-					 sizeof(*lp->rx_bd_v) * RX_BD_NUM,
+					 rx_bd_v_size,
 					 &lp->rx_bd_p, GFP_KERNEL);
 	if (!lp->rx_bd_v) {
 		dev_err(&ndev->dev,
 				"unable to allocate DMA RX buffer descriptors");
-		goto out;
+		goto err_tx_bd;
 	}
 
 	memset(lp->tx_bd_v, 0, sizeof(*lp->tx_bd_v) * TX_BD_NUM);
@@ -242,7 +245,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
 
 		if (skb == 0) {
 			dev_err(&ndev->dev, "alloc_skb error %d\n", i);
-			goto out;
+			goto err_dma_single;
 		}
 		lp->rx_skb[i] = skb;
 		/* returns physical address of skb->data */
@@ -274,6 +277,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
 
 	return 0;
 
+err_dma_single:
+	for (i = 0; i < RX_BD_NUM; i++) {
+		if (lp->rx_skb[i] == NULL)
+			break;
+
+		kfree_skb(lp->rx_skb[i]);
+		dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
+				XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
+	}
+
+	dma_free_coherent(ndev->dev.parent, rx_bd_v_size,
+				lp->rx_bd_v, lp->rx_bd_p);
+err_tx_bd:
+	dma_free_coherent(ndev->dev.parent, tx_bd_v_size,
+				lp->tx_bd_v, lp->tx_bd_p);
+err_rx_skb:
+	kfree(lp->rx_skb);
 out:
 	return -ENOMEM;
 }
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/4] ll_temac: free everything on error path
@ 2010-07-08 12:10 ` Kulikov Vasiliy
  0 siblings, 0 replies; 12+ messages in thread
From: Kulikov Vasiliy @ 2010-07-08 12:10 UTC (permalink / raw)
  To: Kernel Janitors
  Cc: David S. Miller, John Linn, Grant Likely, Jiri Pirko, Brian Hill, netdev

temac_dma_bd_init() must free all allocated resources: memory, dma, skbs.

Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
---
 drivers/net/ll_temac_main.c |   30 +++++++++++++++++++++++++-----
 1 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c
index a2da3d7..38d658a 100644
--- a/drivers/net/ll_temac_main.c
+++ b/drivers/net/ll_temac_main.c
@@ -200,6 +200,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
 	struct temac_local *lp = netdev_priv(ndev);
 	struct sk_buff *skb;
 	int i;
+	int tx_bd_v_size, rx_bd_v_size;
 
 	lp->rx_skb = kzalloc(sizeof(*lp->rx_skb) * RX_BD_NUM, GFP_KERNEL);
 	if (!lp->rx_skb) {
@@ -209,21 +210,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
 	}
 	/* allocate the tx and rx ring buffer descriptors. */
 	/* returns a virtual addres and a physical address. */
+	tx_bd_v_size = sizeof(*lp->tx_bd_v) * TX_BD_NUM;
 	lp->tx_bd_v = dma_alloc_coherent(ndev->dev.parent,
-					 sizeof(*lp->tx_bd_v) * TX_BD_NUM,
+					tx_bd_v_size,
 					 &lp->tx_bd_p, GFP_KERNEL);
 	if (!lp->tx_bd_v) {
 		dev_err(&ndev->dev,
 				"unable to allocate DMA TX buffer descriptors");
-		goto out;
+		goto err_rx_skb;
 	}
+	rx_bd_v_size = sizeof(*lp->rx_bd_v) * RX_BD_NUM;
 	lp->rx_bd_v = dma_alloc_coherent(ndev->dev.parent,
-					 sizeof(*lp->rx_bd_v) * RX_BD_NUM,
+					 rx_bd_v_size,
 					 &lp->rx_bd_p, GFP_KERNEL);
 	if (!lp->rx_bd_v) {
 		dev_err(&ndev->dev,
 				"unable to allocate DMA RX buffer descriptors");
-		goto out;
+		goto err_tx_bd;
 	}
 
 	memset(lp->tx_bd_v, 0, sizeof(*lp->tx_bd_v) * TX_BD_NUM);
@@ -242,7 +245,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
 
 		if (skb = 0) {
 			dev_err(&ndev->dev, "alloc_skb error %d\n", i);
-			goto out;
+			goto err_dma_single;
 		}
 		lp->rx_skb[i] = skb;
 		/* returns physical address of skb->data */
@@ -274,6 +277,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
 
 	return 0;
 
+err_dma_single:
+	for (i = 0; i < RX_BD_NUM; i++) {
+		if (lp->rx_skb[i] = NULL)
+			break;
+
+		kfree_skb(lp->rx_skb[i]);
+		dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
+				XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
+	}
+
+	dma_free_coherent(ndev->dev.parent, rx_bd_v_size,
+				lp->rx_bd_v, lp->rx_bd_p);
+err_tx_bd:
+	dma_free_coherent(ndev->dev.parent, tx_bd_v_size,
+				lp->tx_bd_v, lp->tx_bd_p);
+err_rx_skb:
+	kfree(lp->rx_skb);
 out:
 	return -ENOMEM;
 }
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] ll_temac: free everything on error path
  2010-07-08 12:10 ` Kulikov Vasiliy
@ 2010-07-08 13:16   ` Denis Kirjanov
  -1 siblings, 0 replies; 12+ messages in thread
From: Denis Kirjanov @ 2010-07-08 13:16 UTC (permalink / raw)
  To: Kulikov Vasiliy
  Cc: Kernel Janitors, David S. Miller, John Linn, Grant Likely,
	Jiri Pirko, Brian Hill, netdev

On Thu, Jul 8, 2010 at 4:10 PM, Kulikov Vasiliy <segooon@gmail.com> wrote:
> temac_dma_bd_init() must free all allocated resources: memory, dma, skbs.
>
> Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
> ---
>  drivers/net/ll_temac_main.c |   30 +++++++++++++++++++++++++-----
>  1 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c
> index a2da3d7..38d658a 100644
> --- a/drivers/net/ll_temac_main.c
> +++ b/drivers/net/ll_temac_main.c
> @@ -200,6 +200,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
>        struct temac_local *lp = netdev_priv(ndev);
>        struct sk_buff *skb;
>        int i;
> +       int tx_bd_v_size, rx_bd_v_size;
>
>        lp->rx_skb = kzalloc(sizeof(*lp->rx_skb) * RX_BD_NUM, GFP_KERNEL);
>        if (!lp->rx_skb) {
> @@ -209,21 +210,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
>        }
>        /* allocate the tx and rx ring buffer descriptors. */
>        /* returns a virtual addres and a physical address. */
> +       tx_bd_v_size = sizeof(*lp->tx_bd_v) * TX_BD_NUM;
>        lp->tx_bd_v = dma_alloc_coherent(ndev->dev.parent,
> -                                        sizeof(*lp->tx_bd_v) * TX_BD_NUM,
> +                                       tx_bd_v_size,
>                                         &lp->tx_bd_p, GFP_KERNEL);
>        if (!lp->tx_bd_v) {
>                dev_err(&ndev->dev,
>                                "unable to allocate DMA TX buffer descriptors");
> -               goto out;
> +               goto err_rx_skb;
>        }
> +       rx_bd_v_size = sizeof(*lp->rx_bd_v) * RX_BD_NUM;
>        lp->rx_bd_v = dma_alloc_coherent(ndev->dev.parent,
> -                                        sizeof(*lp->rx_bd_v) * RX_BD_NUM,
> +                                        rx_bd_v_size,
>                                         &lp->rx_bd_p, GFP_KERNEL);
>        if (!lp->rx_bd_v) {
>                dev_err(&ndev->dev,
>                                "unable to allocate DMA RX buffer descriptors");
> -               goto out;
> +               goto err_tx_bd;
>        }
>
>        memset(lp->tx_bd_v, 0, sizeof(*lp->tx_bd_v) * TX_BD_NUM);
> @@ -242,7 +245,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
>
>                if (skb == 0) {
>                        dev_err(&ndev->dev, "alloc_skb error %d\n", i);
> -                       goto out;
> +                       goto err_dma_single;
>                }
>                lp->rx_skb[i] = skb;
>                /* returns physical address of skb->data */
> @@ -274,6 +277,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
>
>        return 0;
>
> +err_dma_single:
> +       for (i = 0; i < RX_BD_NUM; i++) {
> +               if (lp->rx_skb[i] == NULL)
> +                       break;
> +
> +               kfree_skb(lp->rx_skb[i]);
> +               dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
> +                               XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
> +       }
> +
> +       dma_free_coherent(ndev->dev.parent, rx_bd_v_size,
> +                               lp->rx_bd_v, lp->rx_bd_p);
> +err_tx_bd:
> +       dma_free_coherent(ndev->dev.parent, tx_bd_v_size,
> +                               lp->tx_bd_v, lp->tx_bd_p);
> +err_rx_skb:
> +       kfree(lp->rx_skb);
>  out:
>        return -ENOMEM;
>  }
> --
> 1.7.0.4
This is not enough. DMA resources also must be released on exit.
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>



-- 
Regards,
Denis

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] ll_temac: free everything on error path
@ 2010-07-08 13:16   ` Denis Kirjanov
  0 siblings, 0 replies; 12+ messages in thread
From: Denis Kirjanov @ 2010-07-08 13:16 UTC (permalink / raw)
  To: Kulikov Vasiliy
  Cc: Kernel Janitors, David S. Miller, John Linn, Grant Likely,
	Jiri Pirko, Brian Hill, netdev

On Thu, Jul 8, 2010 at 4:10 PM, Kulikov Vasiliy <segooon@gmail.com> wrote:
> temac_dma_bd_init() must free all allocated resources: memory, dma, skbs.
>
> Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
> ---
>  drivers/net/ll_temac_main.c |   30 +++++++++++++++++++++++++-----
>  1 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c
> index a2da3d7..38d658a 100644
> --- a/drivers/net/ll_temac_main.c
> +++ b/drivers/net/ll_temac_main.c
> @@ -200,6 +200,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
>        struct temac_local *lp = netdev_priv(ndev);
>        struct sk_buff *skb;
>        int i;
> +       int tx_bd_v_size, rx_bd_v_size;
>
>        lp->rx_skb = kzalloc(sizeof(*lp->rx_skb) * RX_BD_NUM, GFP_KERNEL);
>        if (!lp->rx_skb) {
> @@ -209,21 +210,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
>        }
>        /* allocate the tx and rx ring buffer descriptors. */
>        /* returns a virtual addres and a physical address. */
> +       tx_bd_v_size = sizeof(*lp->tx_bd_v) * TX_BD_NUM;
>        lp->tx_bd_v = dma_alloc_coherent(ndev->dev.parent,
> -                                        sizeof(*lp->tx_bd_v) * TX_BD_NUM,
> +                                       tx_bd_v_size,
>                                         &lp->tx_bd_p, GFP_KERNEL);
>        if (!lp->tx_bd_v) {
>                dev_err(&ndev->dev,
>                                "unable to allocate DMA TX buffer descriptors");
> -               goto out;
> +               goto err_rx_skb;
>        }
> +       rx_bd_v_size = sizeof(*lp->rx_bd_v) * RX_BD_NUM;
>        lp->rx_bd_v = dma_alloc_coherent(ndev->dev.parent,
> -                                        sizeof(*lp->rx_bd_v) * RX_BD_NUM,
> +                                        rx_bd_v_size,
>                                         &lp->rx_bd_p, GFP_KERNEL);
>        if (!lp->rx_bd_v) {
>                dev_err(&ndev->dev,
>                                "unable to allocate DMA RX buffer descriptors");
> -               goto out;
> +               goto err_tx_bd;
>        }
>
>        memset(lp->tx_bd_v, 0, sizeof(*lp->tx_bd_v) * TX_BD_NUM);
> @@ -242,7 +245,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
>
>                if (skb = 0) {
>                        dev_err(&ndev->dev, "alloc_skb error %d\n", i);
> -                       goto out;
> +                       goto err_dma_single;
>                }
>                lp->rx_skb[i] = skb;
>                /* returns physical address of skb->data */
> @@ -274,6 +277,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
>
>        return 0;
>
> +err_dma_single:
> +       for (i = 0; i < RX_BD_NUM; i++) {
> +               if (lp->rx_skb[i] = NULL)
> +                       break;
> +
> +               kfree_skb(lp->rx_skb[i]);
> +               dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
> +                               XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
> +       }
> +
> +       dma_free_coherent(ndev->dev.parent, rx_bd_v_size,
> +                               lp->rx_bd_v, lp->rx_bd_p);
> +err_tx_bd:
> +       dma_free_coherent(ndev->dev.parent, tx_bd_v_size,
> +                               lp->tx_bd_v, lp->tx_bd_p);
> +err_rx_skb:
> +       kfree(lp->rx_skb);
>  out:
>        return -ENOMEM;
>  }
> --
> 1.7.0.4
This is not enough. DMA resources also must be released on exit.
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>



-- 
Regards,
Denis
--
To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] ll_temac: free everything on error path
  2010-07-08 13:16   ` Denis Kirjanov
@ 2010-07-08 13:46     ` Kulikov Vasiliy
  -1 siblings, 0 replies; 12+ messages in thread
From: Kulikov Vasiliy @ 2010-07-08 13:46 UTC (permalink / raw)
  To: dkirjanov
  Cc: Kernel Janitors, David S. Miller, John Linn, Grant Likely,
	Jiri Pirko, Brian Hill, netdev

On Thu, Jul 08, 2010 at 17:16 +0400, Denis Kirjanov wrote:
> On Thu, Jul 8, 2010 at 4:10 PM, Kulikov Vasiliy <segooon@gmail.com> wrote:
> > temac_dma_bd_init() must free all allocated resources: memory, dma, skbs.
> >
> > Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
> > ---
> >  drivers/net/ll_temac_main.c |   30 +++++++++++++++++++++++++-----
> >  1 files changed, 25 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c
> > index a2da3d7..38d658a 100644
> > --- a/drivers/net/ll_temac_main.c
> > +++ b/drivers/net/ll_temac_main.c
> > @@ -200,6 +200,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
> >        struct temac_local *lp = netdev_priv(ndev);
> >        struct sk_buff *skb;
> >        int i;
> > +       int tx_bd_v_size, rx_bd_v_size;
> >
> >        lp->rx_skb = kzalloc(sizeof(*lp->rx_skb) * RX_BD_NUM, GFP_KERNEL);
> >        if (!lp->rx_skb) {
> > @@ -209,21 +210,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
> >        }
> >        /* allocate the tx and rx ring buffer descriptors. */
> >        /* returns a virtual addres and a physical address. */
> > +       tx_bd_v_size = sizeof(*lp->tx_bd_v) * TX_BD_NUM;
> >        lp->tx_bd_v = dma_alloc_coherent(ndev->dev.parent,
           ^^^^^^^^^^^
            1st
> > -                                        sizeof(*lp->tx_bd_v) * TX_BD_NUM,
> > +                                       tx_bd_v_size,
> >                                         &lp->tx_bd_p, GFP_KERNEL);
> >        if (!lp->tx_bd_v) {
> >                dev_err(&ndev->dev,
> >                                "unable to allocate DMA TX buffer descriptors");
> > -               goto out;
> > +               goto err_rx_skb;
> >        }
> > +       rx_bd_v_size = sizeof(*lp->rx_bd_v) * RX_BD_NUM;
> >        lp->rx_bd_v = dma_alloc_coherent(ndev->dev.parent,
           ^^^^^^^^^^^
            2nd
> > -                                        sizeof(*lp->rx_bd_v) * RX_BD_NUM,
> > +                                        rx_bd_v_size,
> >                                         &lp->rx_bd_p, GFP_KERNEL);
> >        if (!lp->rx_bd_v) {
> >                dev_err(&ndev->dev,
> >                                "unable to allocate DMA RX buffer descriptors");
> > -               goto out;
> > +               goto err_tx_bd;
> >        }
> >
> >        memset(lp->tx_bd_v, 0, sizeof(*lp->tx_bd_v) * TX_BD_NUM);
> > @@ -242,7 +245,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
> >
> >                if (skb == 0) {
> >                        dev_err(&ndev->dev, "alloc_skb error %d\n", i);
> > -                       goto out;
> > +                       goto err_dma_single;
> >                }
> >                lp->rx_skb[i] = skb;
> >                /* returns physical address of skb->data */
> > @@ -274,6 +277,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
> >
> >        return 0;
> >
> > +err_dma_single:
> > +       for (i = 0; i < RX_BD_NUM; i++) {
> > +               if (lp->rx_skb[i] == NULL)
> > +                       break;
> > +
> > +               kfree_skb(lp->rx_skb[i]);
> > +               dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
> > +                               XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
> > +       }
> > +
> > +       dma_free_coherent(ndev->dev.parent, rx_bd_v_size,
> > +                               lp->rx_bd_v, lp->rx_bd_p);
                                    ^^^^^^^^^^^
                                     2nd
> > +err_tx_bd:
> > +       dma_free_coherent(ndev->dev.parent, tx_bd_v_size,
> > +                               lp->tx_bd_v, lp->tx_bd_p);
                                    ^^^^^^^^^^^
                                     1st
> > +err_rx_skb:
> > +       kfree(lp->rx_skb);
> >  out:
> >        return -ENOMEM;
> >  }
> > --
> > 1.7.0.4
> This is not enough. DMA resources also must be released on exit.
Could you point to it? I see only two variables with allocated DMA (see above).

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] ll_temac: free everything on error path
@ 2010-07-08 13:46     ` Kulikov Vasiliy
  0 siblings, 0 replies; 12+ messages in thread
From: Kulikov Vasiliy @ 2010-07-08 13:46 UTC (permalink / raw)
  To: dkirjanov
  Cc: Kernel Janitors, David S. Miller, John Linn, Grant Likely,
	Jiri Pirko, Brian Hill, netdev

On Thu, Jul 08, 2010 at 17:16 +0400, Denis Kirjanov wrote:
> On Thu, Jul 8, 2010 at 4:10 PM, Kulikov Vasiliy <segooon@gmail.com> wrote:
> > temac_dma_bd_init() must free all allocated resources: memory, dma, skbs.
> >
> > Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
> > ---
> >  drivers/net/ll_temac_main.c |   30 +++++++++++++++++++++++++-----
> >  1 files changed, 25 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c
> > index a2da3d7..38d658a 100644
> > --- a/drivers/net/ll_temac_main.c
> > +++ b/drivers/net/ll_temac_main.c
> > @@ -200,6 +200,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
> >        struct temac_local *lp = netdev_priv(ndev);
> >        struct sk_buff *skb;
> >        int i;
> > +       int tx_bd_v_size, rx_bd_v_size;
> >
> >        lp->rx_skb = kzalloc(sizeof(*lp->rx_skb) * RX_BD_NUM, GFP_KERNEL);
> >        if (!lp->rx_skb) {
> > @@ -209,21 +210,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
> >        }
> >        /* allocate the tx and rx ring buffer descriptors. */
> >        /* returns a virtual addres and a physical address. */
> > +       tx_bd_v_size = sizeof(*lp->tx_bd_v) * TX_BD_NUM;
> >        lp->tx_bd_v = dma_alloc_coherent(ndev->dev.parent,
           ^^^^^^^^^^^
            1st
> > -                                        sizeof(*lp->tx_bd_v) * TX_BD_NUM,
> > +                                       tx_bd_v_size,
> >                                         &lp->tx_bd_p, GFP_KERNEL);
> >        if (!lp->tx_bd_v) {
> >                dev_err(&ndev->dev,
> >                                "unable to allocate DMA TX buffer descriptors");
> > -               goto out;
> > +               goto err_rx_skb;
> >        }
> > +       rx_bd_v_size = sizeof(*lp->rx_bd_v) * RX_BD_NUM;
> >        lp->rx_bd_v = dma_alloc_coherent(ndev->dev.parent,
           ^^^^^^^^^^^
            2nd
> > -                                        sizeof(*lp->rx_bd_v) * RX_BD_NUM,
> > +                                        rx_bd_v_size,
> >                                         &lp->rx_bd_p, GFP_KERNEL);
> >        if (!lp->rx_bd_v) {
> >                dev_err(&ndev->dev,
> >                                "unable to allocate DMA RX buffer descriptors");
> > -               goto out;
> > +               goto err_tx_bd;
> >        }
> >
> >        memset(lp->tx_bd_v, 0, sizeof(*lp->tx_bd_v) * TX_BD_NUM);
> > @@ -242,7 +245,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
> >
> >                if (skb = 0) {
> >                        dev_err(&ndev->dev, "alloc_skb error %d\n", i);
> > -                       goto out;
> > +                       goto err_dma_single;
> >                }
> >                lp->rx_skb[i] = skb;
> >                /* returns physical address of skb->data */
> > @@ -274,6 +277,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
> >
> >        return 0;
> >
> > +err_dma_single:
> > +       for (i = 0; i < RX_BD_NUM; i++) {
> > +               if (lp->rx_skb[i] = NULL)
> > +                       break;
> > +
> > +               kfree_skb(lp->rx_skb[i]);
> > +               dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
> > +                               XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
> > +       }
> > +
> > +       dma_free_coherent(ndev->dev.parent, rx_bd_v_size,
> > +                               lp->rx_bd_v, lp->rx_bd_p);
                                    ^^^^^^^^^^^
                                     2nd
> > +err_tx_bd:
> > +       dma_free_coherent(ndev->dev.parent, tx_bd_v_size,
> > +                               lp->tx_bd_v, lp->tx_bd_p);
                                    ^^^^^^^^^^^
                                     1st
> > +err_rx_skb:
> > +       kfree(lp->rx_skb);
> >  out:
> >        return -ENOMEM;
> >  }
> > --
> > 1.7.0.4
> This is not enough. DMA resources also must be released on exit.
Could you point to it? I see only two variables with allocated DMA (see above).
--
To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] ll_temac: free everything on error path
  2010-07-08 13:46     ` Kulikov Vasiliy
@ 2010-07-08 13:56       ` Denis Kirjanov
  -1 siblings, 0 replies; 12+ messages in thread
From: Denis Kirjanov @ 2010-07-08 13:56 UTC (permalink / raw)
  To: Kulikov Vasiliy
  Cc: Kernel Janitors, David S. Miller, John Linn, Grant Likely,
	Jiri Pirko, Brian Hill, netdev

On Thu, Jul 8, 2010 at 5:46 PM, Kulikov Vasiliy <segooon@gmail.com> wrote:
> On Thu, Jul 08, 2010 at 17:16 +0400, Denis Kirjanov wrote:
>> On Thu, Jul 8, 2010 at 4:10 PM, Kulikov Vasiliy <segooon@gmail.com> wrote:
>> > temac_dma_bd_init() must free all allocated resources: memory, dma, skbs.
>> >
>> > Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
>> > ---
>> >  drivers/net/ll_temac_main.c |   30 +++++++++++++++++++++++++-----
>> >  1 files changed, 25 insertions(+), 5 deletions(-)
>> >
>> > diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c
>> > index a2da3d7..38d658a 100644
>> > --- a/drivers/net/ll_temac_main.c
>> > +++ b/drivers/net/ll_temac_main.c
>> > @@ -200,6 +200,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
>> >        struct temac_local *lp = netdev_priv(ndev);
>> >        struct sk_buff *skb;
>> >        int i;
>> > +       int tx_bd_v_size, rx_bd_v_size;
>> >
>> >        lp->rx_skb = kzalloc(sizeof(*lp->rx_skb) * RX_BD_NUM, GFP_KERNEL);
>> >        if (!lp->rx_skb) {
>> > @@ -209,21 +210,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
>> >        }
>> >        /* allocate the tx and rx ring buffer descriptors. */
>> >        /* returns a virtual addres and a physical address. */
>> > +       tx_bd_v_size = sizeof(*lp->tx_bd_v) * TX_BD_NUM;
>> >        lp->tx_bd_v = dma_alloc_coherent(ndev->dev.parent,
>           ^^^^^^^^^^^
>            1st
>> > -                                        sizeof(*lp->tx_bd_v) * TX_BD_NUM,
>> > +                                       tx_bd_v_size,
>> >                                         &lp->tx_bd_p, GFP_KERNEL);
>> >        if (!lp->tx_bd_v) {
>> >                dev_err(&ndev->dev,
>> >                                "unable to allocate DMA TX buffer descriptors");
>> > -               goto out;
>> > +               goto err_rx_skb;
>> >        }
>> > +       rx_bd_v_size = sizeof(*lp->rx_bd_v) * RX_BD_NUM;
>> >        lp->rx_bd_v = dma_alloc_coherent(ndev->dev.parent,
>           ^^^^^^^^^^^
>            2nd
>> > -                                        sizeof(*lp->rx_bd_v) * RX_BD_NUM,
>> > +                                        rx_bd_v_size,
>> >                                         &lp->rx_bd_p, GFP_KERNEL);
>> >        if (!lp->rx_bd_v) {
>> >                dev_err(&ndev->dev,
>> >                                "unable to allocate DMA RX buffer descriptors");
>> > -               goto out;
>> > +               goto err_tx_bd;
>> >        }
>> >
>> >        memset(lp->tx_bd_v, 0, sizeof(*lp->tx_bd_v) * TX_BD_NUM);
>> > @@ -242,7 +245,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
>> >
>> >                if (skb == 0) {
>> >                        dev_err(&ndev->dev, "alloc_skb error %d\n", i);
>> > -                       goto out;
>> > +                       goto err_dma_single;
>> >                }
>> >                lp->rx_skb[i] = skb;
>> >                /* returns physical address of skb->data */
>> > @@ -274,6 +277,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
>> >
>> >        return 0;
>> >
>> > +err_dma_single:
>> > +       for (i = 0; i < RX_BD_NUM; i++) {
>> > +               if (lp->rx_skb[i] == NULL)
>> > +                       break;
>> > +
>> > +               kfree_skb(lp->rx_skb[i]);
>> > +               dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
>> > +                               XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
>> > +       }
>> > +
>> > +       dma_free_coherent(ndev->dev.parent, rx_bd_v_size,
>> > +                               lp->rx_bd_v, lp->rx_bd_p);
>                                    ^^^^^^^^^^^
>                                     2nd
>> > +err_tx_bd:
>> > +       dma_free_coherent(ndev->dev.parent, tx_bd_v_size,
>> > +                               lp->tx_bd_v, lp->tx_bd_p);
>                                    ^^^^^^^^^^^
>                                     1st
>> > +err_rx_skb:
>> > +       kfree(lp->rx_skb);
>> >  out:
>> >        return -ENOMEM;
>> >  }
>> > --
>> > 1.7.0.4
>> This is not enough. DMA resources also must be released on exit.
> Could you point to it? I see only two variables with allocated DMA (see above).
> --
I just sent a patch that fixes this.

> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>



-- 
Regards,
Denis

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] ll_temac: free everything on error path
@ 2010-07-08 13:56       ` Denis Kirjanov
  0 siblings, 0 replies; 12+ messages in thread
From: Denis Kirjanov @ 2010-07-08 13:56 UTC (permalink / raw)
  To: Kulikov Vasiliy
  Cc: Kernel Janitors, David S. Miller, John Linn, Grant Likely,
	Jiri Pirko, Brian Hill, netdev

On Thu, Jul 8, 2010 at 5:46 PM, Kulikov Vasiliy <segooon@gmail.com> wrote:
> On Thu, Jul 08, 2010 at 17:16 +0400, Denis Kirjanov wrote:
>> On Thu, Jul 8, 2010 at 4:10 PM, Kulikov Vasiliy <segooon@gmail.com> wrote:
>> > temac_dma_bd_init() must free all allocated resources: memory, dma, skbs.
>> >
>> > Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
>> > ---
>> >  drivers/net/ll_temac_main.c |   30 +++++++++++++++++++++++++-----
>> >  1 files changed, 25 insertions(+), 5 deletions(-)
>> >
>> > diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c
>> > index a2da3d7..38d658a 100644
>> > --- a/drivers/net/ll_temac_main.c
>> > +++ b/drivers/net/ll_temac_main.c
>> > @@ -200,6 +200,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
>> >        struct temac_local *lp = netdev_priv(ndev);
>> >        struct sk_buff *skb;
>> >        int i;
>> > +       int tx_bd_v_size, rx_bd_v_size;
>> >
>> >        lp->rx_skb = kzalloc(sizeof(*lp->rx_skb) * RX_BD_NUM, GFP_KERNEL);
>> >        if (!lp->rx_skb) {
>> > @@ -209,21 +210,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
>> >        }
>> >        /* allocate the tx and rx ring buffer descriptors. */
>> >        /* returns a virtual addres and a physical address. */
>> > +       tx_bd_v_size = sizeof(*lp->tx_bd_v) * TX_BD_NUM;
>> >        lp->tx_bd_v = dma_alloc_coherent(ndev->dev.parent,
>           ^^^^^^^^^^^
>            1st
>> > -                                        sizeof(*lp->tx_bd_v) * TX_BD_NUM,
>> > +                                       tx_bd_v_size,
>> >                                         &lp->tx_bd_p, GFP_KERNEL);
>> >        if (!lp->tx_bd_v) {
>> >                dev_err(&ndev->dev,
>> >                                "unable to allocate DMA TX buffer descriptors");
>> > -               goto out;
>> > +               goto err_rx_skb;
>> >        }
>> > +       rx_bd_v_size = sizeof(*lp->rx_bd_v) * RX_BD_NUM;
>> >        lp->rx_bd_v = dma_alloc_coherent(ndev->dev.parent,
>           ^^^^^^^^^^^
>            2nd
>> > -                                        sizeof(*lp->rx_bd_v) * RX_BD_NUM,
>> > +                                        rx_bd_v_size,
>> >                                         &lp->rx_bd_p, GFP_KERNEL);
>> >        if (!lp->rx_bd_v) {
>> >                dev_err(&ndev->dev,
>> >                                "unable to allocate DMA RX buffer descriptors");
>> > -               goto out;
>> > +               goto err_tx_bd;
>> >        }
>> >
>> >        memset(lp->tx_bd_v, 0, sizeof(*lp->tx_bd_v) * TX_BD_NUM);
>> > @@ -242,7 +245,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
>> >
>> >                if (skb = 0) {
>> >                        dev_err(&ndev->dev, "alloc_skb error %d\n", i);
>> > -                       goto out;
>> > +                       goto err_dma_single;
>> >                }
>> >                lp->rx_skb[i] = skb;
>> >                /* returns physical address of skb->data */
>> > @@ -274,6 +277,23 @@ static int temac_dma_bd_init(struct net_device *ndev)
>> >
>> >        return 0;
>> >
>> > +err_dma_single:
>> > +       for (i = 0; i < RX_BD_NUM; i++) {
>> > +               if (lp->rx_skb[i] = NULL)
>> > +                       break;
>> > +
>> > +               kfree_skb(lp->rx_skb[i]);
>> > +               dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
>> > +                               XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
>> > +       }
>> > +
>> > +       dma_free_coherent(ndev->dev.parent, rx_bd_v_size,
>> > +                               lp->rx_bd_v, lp->rx_bd_p);
>                                    ^^^^^^^^^^^
>                                     2nd
>> > +err_tx_bd:
>> > +       dma_free_coherent(ndev->dev.parent, tx_bd_v_size,
>> > +                               lp->tx_bd_v, lp->tx_bd_p);
>                                    ^^^^^^^^^^^
>                                     1st
>> > +err_rx_skb:
>> > +       kfree(lp->rx_skb);
>> >  out:
>> >        return -ENOMEM;
>> >  }
>> > --
>> > 1.7.0.4
>> This is not enough. DMA resources also must be released on exit.
> Could you point to it? I see only two variables with allocated DMA (see above).
> --
I just sent a patch that fixes this.

> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>



-- 
Regards,
Denis
--
To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] ll_temac: free everything on error path
  2010-07-08 13:56       ` Denis Kirjanov
@ 2010-07-08 14:24         ` Kulikov Vasiliy
  -1 siblings, 0 replies; 12+ messages in thread
From: Kulikov Vasiliy @ 2010-07-08 14:24 UTC (permalink / raw)
  To: dkirjanov
  Cc: Kernel Janitors, David S. Miller, John Linn, Grant Likely,
	Jiri Pirko, Brian Hill, netdev

> I just sent a patch that fixes this.
Hey, you forgot to CC me/kernel-janitors in your patch.

Anyway,
> /**
>+ *  * temac_dma_bd_release - Release buffer descriptor rings
>+ */
>+static void temac_dma_bd_release(struct net_device *ndev)
>+{
>+   struct temac_local *lp = netdev_priv(ndev);
>+   int i;
>+
>+   for (i = 0; i < RX_BD_NUM; i++) {
>+       if (lp->rx_skb[i]) {
            ^^^^^^^^^^
This can be NULL if kzalloc() failed.
>+           dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
>+                   XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
>+           dev_kfree_skb(lp->rx_skb[i]);
>+       }
>+   }
>+   dma_free_coherent(ndev->dev.parent, sizeof(*lp->rx_bd_v) * RX_BD_NUM,
>+           lp->rx_bd_v, lp->rx_bd_p);
>+   dma_free_coherent(ndev->dev.parent, sizeof(*lp->tx_bd_v) * TX_BD_NUM,
>+           lp->tx_bd_v, lp->tx_bd_p);

These two DMA's can be unallocated if dma_alloc_coherent() failed.

I wanted to introduce many labels to divide these error cases because of it.

>+   kfree(lp->rx_skb);
>+}

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] ll_temac: free everything on error path
@ 2010-07-08 14:24         ` Kulikov Vasiliy
  0 siblings, 0 replies; 12+ messages in thread
From: Kulikov Vasiliy @ 2010-07-08 14:24 UTC (permalink / raw)
  To: dkirjanov
  Cc: Kernel Janitors, David S. Miller, John Linn, Grant Likely,
	Jiri Pirko, Brian Hill, netdev

> I just sent a patch that fixes this.
Hey, you forgot to CC me/kernel-janitors in your patch.

Anyway,
> /**
>+ *  * temac_dma_bd_release - Release buffer descriptor rings
>+ */
>+static void temac_dma_bd_release(struct net_device *ndev)
>+{
>+   struct temac_local *lp = netdev_priv(ndev);
>+   int i;
>+
>+   for (i = 0; i < RX_BD_NUM; i++) {
>+       if (lp->rx_skb[i]) {
            ^^^^^^^^^^
This can be NULL if kzalloc() failed.
>+           dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
>+                   XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
>+           dev_kfree_skb(lp->rx_skb[i]);
>+       }
>+   }
>+   dma_free_coherent(ndev->dev.parent, sizeof(*lp->rx_bd_v) * RX_BD_NUM,
>+           lp->rx_bd_v, lp->rx_bd_p);
>+   dma_free_coherent(ndev->dev.parent, sizeof(*lp->tx_bd_v) * TX_BD_NUM,
>+           lp->tx_bd_v, lp->tx_bd_p);

These two DMA's can be unallocated if dma_alloc_coherent() failed.

I wanted to introduce many labels to divide these error cases because of it.

>+   kfree(lp->rx_skb);
>+}

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 3/4 v3] ll_temac: fix DMA and memory leaks
  2010-07-08 13:16   ` Denis Kirjanov
@ 2010-07-10  7:30     ` Kulikov Vasiliy
  -1 siblings, 0 replies; 12+ messages in thread
From: Kulikov Vasiliy @ 2010-07-10  7:30 UTC (permalink / raw)
  To: dkirjanov
  Cc: Kernel Janitors, David S. Miller, John Linn, Grant Likely,
	Jiri Pirko, Brian Hill, netdev

temac_dma_bd_init() doesn't free DMA and memory on error. Also
temac_stop() must free them.

Signed-off-by: Denis Kirjanov <dkirjanov@kernel.org>
Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
---
 drivers/net/ll_temac_main.c |   38 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c
index 5bca20b..9090e79 100644
--- a/drivers/net/ll_temac_main.c
+++ b/drivers/net/ll_temac_main.c
@@ -193,6 +193,41 @@ static int temac_dcr_setup(struct temac_local *lp, struct of_device *op,
 #endif
 
 /**
+ *  * temac_dma_bd_release - Release buffer descriptor rings
+ */
+static void temac_dma_bd_release(struct net_device *ndev)
+{
+	struct temac_local *lp = netdev_priv(ndev);
+	int i;
+
+	if (lp->rx_skb) {
+		for (i = 0; i < RX_BD_NUM; i++) {
+			if (!lp->rx_skb[i])
+				break;
+			dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
+				    XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
+			dev_kfree_skb(lp->rx_skb[i]);
+		}
+		kfree(lp->rx_skb);
+		lp->rx_skb = NULL;
+	}
+
+	if (lp->rx_bd_v) {
+		dma_free_coherent(ndev->dev.parent,
+				sizeof(*lp->rx_bd_v) * RX_BD_NUM,
+				lp->rx_bd_v, lp->rx_bd_p);
+		lp->rx_bd_v = NULL;
+	}
+
+	if (lp->tx_bd_v) {
+		dma_free_coherent(ndev->dev.parent,
+				sizeof(*lp->tx_bd_v) * TX_BD_NUM,
+				lp->tx_bd_v, lp->tx_bd_p);
+		lp->tx_bd_v = NULL;
+	}
+}
+
+/**
  * temac_dma_bd_init - Setup buffer descriptor rings
  */
 static int temac_dma_bd_init(struct net_device *ndev)
@@ -275,6 +310,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
 	return 0;
 
 out:
+	temac_dma_bd_release(ndev);
 	return -ENOMEM;
 }
 
@@ -858,6 +894,8 @@ static int temac_stop(struct net_device *ndev)
 		phy_disconnect(lp->phy_dev);
 	lp->phy_dev = NULL;
 
+	temac_dma_bd_release(ndev);
+
 	return 0;
 }
 
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/4 v3] ll_temac: fix DMA and memory leaks
@ 2010-07-10  7:30     ` Kulikov Vasiliy
  0 siblings, 0 replies; 12+ messages in thread
From: Kulikov Vasiliy @ 2010-07-10  7:30 UTC (permalink / raw)
  To: dkirjanov
  Cc: Kernel Janitors, David S. Miller, John Linn, Grant Likely,
	Jiri Pirko, Brian Hill, netdev

temac_dma_bd_init() doesn't free DMA and memory on error. Also
temac_stop() must free them.

Signed-off-by: Denis Kirjanov <dkirjanov@kernel.org>
Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
---
 drivers/net/ll_temac_main.c |   38 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c
index 5bca20b..9090e79 100644
--- a/drivers/net/ll_temac_main.c
+++ b/drivers/net/ll_temac_main.c
@@ -193,6 +193,41 @@ static int temac_dcr_setup(struct temac_local *lp, struct of_device *op,
 #endif
 
 /**
+ *  * temac_dma_bd_release - Release buffer descriptor rings
+ */
+static void temac_dma_bd_release(struct net_device *ndev)
+{
+	struct temac_local *lp = netdev_priv(ndev);
+	int i;
+
+	if (lp->rx_skb) {
+		for (i = 0; i < RX_BD_NUM; i++) {
+			if (!lp->rx_skb[i])
+				break;
+			dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys,
+				    XTE_MAX_JUMBO_FRAME_SIZE, DMA_FROM_DEVICE);
+			dev_kfree_skb(lp->rx_skb[i]);
+		}
+		kfree(lp->rx_skb);
+		lp->rx_skb = NULL;
+	}
+
+	if (lp->rx_bd_v) {
+		dma_free_coherent(ndev->dev.parent,
+				sizeof(*lp->rx_bd_v) * RX_BD_NUM,
+				lp->rx_bd_v, lp->rx_bd_p);
+		lp->rx_bd_v = NULL;
+	}
+
+	if (lp->tx_bd_v) {
+		dma_free_coherent(ndev->dev.parent,
+				sizeof(*lp->tx_bd_v) * TX_BD_NUM,
+				lp->tx_bd_v, lp->tx_bd_p);
+		lp->tx_bd_v = NULL;
+	}
+}
+
+/**
  * temac_dma_bd_init - Setup buffer descriptor rings
  */
 static int temac_dma_bd_init(struct net_device *ndev)
@@ -275,6 +310,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
 	return 0;
 
 out:
+	temac_dma_bd_release(ndev);
 	return -ENOMEM;
 }
 
@@ -858,6 +894,8 @@ static int temac_stop(struct net_device *ndev)
 		phy_disconnect(lp->phy_dev);
 	lp->phy_dev = NULL;
 
+	temac_dma_bd_release(ndev);
+
 	return 0;
 }
 
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2010-07-10  7:32 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-07-08 12:10 [PATCH 3/4] ll_temac: free everything on error path Kulikov Vasiliy
2010-07-08 12:10 ` Kulikov Vasiliy
2010-07-08 13:16 ` Denis Kirjanov
2010-07-08 13:16   ` Denis Kirjanov
2010-07-08 13:46   ` Kulikov Vasiliy
2010-07-08 13:46     ` Kulikov Vasiliy
2010-07-08 13:56     ` Denis Kirjanov
2010-07-08 13:56       ` Denis Kirjanov
2010-07-08 14:24       ` Kulikov Vasiliy
2010-07-08 14:24         ` Kulikov Vasiliy
2010-07-10  7:30   ` [PATCH 3/4 v3] ll_temac: fix DMA and memory leaks Kulikov Vasiliy
2010-07-10  7:30     ` Kulikov Vasiliy

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.