fs_rx_queue_release() and fs_tx_queue_release() iterate over the active
sub-devices and call the sub-device Rx/Tx queue release op directly.
Some PMDs do not implement that op, so the function pointer is NULL.
Calling it unconditionally could dereference a NULL pointer and crash
when releasing fail-safe queues.

Check that the sub-device provides the release op before calling it.

Fixes: 7483341ae553 ("ethdev: change queue release callback")
Cc: [email protected]
Signed-off-by: Sandeep Penigalapati <[email protected]>
---
 drivers/net/failsafe/failsafe_ops.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/failsafe/failsafe_ops.c 
b/drivers/net/failsafe/failsafe_ops.c
index 8761cb07c3..79aa57cb35 100644
--- a/drivers/net/failsafe/failsafe_ops.c
+++ b/drivers/net/failsafe/failsafe_ops.c
@@ -398,7 +398,8 @@ fs_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid)
        if (rxq->event_fd >= 0)
                close(rxq->event_fd);
        FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
-               if (ETH(sdev)->data->rx_queues != NULL &&
+               if (SUBOPS(sdev, rx_queue_release) != NULL &&
+                   ETH(sdev)->data->rx_queues != NULL &&
                    ETH(sdev)->data->rx_queues[rxq->qid] != NULL)
                        SUBOPS(sdev, rx_queue_release)(ETH(sdev), rxq->qid);
        }
@@ -574,7 +575,8 @@ fs_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid)
        if (fs_lock(dev, 0) != 0)
                return;
        FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
-               if (ETH(sdev)->data->tx_queues != NULL &&
+               if (SUBOPS(sdev, tx_queue_release) != NULL &&
+                   ETH(sdev)->data->tx_queues != NULL &&
                    ETH(sdev)->data->tx_queues[txq->qid] != NULL)
                        SUBOPS(sdev, tx_queue_release)(ETH(sdev), txq->qid);
        }
-- 
2.34.1

Reply via email to