On Thu, Mar 26, 2026 at 01:46:11PM +0100, David Marchand wrote:
> In case no rxq has been set up (like when starting testpmd with no mempool
> drivers), a crash happens in tap_dev_close:
> 
> Thread 1 "dpdk-testpmd" received signal SIGSEGV, Segmentation fault.
> 0x00007ffff7fad68b in tap_dev_close (dev=dev@entry=0x4c4a80
>       <rte_eth_devices@INTERNAL>) at ../drivers/net/tap/rte_eth_tap.c:1111
> 1111                  struct rx_queue *rxq = dev->data->rx_queues[i];
> 
> (gdb) p dev->data->rx_queues
> $4 = (void **) 0x0
> 
> Fixes: 23e2387b49a1 ("net/tap: allocate queue structures dynamically")
> 
> Signed-off-by: David Marchand <[email protected]>
> ---

Looks ok to me.

Acked-by: Bruce Richardson <[email protected]>

>  drivers/net/tap/rte_eth_tap.c | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
> index 64b359914b..6d710131e8 100644
> --- a/drivers/net/tap/rte_eth_tap.c
> +++ b/drivers/net/tap/rte_eth_tap.c
> @@ -1108,17 +1108,22 @@ tap_dev_close(struct rte_eth_dev *dev)
>  #endif
>  
>       for (i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) {
> -             struct rx_queue *rxq = dev->data->rx_queues[i];
> +             struct rx_queue *rxq = NULL;
> +             struct rx_queue *txq = NULL;
>  
>               tap_queue_close(process_private, i);
>  
> +             if (dev->data->rx_queues != NULL)
> +                     rxq = dev->data->rx_queues[i];
>               if (rxq != NULL) {
>                       tap_rxq_pool_free(rxq->pool);
>                       rte_free(rxq);
>                       dev->data->rx_queues[i] = NULL;
>               }
>  
> -             if (dev->data->tx_queues[i] != NULL) {
> +             if (dev->data->tx_queues != NULL)
> +                     txq = dev->data->tx_queues[i];
> +             if (txq != NULL) {
>                       rte_free(dev->data->tx_queues[i]);
>                       dev->data->tx_queues[i] = NULL;
>               }
> -- 
> 2.53.0
> 

Reply via email to