[dpdk-dev] [PATCH] librte_ether: release memory in uninit function.

2015-06-26 Thread Iremonger, Bernard
> -Original Message-
> From: Ananyev, Konstantin
> Sent: Thursday, June 25, 2015 7:33 PM
> To: Iremonger, Bernard; dev at dpdk.org
> Cc: Zhang, Helin; Qiu, Michael; mukawa at igel.co.jp
> Subject: RE: [PATCH] librte_ether: release memory in uninit function.
> 
> Hi Bernard,
> 
> > -Original Message-
> > From: Iremonger, Bernard
> > Sent: Thursday, June 25, 2015 3:30 PM
> > To: dev at dpdk.org
> > Cc: Zhang, Helin; Ananyev, Konstantin; Qiu, Michael;
> > mukawa at igel.co.jp; Iremonger, Bernard
> > Subject: [PATCH] librte_ether: release memory in uninit function.
> >
> >
> > Signed-off-by: Bernard Iremonger 
> > ---
> >  lib/librte_ether/rte_ethdev.c |8 +++-
> >  1 files changed, 7 insertions(+), 1 deletions(-)
> >
> > diff --git a/lib/librte_ether/rte_ethdev.c
> > b/lib/librte_ether/rte_ethdev.c index e13fde5..2404556 100644
> > --- a/lib/librte_ether/rte_ethdev.c
> > +++ b/lib/librte_ether/rte_ethdev.c
> > @@ -369,8 +369,14 @@ rte_eth_dev_uninit(struct rte_pci_device
> *pci_dev)
> > /* free ether device */
> > rte_eth_dev_release_port(eth_dev);
> >
> > -   if (rte_eal_process_type() == RTE_PROC_PRIMARY)
> > +   if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
> > +   rte_free(eth_dev->data->rx_queues);
> > +   rte_free(eth_dev->data->tx_queues);
> > rte_free(eth_dev->data->dev_private);
> > +   rte_free(eth_dev->data->mac_addrs);
> > +   rte_free(eth_dev->data->hash_mac_addrs);
> 
> Sorry, but I don't understand why you put last 2 rte_free()s here.
> You already do relese mac_addrs and hash_mac_addrs memory at each PMD
> _uninit routine.
> Plus, as Stephen said - it would be better if same component (PMD in that
> case) would do both alloc and free.
> Apart from that, patch looks good to me.
> 
> Konstantin

Hi Konstantin,

I thought it might be safer to free the memory here rather than relying on the 
PMD to do it.
It is probably better if the PMD who does the alloc also does the free.

I will send a v2 of the patch.

Regards,

Bernard.

> 
> 
> > +   memset(eth_dev->data, 0, sizeof(struct
> rte_eth_dev_data));
> > +   }
> >
> > eth_dev->pci_dev = NULL;
> > eth_dev->driver = NULL;
> > --
> > 1.7.4.1



[dpdk-dev] [PATCH] librte_ether: release memory in uninit function.

2015-06-25 Thread Ananyev, Konstantin
Hi Bernard,

> -Original Message-
> From: Iremonger, Bernard
> Sent: Thursday, June 25, 2015 3:30 PM
> To: dev at dpdk.org
> Cc: Zhang, Helin; Ananyev, Konstantin; Qiu, Michael; mukawa at igel.co.jp; 
> Iremonger, Bernard
> Subject: [PATCH] librte_ether: release memory in uninit function.
> 
> 
> Signed-off-by: Bernard Iremonger 
> ---
>  lib/librte_ether/rte_ethdev.c |8 +++-
>  1 files changed, 7 insertions(+), 1 deletions(-)
> 
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> index e13fde5..2404556 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -369,8 +369,14 @@ rte_eth_dev_uninit(struct rte_pci_device *pci_dev)
>   /* free ether device */
>   rte_eth_dev_release_port(eth_dev);
> 
> - if (rte_eal_process_type() == RTE_PROC_PRIMARY)
> + if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
> + rte_free(eth_dev->data->rx_queues);
> + rte_free(eth_dev->data->tx_queues);
>   rte_free(eth_dev->data->dev_private);
> + rte_free(eth_dev->data->mac_addrs);
> + rte_free(eth_dev->data->hash_mac_addrs);

Sorry, but I don't understand why you put last 2 rte_free()s here.
You already do relese mac_addrs and hash_mac_addrs memory at each PMD _uninit 
routine.
Plus, as Stephen said - it would be better if same component (PMD in that case) 
would do both alloc and free.
Apart from that, patch looks good to me.

Konstantin 


> + memset(eth_dev->data, 0, sizeof(struct rte_eth_dev_data));
> + }
> 
>   eth_dev->pci_dev = NULL;
>   eth_dev->driver = NULL;
> --
> 1.7.4.1



[dpdk-dev] [PATCH] librte_ether: release memory in uninit function.

2015-06-25 Thread Bernard Iremonger

Signed-off-by: Bernard Iremonger 
---
 lib/librte_ether/rte_ethdev.c |8 +++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index e13fde5..2404556 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -369,8 +369,14 @@ rte_eth_dev_uninit(struct rte_pci_device *pci_dev)
/* free ether device */
rte_eth_dev_release_port(eth_dev);

-   if (rte_eal_process_type() == RTE_PROC_PRIMARY)
+   if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+   rte_free(eth_dev->data->rx_queues);
+   rte_free(eth_dev->data->tx_queues);
rte_free(eth_dev->data->dev_private);
+   rte_free(eth_dev->data->mac_addrs);
+   rte_free(eth_dev->data->hash_mac_addrs);
+   memset(eth_dev->data, 0, sizeof(struct rte_eth_dev_data));
+   }

eth_dev->pci_dev = NULL;
eth_dev->driver = NULL;
-- 
1.7.4.1



[dpdk-dev] [PATCH] librte_ether: release memory in uninit function.

2015-06-25 Thread Stephen Hemminger
On Thu, 25 Jun 2015 15:30:28 +0100
Bernard Iremonger  wrote:

> Signed-off-by: Bernard Iremonger 
> ---
>  lib/librte_ether/rte_ethdev.c |8 +++-
>  1 files changed, 7 insertions(+), 1 deletions(-)
> 
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> index e13fde5..2404556 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -369,8 +369,14 @@ rte_eth_dev_uninit(struct rte_pci_device *pci_dev)
>   /* free ether device */
>   rte_eth_dev_release_port(eth_dev);
>  
> - if (rte_eal_process_type() == RTE_PROC_PRIMARY)
> + if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
> + rte_free(eth_dev->data->rx_queues);
> + rte_free(eth_dev->data->tx_queues);
>   rte_free(eth_dev->data->dev_private);
> + rte_free(eth_dev->data->mac_addrs);
> + rte_free(eth_dev->data->hash_mac_addrs);
> + memset(eth_dev->data, 0, sizeof(struct rte_eth_dev_data));


Glad to see this problem addressed.

I would prefer that the component that created the object be responsible
for doing its own cleanup.