> -----Original Message-----
> From: Maxime Coquelin <maxime.coque...@redhat.com>
> Sent: Tuesday, March 16, 2021 5:38 PM
> To: dev@dpdk.org; Xia, Chenbo <chenbo....@intel.com>; amore...@redhat.com;
> david.march...@redhat.com; olivier.m...@6wind.com; bnem...@redhat.com
> Cc: Maxime Coquelin <maxime.coque...@redhat.com>
> Subject: [PATCH v4 2/4] net/virtio: improve queue init error path
> 
> This patch improves the error path of virtio_init_queue(),
> by cleaning in reversing order all resources that have
> been allocated.
> 
> Suggested-by: Chenbo Xia <chenbo....@intel.com>
> Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
> Reviewed-by: David Marchand <david.march...@redhat.com>
> ---
>  drivers/net/virtio/virtio_ethdev.c | 15 ++++++++++-----
>  1 file changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_ethdev.c
> b/drivers/net/virtio/virtio_ethdev.c
> index af090fdf9c..d5643733f7 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -507,7 +507,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t
> queue_idx)
>                       mz = rte_memzone_lookup(vq_name);
>               if (mz == NULL) {
>                       ret = -ENOMEM;
> -                     goto fail_q_alloc;
> +                     goto free_vq;
>               }
>       }
> 
> @@ -533,7 +533,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t
> queue_idx)
>                               hdr_mz = rte_memzone_lookup(vq_hdr_name);
>                       if (hdr_mz == NULL) {
>                               ret = -ENOMEM;
> -                             goto fail_q_alloc;
> +                             goto free_mz;
>                       }
>               }
>       }
> @@ -547,7 +547,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t
> queue_idx)
>               if (!sw_ring) {
>                       PMD_INIT_LOG(ERR, "can not allocate RX soft ring");
>                       ret = -ENOMEM;
> -                     goto fail_q_alloc;
> +                     goto free_hdr_mz;
>               }
> 
>               vq->sw_ring = sw_ring;
> @@ -604,15 +604,20 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t
> queue_idx)
> 
>       if (VIRTIO_OPS(hw)->setup_queue(hw, vq) < 0) {
>               PMD_INIT_LOG(ERR, "setup_queue failed");
> -             return -EINVAL;
> +             ret = -EINVAL;
> +             goto clean_vq;
>       }
> 
>       return 0;
> 
> -fail_q_alloc:
> +clean_vq:
> +     hw->cvq = NULL;
>       rte_free(sw_ring);
> +free_hdr_mz:
>       rte_memzone_free(hdr_mz);
> +free_mz:
>       rte_memzone_free(mz);
> +free_vq:
>       rte_free(vq);
> 
>       return ret;
> --
> 2.29.2

Reviewed-by: Chenbo Xia <chenbo....@intel.com>

Reply via email to