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
>