[dpdk-dev,v2] net:bonding: fix free_queues function when no queues exist

Message ID 1445843277-10934-1-git-send-email-yaacovh@mellanox.com (mailing list archive)
State Accepted, archived
Headers

Commit Message

Yaacov Hazan Oct. 26, 2015, 7:07 a.m. UTC
  From: Raslsn Darawsheh <rdarawsheh@asaltech.com>

In case of creating bond device without add any slaves and
quit from testpmd, application crashed since rx/tx queues
are NULL.

add checking of this paramters before trying to free.

Signed-off-by: Raslsn Darawsheh <rdarawsheh@asaltech.com>
Signed-off-by: Yaacov Hazan <yaacovh@mellanox.com>
---
in previous patch there was mismatch in the solution.
this patch is the correct fix for the described bug

 drivers/net/bonding/rte_eth_bond_pmd.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)
  

Comments

Doherty, Declan Oct. 29, 2015, 4:25 p.m. UTC | #1
On 26/10/15 07:07, Yaacov Hazan wrote:
> From: Raslsn Darawsheh <rdarawsheh@asaltech.com>
>
> In case of creating bond device without add any slaves and
> quit from testpmd, application crashed since rx/tx queues
> are NULL.
>
> add checking of this paramters before trying to free.
>
> Signed-off-by: Raslsn Darawsheh <rdarawsheh@asaltech.com>
> Signed-off-by: Yaacov Hazan <yaacovh@mellanox.com>
> ---
> in previous patch there was mismatch in the solution.
> this patch is the correct fix for the described bug
>
>   drivers/net/bonding/rte_eth_bond_pmd.c | 20 ++++++++++++--------
>   1 file changed, 12 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
> index 5cc6372..383fdcf 100644
> --- a/drivers/net/bonding/rte_eth_bond_pmd.c
> +++ b/drivers/net/bonding/rte_eth_bond_pmd.c
> @@ -1517,17 +1517,21 @@ bond_ethdev_free_queues(struct rte_eth_dev *dev)
>   {
>   	uint8_t i;
>
> -	for (i = 0; i < dev->data->nb_rx_queues; i++) {
> -		rte_free(dev->data->rx_queues[i]);
> -		dev->data->rx_queues[i] = NULL;
> +	if (dev->data->rx_queues != NULL) {
> +		for (i = 0; i < dev->data->nb_rx_queues; i++) {
> +			rte_free(dev->data->rx_queues[i]);
> +			dev->data->rx_queues[i] = NULL;
> +		}
> +		dev->data->nb_rx_queues = 0;
>   	}
> -	dev->data->nb_rx_queues = 0;
>
> -	for (i = 0; i < dev->data->nb_tx_queues; i++) {
> -		rte_free(dev->data->tx_queues[i]);
> -		dev->data->tx_queues[i] = NULL;
> +	if (dev->data->tx_queues != NULL) {
> +		for (i = 0; i < dev->data->nb_tx_queues; i++) {
> +			rte_free(dev->data->tx_queues[i]);
> +			dev->data->tx_queues[i] = NULL;
> +		}
> +		dev->data->nb_tx_queues = 0;
>   	}
> -	dev->data->nb_tx_queues = 0;
>   }
>
>   void
>
Acked-by: Declan Doherty <declan.doherty@intel.com>
  
Thomas Monjalon Nov. 4, 2015, 10:47 p.m. UTC | #2
> > In case of creating bond device without add any slaves and
> > quit from testpmd, application crashed since rx/tx queues
> > are NULL.
> >
> > add checking of this paramters before trying to free.
> >
> > Signed-off-by: Raslsn Darawsheh <rdarawsheh@asaltech.com>
> > Signed-off-by: Yaacov Hazan <yaacovh@mellanox.com>
> 
> Acked-by: Declan Doherty <declan.doherty@intel.com>

Applied, thanks
  

Patch

diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 5cc6372..383fdcf 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -1517,17 +1517,21 @@  bond_ethdev_free_queues(struct rte_eth_dev *dev)
 {
 	uint8_t i;
 
-	for (i = 0; i < dev->data->nb_rx_queues; i++) {
-		rte_free(dev->data->rx_queues[i]);
-		dev->data->rx_queues[i] = NULL;
+	if (dev->data->rx_queues != NULL) {
+		for (i = 0; i < dev->data->nb_rx_queues; i++) {
+			rte_free(dev->data->rx_queues[i]);
+			dev->data->rx_queues[i] = NULL;
+		}
+		dev->data->nb_rx_queues = 0;
 	}
-	dev->data->nb_rx_queues = 0;
 
-	for (i = 0; i < dev->data->nb_tx_queues; i++) {
-		rte_free(dev->data->tx_queues[i]);
-		dev->data->tx_queues[i] = NULL;
+	if (dev->data->tx_queues != NULL) {
+		for (i = 0; i < dev->data->nb_tx_queues; i++) {
+			rte_free(dev->data->tx_queues[i]);
+			dev->data->tx_queues[i] = NULL;
+		}
+		dev->data->nb_tx_queues = 0;
 	}
-	dev->data->nb_tx_queues = 0;
 }
 
 void