On Thu, Sep 30, 2021 at 8:48 PM Xueming Li wrote: > > Currently, most ethdev callback API use queue ID as parameter, but Rx > and Tx queue release callback use queue object which is used by Rx and > Tx burst data plane callback. > > To align with other eth device queue configuration callbacks: > - queue release callbacks are changed to use queue ID > - all drivers are adapted > > Signed-off-by: Xueming Li > Reviewed-by: Andrew Rybchenko > --- > drivers/net/atlantic/atl_ethdev.h | 4 +- > drivers/net/atlantic/atl_rxtx.c | 24 +++++----- > drivers/net/avp/avp_ethdev.c | 34 +++++--------- > drivers/net/axgbe/axgbe_dev.c | 2 +- > drivers/net/axgbe/axgbe_rxtx.c | 8 ++-- > drivers/net/axgbe/axgbe_rxtx.h | 4 +- > drivers/net/bnx2x/bnx2x_rxtx.c | 8 ++-- > drivers/net/bnx2x/bnx2x_rxtx.h | 4 +- > drivers/net/bnxt/bnxt_reps.c | 20 +++++---- > drivers/net/bnxt/bnxt_reps.h | 4 +- > drivers/net/bnxt/bnxt_ring.c | 2 +- > drivers/net/bnxt/bnxt_rxq.c | 12 ++--- > drivers/net/bnxt/bnxt_rxq.h | 2 +- > drivers/net/bnxt/bnxt_txq.c | 19 ++++---- > drivers/net/bnxt/bnxt_txq.h | 2 +- > drivers/net/bonding/rte_eth_bond_pmd.c | 8 +++- > drivers/net/cnxk/cnxk_ethdev.c | 33 ++++++-------- > drivers/net/cxgbe/cxgbe_ethdev.c | 12 ++--- > drivers/net/cxgbe/cxgbe_pfvf.h | 4 +- > drivers/net/dpaa2/dpaa2_ethdev.c | 4 +- > drivers/net/e1000/e1000_ethdev.h | 8 ++-- > drivers/net/e1000/em_rxtx.c | 12 ++--- > drivers/net/e1000/igb_rxtx.c | 12 ++--- > drivers/net/ena/ena_ethdev.c | 18 ++++---- > drivers/net/enetc/enetc_ethdev.c | 12 +++-- > drivers/net/enic/enic_ethdev.c | 8 +++- > drivers/net/enic/enic_vf_representor.c | 8 +++- > drivers/net/failsafe/failsafe_ops.c | 42 +++++++----------- > drivers/net/fm10k/fm10k_ethdev.c | 14 +++--- > drivers/net/hinic/hinic_pmd_ethdev.c | 20 +++++---- > drivers/net/hns3/hns3_ethdev.h | 3 ++ > drivers/net/hns3/hns3_rxtx.c | 21 +++++---- > drivers/net/hns3/hns3_rxtx.h | 4 +- > drivers/net/i40e/i40e_fdir.c | 8 ++-- > drivers/net/i40e/i40e_rxtx.c | 40 +++++++++++------ > drivers/net/i40e/i40e_rxtx.h | 6 ++- > drivers/net/iavf/iavf_rxtx.c | 12 ++--- > drivers/net/iavf/iavf_rxtx.h | 4 +- > drivers/net/ice/ice_dcf_ethdev.c | 4 +- > drivers/net/ice/ice_ethdev.c | 4 +- > drivers/net/ice/ice_rxtx.c | 12 +++++ > drivers/net/ice/ice_rxtx.h | 2 + > drivers/net/igc/igc_ethdev.c | 4 +- > drivers/net/igc/igc_txrx.c | 12 ++--- > drivers/net/igc/igc_txrx.h | 4 +- > drivers/net/ionic/ionic_lif.c | 4 +- > drivers/net/ionic/ionic_rxtx.c | 14 +++--- > drivers/net/ionic/ionic_rxtx.h | 4 +- > drivers/net/ixgbe/ixgbe_ethdev.h | 4 +- > drivers/net/ixgbe/ixgbe_rxtx.c | 12 ++--- > drivers/net/liquidio/lio_ethdev.c | 24 +++++----- > drivers/net/liquidio/lio_ethdev.h | 4 +- > drivers/net/liquidio/lio_rxtx.c | 4 +- > drivers/net/memif/rte_eth_memif.c | 23 +++++++--- > drivers/net/mlx4/mlx4.c | 4 +- > drivers/net/mlx4/mlx4_rxq.c | 27 +++++------ > drivers/net/mlx4/mlx4_rxtx.h | 4 +- > drivers/net/mlx4/mlx4_txq.c | 27 +++++------ > drivers/net/mlx5/mlx5_rx.h | 2 +- > drivers/net/mlx5/mlx5_rxq.c | 21 ++++----- > drivers/net/mlx5/mlx5_tx.h | 2 +- > drivers/net/mlx5/mlx5_txq.c | 25 ++++------- > drivers/net/mvneta/mvneta_ethdev.c | 4 +- > drivers/net/mvneta/mvneta_rxtx.c | 22 +++++---- > drivers/net/mvneta/mvneta_rxtx.h | 4 +- > drivers/net/mvpp2/mrvl_ethdev.c | 20 +++++---- > drivers/net/netvsc/hn_rxtx.c | 10 ++--- > drivers/net/netvsc/hn_var.h | 4 +- > drivers/net/netvsc/hn_vf.c | 14 ++---- > drivers/net/nfb/nfb_ethdev.c | 4 +- > drivers/net/nfb/nfb_rx.c | 5 ++- > drivers/net/nfb/nfb_rx.h | 8 ++-- > drivers/net/nfb/nfb_tx.c | 5 ++- > drivers/net/nfb/nfb_tx.h | 8 ++-- > drivers/net/nfp/nfp_rxtx.c | 30 ++++++++----- > drivers/net/nfp/nfp_rxtx.h | 4 +- > drivers/net/ngbe/ngbe_ethdev.h | 4 +- > drivers/net/ngbe/ngbe_rxtx.c | 12 ++--- > drivers/net/null/rte_eth_null.c | 22 ++++++--- > drivers/net/octeontx/octeontx_ethdev.c | 18 ++++---- > drivers/net/octeontx2/otx2_ethdev.c | 59 ++++++++++--------------- > drivers/net/octeontx_ep/otx_ep_ethdev.c | 20 +++++---- > drivers/net/qede/qede_ethdev.c | 20 +++++++-- > drivers/net/sfc/sfc_ethdev.c | 8 ++-- > drivers/net/szedata2/rte_eth_szedata2.c | 50 +++++++++------------ > drivers/net/tap/rte_eth_tap.c | 8 ++-- > drivers/net/thunderx/nicvf_ethdev.c | 28 ++++++------ > drivers/net/txgbe/txgbe_ethdev.h | 4 +- > drivers/net/txgbe/txgbe_rxtx.c | 12 ++--- > drivers/net/vhost/rte_eth_vhost.c | 14 ++++-- > drivers/net/vmxnet3/vmxnet3_ethdev.c | 14 ++---- > drivers/net/vmxnet3/vmxnet3_ethdev.h | 4 +- > drivers/net/vmxnet3/vmxnet3_rxtx.c | 8 ++-- > lib/ethdev/ethdev_driver.h | 3 +- > lib/ethdev/rte_ethdev.c | 4 +- > 95 files changed, 597 insertions(+), 566 deletions(-) > > diff --git a/drivers/net/atlantic/atl_ethdev.h b/drivers/net/atlantic/atl_ethdev.h > index f547571b5c9..a2d1d4397c6 100644 > --- a/drivers/net/atlantic/atl_ethdev.h > +++ b/drivers/net/atlantic/atl_ethdev.h > @@ -54,8 +54,8 @@ struct atl_adapter { > /* > * RX/TX function prototypes > */ > -void atl_rx_queue_release(void *rxq); > -void atl_tx_queue_release(void *txq); > +void atl_rx_queue_release(struct rte_eth_dev *dev, uint16_t rx_queue_id); > +void atl_tx_queue_release(struct rte_eth_dev *dev, uint16_t tx_queue_id); > > int atl_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id, > uint16_t nb_rx_desc, unsigned int socket_id, > diff --git a/drivers/net/atlantic/atl_rxtx.c b/drivers/net/atlantic/atl_rxtx.c > index 7d367c9306e..fca682d8b09 100644 > --- a/drivers/net/atlantic/atl_rxtx.c > +++ b/drivers/net/atlantic/atl_rxtx.c > @@ -125,7 +125,7 @@ atl_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id, > * different socket than was previously used. > */ > if (dev->data->rx_queues[rx_queue_id] != NULL) { > - atl_rx_queue_release(dev->data->rx_queues[rx_queue_id]); > + atl_rx_queue_release(dev, rx_queue_id); > dev->data->rx_queues[rx_queue_id] = NULL; > } > > @@ -247,7 +247,7 @@ atl_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id, > * different socket than was previously used. > */ > if (dev->data->tx_queues[tx_queue_id] != NULL) { > - atl_tx_queue_release(dev->data->tx_queues[tx_queue_id]); > + atl_tx_queue_release(dev, tx_queue_id); > dev->data->tx_queues[tx_queue_id] = NULL; > } > > @@ -498,13 +498,13 @@ atl_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id) > } > > void > -atl_rx_queue_release(void *rx_queue) > +atl_rx_queue_release(struct rte_eth_dev *dev, uint16_t rx_queue_id) > { > - PMD_INIT_FUNC_TRACE(); > + struct atl_rx_queue *rxq = dev->data->rx_queues[rx_queue_id]; > > - if (rx_queue != NULL) { > - struct atl_rx_queue *rxq = (struct atl_rx_queue *)rx_queue; > + PMD_INIT_FUNC_TRACE(); > > + if (rxq != NULL) { > atl_rx_queue_release_mbufs(rxq); > rte_free(rxq->sw_ring); > rte_free(rxq); > @@ -569,13 +569,13 @@ atl_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id) > } > > void > -atl_tx_queue_release(void *tx_queue) > +atl_tx_queue_release(struct rte_eth_dev *dev, uint16_t tx_queue_id) > { > - PMD_INIT_FUNC_TRACE(); > + struct atl_tx_queue *txq = dev->data->tx_queues[tx_queue_id]; > > - if (tx_queue != NULL) { > - struct atl_tx_queue *txq = (struct atl_tx_queue *)tx_queue; > + PMD_INIT_FUNC_TRACE(); > > + if (txq != NULL) { > atl_tx_queue_release_mbufs(txq); > rte_free(txq->sw_ring); > rte_free(txq); > @@ -590,13 +590,13 @@ atl_free_queues(struct rte_eth_dev *dev) > PMD_INIT_FUNC_TRACE(); > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - atl_rx_queue_release(dev->data->rx_queues[i]); > + atl_rx_queue_release(dev, i); > dev->data->rx_queues[i] = 0; > } > dev->data->nb_rx_queues = 0; > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - atl_tx_queue_release(dev->data->tx_queues[i]); > + atl_tx_queue_release(dev, i); > dev->data->tx_queues[i] = 0; > } > dev->data->nb_tx_queues = 0; > diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c > index 623fa5e5ff5..bb0842fb241 100644 > --- a/drivers/net/avp/avp_ethdev.c > +++ b/drivers/net/avp/avp_ethdev.c > @@ -75,8 +75,8 @@ static uint16_t avp_xmit_pkts(void *tx_queue, > struct rte_mbuf **tx_pkts, > uint16_t nb_pkts); > > -static void avp_dev_rx_queue_release(void *rxq); > -static void avp_dev_tx_queue_release(void *txq); > +static void avp_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > +static void avp_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > static int avp_dev_stats_get(struct rte_eth_dev *dev, > struct rte_eth_stats *stats); > @@ -1926,18 +1926,11 @@ avp_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) > } > > static void > -avp_dev_rx_queue_release(void *rx_queue) > +avp_dev_rx_queue_release(struct rte_eth_dev *eth_dev, uint16_t rx_queue_id) > { > - struct avp_queue *rxq = (struct avp_queue *)rx_queue; > - struct avp_dev *avp = rxq->avp; > - struct rte_eth_dev_data *data = avp->dev_data; > - unsigned int i; > - > - for (i = 0; i < avp->num_rx_queues; i++) { > - if (data->rx_queues[i] == rxq) { > - rte_free(data->rx_queues[i]); > - data->rx_queues[i] = NULL; > - } > + if (eth_dev->data->rx_queues[rx_queue_id] != NULL) { > + rte_free(eth_dev->data->rx_queues[rx_queue_id]); > + eth_dev->data->rx_queues[rx_queue_id] = NULL; > } > } > > @@ -1957,18 +1950,11 @@ avp_dev_rx_queue_release_all(struct rte_eth_dev *eth_dev) > } > > static void > -avp_dev_tx_queue_release(void *tx_queue) > +avp_dev_tx_queue_release(struct rte_eth_dev *eth_dev, uint16_t tx_queue_id) > { > - struct avp_queue *txq = (struct avp_queue *)tx_queue; > - struct avp_dev *avp = txq->avp; > - struct rte_eth_dev_data *data = avp->dev_data; > - unsigned int i; > - > - for (i = 0; i < avp->num_tx_queues; i++) { > - if (data->tx_queues[i] == txq) { > - rte_free(data->tx_queues[i]); > - data->tx_queues[i] = NULL; > - } > + if (eth_dev->data->tx_queues[tx_queue_id] != NULL) { > + rte_free(eth_dev->data->tx_queues[tx_queue_id]); > + eth_dev->data->tx_queues[tx_queue_id] = NULL; > } > } > > diff --git a/drivers/net/axgbe/axgbe_dev.c b/drivers/net/axgbe/axgbe_dev.c > index 786288a7b07..ca32ad64187 100644 > --- a/drivers/net/axgbe/axgbe_dev.c > +++ b/drivers/net/axgbe/axgbe_dev.c > @@ -950,7 +950,7 @@ static int wrapper_rx_desc_init(struct axgbe_port *pdata) > if (mbuf == NULL) { > PMD_DRV_LOG(ERR, "RX mbuf alloc failed queue_id = %u, idx = %d\n", > (unsigned int)rxq->queue_id, j); > - axgbe_dev_rx_queue_release(rxq); > + axgbe_dev_rx_queue_release(pdata->eth_dev, i); > return -ENOMEM; > } > rxq->sw_ring[j] = mbuf; > diff --git a/drivers/net/axgbe/axgbe_rxtx.c b/drivers/net/axgbe/axgbe_rxtx.c > index 33f709a6bb0..c8618d2d6da 100644 > --- a/drivers/net/axgbe/axgbe_rxtx.c > +++ b/drivers/net/axgbe/axgbe_rxtx.c > @@ -31,9 +31,9 @@ axgbe_rx_queue_release(struct axgbe_rx_queue *rx_queue) > } > } > > -void axgbe_dev_rx_queue_release(void *rxq) > +void axgbe_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx) > { > - axgbe_rx_queue_release(rxq); > + axgbe_rx_queue_release(dev->data->rx_queues[queue_idx]); > } > > int axgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, > @@ -517,9 +517,9 @@ static void axgbe_tx_queue_release(struct axgbe_tx_queue *tx_queue) > } > } > > -void axgbe_dev_tx_queue_release(void *txq) > +void axgbe_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx) > { > - axgbe_tx_queue_release(txq); > + axgbe_tx_queue_release(dev->data->tx_queues[queue_idx]); > } > > int axgbe_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, > diff --git a/drivers/net/axgbe/axgbe_rxtx.h b/drivers/net/axgbe/axgbe_rxtx.h > index c2b11bb0e6e..2a330339cd0 100644 > --- a/drivers/net/axgbe/axgbe_rxtx.h > +++ b/drivers/net/axgbe/axgbe_rxtx.h > @@ -153,7 +153,7 @@ struct axgbe_tx_queue { > */ > > > -void axgbe_dev_tx_queue_release(void *txq); > +void axgbe_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx); > int axgbe_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id, > uint16_t nb_tx_desc, unsigned int socket_id, > const struct rte_eth_txconf *tx_conf); > @@ -171,7 +171,7 @@ uint16_t axgbe_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts, > uint16_t nb_pkts); > > > -void axgbe_dev_rx_queue_release(void *rxq); > +void axgbe_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx); > int axgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id, > uint16_t nb_rx_desc, unsigned int socket_id, > const struct rte_eth_rxconf *rx_conf, > diff --git a/drivers/net/bnx2x/bnx2x_rxtx.c b/drivers/net/bnx2x/bnx2x_rxtx.c > index 2b176022905..fea7a34e7d8 100644 > --- a/drivers/net/bnx2x/bnx2x_rxtx.c > +++ b/drivers/net/bnx2x/bnx2x_rxtx.c > @@ -37,9 +37,9 @@ bnx2x_rx_queue_release(struct bnx2x_rx_queue *rx_queue) > } > > void > -bnx2x_dev_rx_queue_release(void *rxq) > +bnx2x_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx) > { > - bnx2x_rx_queue_release(rxq); > + bnx2x_rx_queue_release(dev->data->rx_queues[queue_idx]); > } > > int > @@ -182,9 +182,9 @@ bnx2x_tx_queue_release(struct bnx2x_tx_queue *tx_queue) > } > > void > -bnx2x_dev_tx_queue_release(void *txq) > +bnx2x_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx) > { > - bnx2x_tx_queue_release(txq); > + bnx2x_tx_queue_release(dev->data->tx_queues[queue_idx]); > } > > static uint16_t > diff --git a/drivers/net/bnx2x/bnx2x_rxtx.h b/drivers/net/bnx2x/bnx2x_rxtx.h > index 3f4692b47dd..247a72230bb 100644 > --- a/drivers/net/bnx2x/bnx2x_rxtx.h > +++ b/drivers/net/bnx2x/bnx2x_rxtx.h > @@ -72,8 +72,8 @@ int bnx2x_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id, > uint16_t nb_tx_desc, unsigned int socket_id, > const struct rte_eth_txconf *tx_conf); > > -void bnx2x_dev_rx_queue_release(void *rxq); > -void bnx2x_dev_tx_queue_release(void *txq); > +void bnx2x_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx); > +void bnx2x_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx); > void bnx2x_dev_rxtx_init(struct rte_eth_dev *dev); > void bnx2x_dev_rxtx_init_dummy(struct rte_eth_dev *dev); > void bnx2x_dev_clear_queues(struct rte_eth_dev *dev); > diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c > index bdbad53b7d7..df05619c3fd 100644 > --- a/drivers/net/bnxt/bnxt_reps.c > +++ b/drivers/net/bnxt/bnxt_reps.c > @@ -630,7 +630,7 @@ int bnxt_rep_rx_queue_setup_op(struct rte_eth_dev *eth_dev, > if (eth_dev->data->rx_queues) { > rxq = eth_dev->data->rx_queues[queue_idx]; > if (rxq) > - bnxt_rx_queue_release_op(rxq); > + bnxt_rx_queue_release_op(eth_dev, queue_idx); > } > > rxq = rte_zmalloc_socket("bnxt_vfr_rx_queue", > @@ -641,6 +641,8 @@ int bnxt_rep_rx_queue_setup_op(struct rte_eth_dev *eth_dev, > return -ENOMEM; > } > > + eth_dev->data->rx_queues[queue_idx] = rxq; > + > rxq->nb_rx_desc = nb_desc; > > rc = bnxt_init_rep_rx_ring(rxq, socket_id); > @@ -660,20 +662,19 @@ int bnxt_rep_rx_queue_setup_op(struct rte_eth_dev *eth_dev, > rxq->rx_ring->rx_buf_ring = buf_ring; > rxq->queue_id = queue_idx; > rxq->port_id = eth_dev->data->port_id; > - eth_dev->data->rx_queues[queue_idx] = rxq; > > return 0; > > out: > if (rxq) > - bnxt_rep_rx_queue_release_op(rxq); > + bnxt_rep_rx_queue_release_op(eth_dev, queue_idx); > > return rc; > } > > -void bnxt_rep_rx_queue_release_op(void *rx_queue) > +void bnxt_rep_rx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx) > { > - struct bnxt_rx_queue *rxq = (struct bnxt_rx_queue *)rx_queue; > + struct bnxt_rx_queue *rxq = dev->data->rx_queues[queue_idx]; > > if (!rxq) > return; > @@ -728,8 +729,8 @@ int bnxt_rep_tx_queue_setup_op(struct rte_eth_dev *eth_dev, > > if (eth_dev->data->tx_queues) { > vfr_txq = eth_dev->data->tx_queues[queue_idx]; > - bnxt_rep_tx_queue_release_op(vfr_txq); > - vfr_txq = NULL; > + if (vfr_txq != NULL) > + bnxt_rep_tx_queue_release_op(eth_dev, queue_idx); > } > > vfr_txq = rte_zmalloc_socket("bnxt_vfr_tx_queue", > @@ -758,15 +759,16 @@ int bnxt_rep_tx_queue_setup_op(struct rte_eth_dev *eth_dev, > return 0; > } > > -void bnxt_rep_tx_queue_release_op(void *tx_queue) > +void bnxt_rep_tx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx) > { > - struct bnxt_vf_rep_tx_queue *vfr_txq = tx_queue; > + struct bnxt_vf_rep_tx_queue *vfr_txq = dev->data->tx_queues[queue_idx]; > > if (!vfr_txq) > return; > > rte_free(vfr_txq->txq); > rte_free(vfr_txq); > + dev->data->tx_queues[queue_idx] = NULL; > } > > int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev, > diff --git a/drivers/net/bnxt/bnxt_reps.h b/drivers/net/bnxt/bnxt_reps.h > index 8d6139f2b70..01e57ee5b50 100644 > --- a/drivers/net/bnxt/bnxt_reps.h > +++ b/drivers/net/bnxt/bnxt_reps.h > @@ -42,8 +42,8 @@ int bnxt_rep_tx_queue_setup_op(struct rte_eth_dev *eth_dev, > __rte_unused unsigned int socket_id, > __rte_unused const struct rte_eth_txconf * > tx_conf); > -void bnxt_rep_rx_queue_release_op(void *rx_queue); > -void bnxt_rep_tx_queue_release_op(void *tx_queue); > +void bnxt_rep_rx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx); > +void bnxt_rep_tx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx); > int bnxt_rep_dev_stop_op(struct rte_eth_dev *eth_dev); > int bnxt_rep_dev_close_op(struct rte_eth_dev *eth_dev); > int bnxt_rep_stats_get_op(struct rte_eth_dev *eth_dev, > diff --git a/drivers/net/bnxt/bnxt_ring.c b/drivers/net/bnxt/bnxt_ring.c > index 957b175f1b8..aaad08e5e5b 100644 > --- a/drivers/net/bnxt/bnxt_ring.c > +++ b/drivers/net/bnxt/bnxt_ring.c > @@ -640,7 +640,7 @@ int bnxt_alloc_hwrm_rx_ring(struct bnxt *bp, int queue_index) > if (rxq->rx_started) { > if (bnxt_init_one_rx_ring(rxq)) { > PMD_DRV_LOG(ERR, "bnxt_init_one_rx_ring failed!\n"); > - bnxt_rx_queue_release_op(rxq); > + bnxt_rx_queue_release_op(bp->eth_dev, queue_index); > rc = -ENOMEM; > goto err_out; > } > diff --git a/drivers/net/bnxt/bnxt_rxq.c b/drivers/net/bnxt/bnxt_rxq.c > index bbcb3b06e7d..2eb7a3cb29b 100644 > --- a/drivers/net/bnxt/bnxt_rxq.c > +++ b/drivers/net/bnxt/bnxt_rxq.c > @@ -240,9 +240,9 @@ void bnxt_free_rx_mbufs(struct bnxt *bp) > } > } > > -void bnxt_rx_queue_release_op(void *rx_queue) > +void bnxt_rx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx) > { > - struct bnxt_rx_queue *rxq = (struct bnxt_rx_queue *)rx_queue; > + struct bnxt_rx_queue *rxq = dev->data->rx_queues[queue_idx]; > > if (rxq) { > if (is_bnxt_in_error(rxq->bp)) > @@ -273,6 +273,7 @@ void bnxt_rx_queue_release_op(void *rx_queue) > rxq->mz = NULL; > > rte_free(rxq); > + dev->data->rx_queues[queue_idx] = NULL; > } > } > > @@ -307,7 +308,7 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev, > if (eth_dev->data->rx_queues) { > rxq = eth_dev->data->rx_queues[queue_idx]; > if (rxq) > - bnxt_rx_queue_release_op(rxq); > + bnxt_rx_queue_release_op(eth_dev, queue_idx); > } > rxq = rte_zmalloc_socket("bnxt_rx_queue", sizeof(struct bnxt_rx_queue), > RTE_CACHE_LINE_SIZE, socket_id); > @@ -328,6 +329,8 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev, > > PMD_DRV_LOG(DEBUG, "RX Buf MTU %d\n", eth_dev->data->mtu); > > + eth_dev->data->rx_queues[queue_idx] = rxq; > + > rc = bnxt_init_rx_ring_struct(rxq, socket_id); > if (rc) { > PMD_DRV_LOG(ERR, > @@ -343,7 +346,6 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev, > else > rxq->crc_len = 0; > > - eth_dev->data->rx_queues[queue_idx] = rxq; > /* Allocate RX ring hardware descriptors */ > rc = bnxt_alloc_rings(bp, socket_id, queue_idx, NULL, rxq, rxq->cp_ring, > NULL, "rxr"); > @@ -369,7 +371,7 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev, > > return 0; > err: > - bnxt_rx_queue_release_op(rxq); > + bnxt_rx_queue_release_op(eth_dev, queue_idx); > return rc; > } > > diff --git a/drivers/net/bnxt/bnxt_rxq.h b/drivers/net/bnxt/bnxt_rxq.h > index 42bd8e7ab76..9bb9352febc 100644 > --- a/drivers/net/bnxt/bnxt_rxq.h > +++ b/drivers/net/bnxt/bnxt_rxq.h > @@ -46,7 +46,7 @@ struct bnxt_rx_queue { > > void bnxt_free_rxq_stats(struct bnxt_rx_queue *rxq); > int bnxt_mq_rx_configure(struct bnxt *bp); > -void bnxt_rx_queue_release_op(void *rx_queue); > +void bnxt_rx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx); > int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev, > uint16_t queue_idx, > uint16_t nb_desc, > diff --git a/drivers/net/bnxt/bnxt_txq.c b/drivers/net/bnxt/bnxt_txq.c > index 830416af3d0..a5219d8c3f7 100644 > --- a/drivers/net/bnxt/bnxt_txq.c > +++ b/drivers/net/bnxt/bnxt_txq.c > @@ -53,9 +53,9 @@ void bnxt_free_tx_mbufs(struct bnxt *bp) > } > } > > -void bnxt_tx_queue_release_op(void *tx_queue) > +void bnxt_tx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx) > { > - struct bnxt_tx_queue *txq = (struct bnxt_tx_queue *)tx_queue; > + struct bnxt_tx_queue *txq = dev->data->tx_queues[queue_idx]; > > if (txq) { > if (is_bnxt_in_error(txq->bp)) > @@ -83,6 +83,7 @@ void bnxt_tx_queue_release_op(void *tx_queue) > > rte_free(txq->free); > rte_free(txq); > + dev->data->tx_queues[queue_idx] = NULL; > } > } > > @@ -114,10 +115,8 @@ int bnxt_tx_queue_setup_op(struct rte_eth_dev *eth_dev, > > if (eth_dev->data->tx_queues) { > txq = eth_dev->data->tx_queues[queue_idx]; > - if (txq) { > - bnxt_tx_queue_release_op(txq); > - txq = NULL; > - } > + if (txq) > + bnxt_tx_queue_release_op(eth_dev, queue_idx); > } > txq = rte_zmalloc_socket("bnxt_tx_queue", sizeof(struct bnxt_tx_queue), > RTE_CACHE_LINE_SIZE, socket_id); > @@ -126,6 +125,9 @@ int bnxt_tx_queue_setup_op(struct rte_eth_dev *eth_dev, > return -ENOMEM; > } > > + txq->bp = bp; > + eth_dev->data->tx_queues[queue_idx] = txq; > + > txq->free = rte_zmalloc_socket(NULL, > sizeof(struct rte_mbuf *) * nb_desc, > RTE_CACHE_LINE_SIZE, socket_id); > @@ -134,7 +136,6 @@ int bnxt_tx_queue_setup_op(struct rte_eth_dev *eth_dev, > rc = -ENOMEM; > goto err; > } > - txq->bp = bp; > txq->nb_tx_desc = nb_desc; > txq->tx_free_thresh = > RTE_MIN(rte_align32pow2(nb_desc) / 4, RTE_BNXT_MAX_TX_BURST); > @@ -164,8 +165,6 @@ int bnxt_tx_queue_setup_op(struct rte_eth_dev *eth_dev, > goto err; > } > > - eth_dev->data->tx_queues[queue_idx] = txq; > - > if (txq->tx_deferred_start) > txq->tx_started = false; > else > @@ -173,6 +172,6 @@ int bnxt_tx_queue_setup_op(struct rte_eth_dev *eth_dev, > > return 0; > err: > - bnxt_tx_queue_release_op(txq); > + bnxt_tx_queue_release_op(eth_dev, queue_idx); > return rc; > } > diff --git a/drivers/net/bnxt/bnxt_txq.h b/drivers/net/bnxt/bnxt_txq.h > index e0e142df3ee..67fd4cbebb7 100644 > --- a/drivers/net/bnxt/bnxt_txq.h > +++ b/drivers/net/bnxt/bnxt_txq.h > @@ -37,7 +37,7 @@ struct bnxt_tx_queue { > > void bnxt_free_txq_stats(struct bnxt_tx_queue *txq); > void bnxt_free_tx_mbufs(struct bnxt *bp); > -void bnxt_tx_queue_release_op(void *tx_queue); > +void bnxt_tx_queue_release_op(struct rte_eth_dev *dev, uint16_t queue_idx); > int bnxt_tx_queue_setup_op(struct rte_eth_dev *eth_dev, > uint16_t queue_idx, > uint16_t nb_desc, > diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c > index 54987d96b34..92851fda53a 100644 > --- a/drivers/net/bonding/rte_eth_bond_pmd.c > +++ b/drivers/net/bonding/rte_eth_bond_pmd.c > @@ -2332,8 +2332,10 @@ bond_ethdev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id, > } > > static void > -bond_ethdev_rx_queue_release(void *queue) > +bond_ethdev_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_id) > { > + void *queue = dev->data->rx_queues[queue_id]; > + > if (queue == NULL) > return; > > @@ -2341,8 +2343,10 @@ bond_ethdev_rx_queue_release(void *queue) > } > > static void > -bond_ethdev_tx_queue_release(void *queue) > +bond_ethdev_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_id) > { > + void *queue = dev->data->rx_queues[queue_id]; > + > if (queue == NULL) > return; > > diff --git a/drivers/net/cnxk/cnxk_ethdev.c b/drivers/net/cnxk/cnxk_ethdev.c > index 7152dcd002d..eb1add3623b 100644 > --- a/drivers/net/cnxk/cnxk_ethdev.c > +++ b/drivers/net/cnxk/cnxk_ethdev.c > @@ -190,7 +190,7 @@ cnxk_nix_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t qid, > /* Free memory prior to re-allocation if needed. */ > if (eth_dev->data->tx_queues[qid] != NULL) { > plt_nix_dbg("Freeing memory prior to re-allocation %d", qid); > - dev_ops->tx_queue_release(eth_dev->data->tx_queues[qid]); > + dev_ops->tx_queue_release(eth_dev, qid); > eth_dev->data->tx_queues[qid] = NULL; > } > > @@ -232,20 +232,20 @@ cnxk_nix_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t qid, > } > > static void > -cnxk_nix_tx_queue_release(void *txq) > +cnxk_nix_tx_queue_release(struct rte_eth_dev *eth_dev, uint16_t qid) > { > + void *txq = eth_dev->data->tx_queues[qid]; > struct cnxk_eth_txq_sp *txq_sp; > struct cnxk_eth_dev *dev; > struct roc_nix_sq *sq; > - uint16_t qid; > int rc; > > if (!txq) > return; > > txq_sp = cnxk_eth_txq_to_sp(txq); > + > dev = txq_sp->dev; > - qid = txq_sp->qid; > > plt_nix_dbg("Releasing txq %u", qid); > > @@ -299,7 +299,7 @@ cnxk_nix_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t qid, > const struct eth_dev_ops *dev_ops = eth_dev->dev_ops; > > plt_nix_dbg("Freeing memory prior to re-allocation %d", qid); > - dev_ops->rx_queue_release(eth_dev->data->rx_queues[qid]); > + dev_ops->rx_queue_release(eth_dev, qid); > eth_dev->data->rx_queues[qid] = NULL; > } > > @@ -379,13 +379,13 @@ cnxk_nix_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t qid, > } > > static void > -cnxk_nix_rx_queue_release(void *rxq) > +cnxk_nix_rx_queue_release(struct rte_eth_dev *eth_dev, uint16_t qid) > { > + void *rxq = eth_dev->data->rx_queues[qid]; > struct cnxk_eth_rxq_sp *rxq_sp; > struct cnxk_eth_dev *dev; > struct roc_nix_rq *rq; > struct roc_nix_cq *cq; > - uint16_t qid; > int rc; > > if (!rxq) > @@ -393,7 +393,6 @@ cnxk_nix_rx_queue_release(void *rxq) > > rxq_sp = cnxk_eth_rxq_to_sp(rxq); > dev = rxq_sp->dev; > - qid = rxq_sp->qid; > > plt_nix_dbg("Releasing rxq %u", qid); > > @@ -558,7 +557,7 @@ nix_store_queue_cfg_and_then_release(struct rte_eth_dev *eth_dev) > txq_sp = cnxk_eth_txq_to_sp(txq[i]); > memcpy(&tx_qconf[i], &txq_sp->qconf, sizeof(*tx_qconf)); > tx_qconf[i].valid = true; > - dev_ops->tx_queue_release(txq[i]); > + dev_ops->tx_queue_release(eth_dev, i); > eth_dev->data->tx_queues[i] = NULL; > } > > @@ -572,7 +571,7 @@ nix_store_queue_cfg_and_then_release(struct rte_eth_dev *eth_dev) > rxq_sp = cnxk_eth_rxq_to_sp(rxq[i]); > memcpy(&rx_qconf[i], &rxq_sp->qconf, sizeof(*rx_qconf)); > rx_qconf[i].valid = true; > - dev_ops->rx_queue_release(rxq[i]); > + dev_ops->rx_queue_release(eth_dev, i); > eth_dev->data->rx_queues[i] = NULL; > } > > @@ -594,7 +593,6 @@ nix_restore_queue_cfg(struct rte_eth_dev *eth_dev) > struct cnxk_eth_qconf *tx_qconf = dev->tx_qconf; > struct cnxk_eth_qconf *rx_qconf = dev->rx_qconf; > int rc, i, nb_rxq, nb_txq; > - void **txq, **rxq; > > nb_rxq = RTE_MIN(dev->nb_rxq, eth_dev->data->nb_rx_queues); > nb_txq = RTE_MIN(dev->nb_txq, eth_dev->data->nb_tx_queues); > @@ -629,9 +627,8 @@ nix_restore_queue_cfg(struct rte_eth_dev *eth_dev) > &tx_qconf[i].conf.tx); > if (rc) { > plt_err("Failed to setup tx queue rc=%d", rc); > - txq = eth_dev->data->tx_queues; > for (i -= 1; i >= 0; i--) > - dev_ops->tx_queue_release(txq[i]); > + dev_ops->tx_queue_release(eth_dev, i); > goto fail; > } > } > @@ -647,9 +644,8 @@ nix_restore_queue_cfg(struct rte_eth_dev *eth_dev) > rx_qconf[i].mp); > if (rc) { > plt_err("Failed to setup rx queue rc=%d", rc); > - rxq = eth_dev->data->rx_queues; > for (i -= 1; i >= 0; i--) > - dev_ops->rx_queue_release(rxq[i]); > + dev_ops->rx_queue_release(eth_dev, i); > goto tx_queue_release; > } > } > @@ -660,9 +656,8 @@ nix_restore_queue_cfg(struct rte_eth_dev *eth_dev) > return 0; > > tx_queue_release: > - txq = eth_dev->data->tx_queues; > for (i = 0; i < eth_dev->data->nb_tx_queues; i++) > - dev_ops->tx_queue_release(txq[i]); > + dev_ops->tx_queue_release(eth_dev, i); > fail: > if (tx_qconf) > free(tx_qconf); > @@ -1426,14 +1421,14 @@ cnxk_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool reset) > > /* Free up SQs */ > for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { > - dev_ops->tx_queue_release(eth_dev->data->tx_queues[i]); > + dev_ops->tx_queue_release(eth_dev, i); > eth_dev->data->tx_queues[i] = NULL; > } > eth_dev->data->nb_tx_queues = 0; > > /* Free up RQ's and CQ's */ > for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { > - dev_ops->rx_queue_release(eth_dev->data->rx_queues[i]); > + dev_ops->rx_queue_release(eth_dev, i); > eth_dev->data->rx_queues[i] = NULL; > } > eth_dev->data->nb_rx_queues = 0; > diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c > index 177eca39760..33fa80213ff 100644 > --- a/drivers/net/cxgbe/cxgbe_ethdev.c > +++ b/drivers/net/cxgbe/cxgbe_ethdev.c > @@ -532,7 +532,7 @@ int cxgbe_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, > > /* Free up the existing queue */ > if (eth_dev->data->tx_queues[queue_idx]) { > - cxgbe_dev_tx_queue_release(eth_dev->data->tx_queues[queue_idx]); > + cxgbe_dev_tx_queue_release(eth_dev, queue_idx); > eth_dev->data->tx_queues[queue_idx] = NULL; > } > > @@ -565,9 +565,9 @@ int cxgbe_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, > return err; > } > > -void cxgbe_dev_tx_queue_release(void *q) > +void cxgbe_dev_tx_queue_release(struct rte_eth_dev *eth_dev, uint16_t qid) > { > - struct sge_eth_txq *txq = (struct sge_eth_txq *)q; > + struct sge_eth_txq *txq = eth_dev->data->tx_queues[qid]; > > if (txq) { > struct port_info *pi = (struct port_info *) > @@ -655,7 +655,7 @@ int cxgbe_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, > > /* Free up the existing queue */ > if (eth_dev->data->rx_queues[queue_idx]) { > - cxgbe_dev_rx_queue_release(eth_dev->data->rx_queues[queue_idx]); > + cxgbe_dev_rx_queue_release(eth_dev, queue_idx); > eth_dev->data->rx_queues[queue_idx] = NULL; > } > > @@ -702,9 +702,9 @@ int cxgbe_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, > return err; > } > > -void cxgbe_dev_rx_queue_release(void *q) > +void cxgbe_dev_rx_queue_release(struct rte_eth_dev *eth_dev, uint16_t qid) > { > - struct sge_eth_rxq *rxq = (struct sge_eth_rxq *)q; > + struct sge_eth_rxq *rxq = eth_dev->data->rx_queues[qid]; > > if (rxq) { > struct port_info *pi = (struct port_info *) > diff --git a/drivers/net/cxgbe/cxgbe_pfvf.h b/drivers/net/cxgbe/cxgbe_pfvf.h > index 801d6995d1f..4a496659052 100644 > --- a/drivers/net/cxgbe/cxgbe_pfvf.h > +++ b/drivers/net/cxgbe/cxgbe_pfvf.h > @@ -16,8 +16,8 @@ > V_FW_PARAMS_PARAM_Y(0) | \ > V_FW_PARAMS_PARAM_Z(0)) > > -void cxgbe_dev_rx_queue_release(void *q); > -void cxgbe_dev_tx_queue_release(void *q); > +void cxgbe_dev_rx_queue_release(struct rte_eth_dev *eth_dev, uint16_t qid); > +void cxgbe_dev_tx_queue_release(struct rte_eth_dev *eth_dev, uint16_t qid); > int cxgbe_dev_stop(struct rte_eth_dev *eth_dev); > int cxgbe_dev_close(struct rte_eth_dev *eth_dev); > int cxgbe_dev_info_get(struct rte_eth_dev *eth_dev, > diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c > index 48ffbf6c214..5b9381cf407 100644 > --- a/drivers/net/dpaa2/dpaa2_ethdev.c > +++ b/drivers/net/dpaa2/dpaa2_ethdev.c > @@ -976,9 +976,9 @@ dpaa2_dev_tx_queue_setup(struct rte_eth_dev *dev, > } > > static void > -dpaa2_dev_rx_queue_release(void *q __rte_unused) > +dpaa2_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t rx_queue_id) > { > - struct dpaa2_queue *dpaa2_q = (struct dpaa2_queue *)q; > + struct dpaa2_queue *dpaa2_q = dev->data->rx_queues[rx_queue_id]; > struct dpaa2_dev_priv *priv = dpaa2_q->eth_data->dev_private; > struct fsl_mc_io *dpni = > (struct fsl_mc_io *)priv->eth_dev->process_private; > diff --git a/drivers/net/e1000/e1000_ethdev.h b/drivers/net/e1000/e1000_ethdev.h > index 3b4d9c3ee6f..8e10e2777e6 100644 > --- a/drivers/net/e1000/e1000_ethdev.h > +++ b/drivers/net/e1000/e1000_ethdev.h > @@ -386,8 +386,8 @@ extern const struct rte_flow_ops igb_flow_ops; > /* > * RX/TX IGB function prototypes > */ > -void eth_igb_tx_queue_release(void *txq); > -void eth_igb_rx_queue_release(void *rxq); > +void eth_igb_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > +void eth_igb_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > void igb_dev_clear_queues(struct rte_eth_dev *dev); > void igb_dev_free_queues(struct rte_eth_dev *dev); > > @@ -462,8 +462,8 @@ uint32_t em_get_max_pktlen(struct rte_eth_dev *dev); > /* > * RX/TX EM function prototypes > */ > -void eth_em_tx_queue_release(void *txq); > -void eth_em_rx_queue_release(void *rxq); > +void eth_em_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > +void eth_em_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > void em_dev_clear_queues(struct rte_eth_dev *dev); > void em_dev_free_queues(struct rte_eth_dev *dev); > diff --git a/drivers/net/e1000/em_rxtx.c b/drivers/net/e1000/em_rxtx.c > index dfd8f2fd007..00a8af6d39f 100644 > --- a/drivers/net/e1000/em_rxtx.c > +++ b/drivers/net/e1000/em_rxtx.c > @@ -1121,9 +1121,9 @@ em_tx_queue_release(struct em_tx_queue *txq) > } > > void > -eth_em_tx_queue_release(void *txq) > +eth_em_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - em_tx_queue_release(txq); > + em_tx_queue_release(dev->data->tx_queues[qid]); > } > > /* (Re)set dynamic em_tx_queue fields to defaults */ > @@ -1343,9 +1343,9 @@ em_rx_queue_release(struct em_rx_queue *rxq) > } > > void > -eth_em_rx_queue_release(void *rxq) > +eth_em_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - em_rx_queue_release(rxq); > + em_rx_queue_release(dev->data->rx_queues[qid]); > } > > /* Reset dynamic em_rx_queue fields back to defaults */ > @@ -1609,14 +1609,14 @@ em_dev_free_queues(struct rte_eth_dev *dev) > uint16_t i; > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - eth_em_rx_queue_release(dev->data->rx_queues[i]); > + eth_em_rx_queue_release(dev, i); > dev->data->rx_queues[i] = NULL; > rte_eth_dma_zone_free(dev, "rx_ring", i); > } > dev->data->nb_rx_queues = 0; > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - eth_em_tx_queue_release(dev->data->tx_queues[i]); > + eth_em_tx_queue_release(dev, i); > dev->data->tx_queues[i] = NULL; > rte_eth_dma_zone_free(dev, "tx_ring", i); > } > diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c > index 278d5d2712a..d97ca1a0113 100644 > --- a/drivers/net/e1000/igb_rxtx.c > +++ b/drivers/net/e1000/igb_rxtx.c > @@ -1281,9 +1281,9 @@ igb_tx_queue_release(struct igb_tx_queue *txq) > } > > void > -eth_igb_tx_queue_release(void *txq) > +eth_igb_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - igb_tx_queue_release(txq); > + igb_tx_queue_release(dev->data->tx_queues[qid]); > } > > static int > @@ -1606,9 +1606,9 @@ igb_rx_queue_release(struct igb_rx_queue *rxq) > } > > void > -eth_igb_rx_queue_release(void *rxq) > +eth_igb_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - igb_rx_queue_release(rxq); > + igb_rx_queue_release(dev->data->rx_queues[qid]); > } > > static void > @@ -1883,14 +1883,14 @@ igb_dev_free_queues(struct rte_eth_dev *dev) > uint16_t i; > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - eth_igb_rx_queue_release(dev->data->rx_queues[i]); > + eth_igb_rx_queue_release(dev, i); > dev->data->rx_queues[i] = NULL; > rte_eth_dma_zone_free(dev, "rx_ring", i); > } > dev->data->nb_rx_queues = 0; > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - eth_igb_tx_queue_release(dev->data->tx_queues[i]); > + eth_igb_tx_queue_release(dev, i); > dev->data->tx_queues[i] = NULL; > rte_eth_dma_zone_free(dev, "tx_ring", i); > } > diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c > index 4cebf60a68a..a82d4b62873 100644 > --- a/drivers/net/ena/ena_ethdev.c > +++ b/drivers/net/ena/ena_ethdev.c > @@ -192,8 +192,8 @@ static int ena_dev_reset(struct rte_eth_dev *dev); > static int ena_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats); > static void ena_rx_queue_release_all(struct rte_eth_dev *dev); > static void ena_tx_queue_release_all(struct rte_eth_dev *dev); > -static void ena_rx_queue_release(void *queue); > -static void ena_tx_queue_release(void *queue); > +static void ena_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > +static void ena_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > static void ena_rx_queue_release_bufs(struct ena_ring *ring); > static void ena_tx_queue_release_bufs(struct ena_ring *ring); > static int ena_link_update(struct rte_eth_dev *dev, > @@ -525,27 +525,25 @@ ena_dev_reset(struct rte_eth_dev *dev) > > static void ena_rx_queue_release_all(struct rte_eth_dev *dev) > { > - struct ena_ring **queues = (struct ena_ring **)dev->data->rx_queues; > int nb_queues = dev->data->nb_rx_queues; > int i; > > for (i = 0; i < nb_queues; i++) > - ena_rx_queue_release(queues[i]); > + ena_rx_queue_release(dev, i); > } > > static void ena_tx_queue_release_all(struct rte_eth_dev *dev) > { > - struct ena_ring **queues = (struct ena_ring **)dev->data->tx_queues; > int nb_queues = dev->data->nb_tx_queues; > int i; > > for (i = 0; i < nb_queues; i++) > - ena_tx_queue_release(queues[i]); > + ena_tx_queue_release(dev, i); > } > > -static void ena_rx_queue_release(void *queue) > +static void ena_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct ena_ring *ring = (struct ena_ring *)queue; > + struct ena_ring *ring = dev->data->rx_queues[qid]; > > /* Free ring resources */ > if (ring->rx_buffer_info) > @@ -566,9 +564,9 @@ static void ena_rx_queue_release(void *queue) > ring->port_id, ring->id); > } > > -static void ena_tx_queue_release(void *queue) > +static void ena_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct ena_ring *ring = (struct ena_ring *)queue; > + struct ena_ring *ring = dev->data->tx_queues[qid]; > > /* Free ring resources */ > if (ring->push_buf_intermediate_buf) > diff --git a/drivers/net/enetc/enetc_ethdev.c b/drivers/net/enetc/enetc_ethdev.c > index b496cd47004..246aff46724 100644 > --- a/drivers/net/enetc/enetc_ethdev.c > +++ b/drivers/net/enetc/enetc_ethdev.c > @@ -325,8 +325,10 @@ enetc_tx_queue_setup(struct rte_eth_dev *dev, > } > > static void > -enetc_tx_queue_release(void *txq) > +enetc_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > + void *txq = dev->data->tx_queues[qid]; > + > if (txq == NULL) > return; > > @@ -473,8 +475,10 @@ enetc_rx_queue_setup(struct rte_eth_dev *dev, > } > > static void > -enetc_rx_queue_release(void *rxq) > +enetc_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > + void *rxq = dev->data->rx_queues[qid]; > + > if (rxq == NULL) > return; > > @@ -561,13 +565,13 @@ enetc_dev_close(struct rte_eth_dev *dev) > ret = enetc_dev_stop(dev); > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - enetc_rx_queue_release(dev->data->rx_queues[i]); > + enetc_rx_queue_release(dev, i); > dev->data->rx_queues[i] = NULL; > } > dev->data->nb_rx_queues = 0; > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - enetc_tx_queue_release(dev->data->tx_queues[i]); > + enetc_tx_queue_release(dev, i); > dev->data->tx_queues[i] = NULL; > } > dev->data->nb_tx_queues = 0; > diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c > index 8d5797523b8..b03e56bc250 100644 > --- a/drivers/net/enic/enic_ethdev.c > +++ b/drivers/net/enic/enic_ethdev.c > @@ -88,8 +88,10 @@ enicpmd_dev_flow_ops_get(struct rte_eth_dev *dev, > return 0; > } > > -static void enicpmd_dev_tx_queue_release(void *txq) > +static void enicpmd_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > + void *txq = dev->data->tx_queues[qid]; > + > ENICPMD_FUNC_TRACE(); > > if (rte_eal_process_type() != RTE_PROC_PRIMARY) > @@ -223,8 +225,10 @@ static int enicpmd_dev_rx_queue_stop(struct rte_eth_dev *eth_dev, > return ret; > } > > -static void enicpmd_dev_rx_queue_release(void *rxq) > +static void enicpmd_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > + void *rxq = dev->data->rx_queues[qid]; > + > ENICPMD_FUNC_TRACE(); > > if (rte_eal_process_type() != RTE_PROC_PRIMARY) > diff --git a/drivers/net/enic/enic_vf_representor.c b/drivers/net/enic/enic_vf_representor.c > index 79dd6e5640d..cfd02c03cce 100644 > --- a/drivers/net/enic/enic_vf_representor.c > +++ b/drivers/net/enic/enic_vf_representor.c > @@ -70,8 +70,10 @@ static int enic_vf_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, > return 0; > } > > -static void enic_vf_dev_tx_queue_release(void *txq) > +static void enic_vf_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > + void *txq = dev->data->tx_queues[qid]; > + > ENICPMD_FUNC_TRACE(); > if (rte_eal_process_type() != RTE_PROC_PRIMARY) > return; > @@ -108,8 +110,10 @@ static int enic_vf_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, > return 0; > } > > -static void enic_vf_dev_rx_queue_release(void *rxq) > +static void enic_vf_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > + void *rxq = dev->data->rx_queues[qid]; > + > ENICPMD_FUNC_TRACE(); > if (rte_eal_process_type() != RTE_PROC_PRIMARY) > return; > diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c > index 5ff33e03e03..d0030af0610 100644 > --- a/drivers/net/failsafe/failsafe_ops.c > +++ b/drivers/net/failsafe/failsafe_ops.c > @@ -358,26 +358,21 @@ fs_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id) > } > > static void > -fs_rx_queue_release(void *queue) > +fs_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct rte_eth_dev *dev; > struct sub_device *sdev; > uint8_t i; > - struct rxq *rxq; > + struct rxq *rxq = dev->data->rx_queues[qid]; > > - if (queue == NULL) > + if (rxq == NULL) > return; > - rxq = queue; > - dev = &rte_eth_devices[rxq->priv->data->port_id]; > fs_lock(dev, 0); > if (rxq->event_fd >= 0) > close(rxq->event_fd); > FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) { > if (ETH(sdev)->data->rx_queues != NULL && > - ETH(sdev)->data->rx_queues[rxq->qid] != NULL) { > - SUBOPS(sdev, rx_queue_release) > - (ETH(sdev)->data->rx_queues[rxq->qid]); > - } > + ETH(sdev)->data->rx_queues[rxq->qid] != NULL) > + SUBOPS(sdev, rx_queue_release)(ETH(sdev), rxq->qid); > } > dev->data->rx_queues[rxq->qid] = NULL; > rte_free(rxq); > @@ -420,7 +415,7 @@ fs_rx_queue_setup(struct rte_eth_dev *dev, > } > rxq = dev->data->rx_queues[rx_queue_id]; > if (rxq != NULL) { > - fs_rx_queue_release(rxq); > + fs_rx_queue_release(dev, rx_queue_id); > dev->data->rx_queues[rx_queue_id] = NULL; > } > rxq = rte_zmalloc(NULL, > @@ -460,7 +455,7 @@ fs_rx_queue_setup(struct rte_eth_dev *dev, > fs_unlock(dev, 0); > return 0; > free_rxq: > - fs_rx_queue_release(rxq); > + fs_rx_queue_release(dev, rx_queue_id); > fs_unlock(dev, 0); > return ret; > } > @@ -542,24 +537,19 @@ fs_rx_intr_disable(struct rte_eth_dev *dev, uint16_t idx) > } > > static void > -fs_tx_queue_release(void *queue) > +fs_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct rte_eth_dev *dev; > struct sub_device *sdev; > uint8_t i; > - struct txq *txq; > + struct txq *txq = dev->data->tx_queues[qid]; > > - if (queue == NULL) > + if (txq == NULL) > return; > - txq = queue; > - dev = &rte_eth_devices[txq->priv->data->port_id]; > fs_lock(dev, 0); > FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) { > if (ETH(sdev)->data->tx_queues != NULL && > - ETH(sdev)->data->tx_queues[txq->qid] != NULL) { > - SUBOPS(sdev, tx_queue_release) > - (ETH(sdev)->data->tx_queues[txq->qid]); > - } > + ETH(sdev)->data->tx_queues[txq->qid] != NULL) > + SUBOPS(sdev, tx_queue_release)(ETH(sdev), txq->qid); > } > dev->data->tx_queues[txq->qid] = NULL; > rte_free(txq); > @@ -591,7 +581,7 @@ fs_tx_queue_setup(struct rte_eth_dev *dev, > } > txq = dev->data->tx_queues[tx_queue_id]; > if (txq != NULL) { > - fs_tx_queue_release(txq); > + fs_tx_queue_release(dev, tx_queue_id); > dev->data->tx_queues[tx_queue_id] = NULL; > } > txq = rte_zmalloc("ethdev TX queue", > @@ -623,7 +613,7 @@ fs_tx_queue_setup(struct rte_eth_dev *dev, > fs_unlock(dev, 0); > return 0; > free_txq: > - fs_tx_queue_release(txq); > + fs_tx_queue_release(dev, tx_queue_id); > fs_unlock(dev, 0); > return ret; > } > @@ -634,12 +624,12 @@ fs_dev_free_queues(struct rte_eth_dev *dev) > uint16_t i; > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - fs_rx_queue_release(dev->data->rx_queues[i]); > + fs_rx_queue_release(dev, i); > dev->data->rx_queues[i] = NULL; > } > dev->data->nb_rx_queues = 0; > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - fs_tx_queue_release(dev->data->tx_queues[i]); > + fs_tx_queue_release(dev, i); > dev->data->tx_queues[i] = NULL; > } > dev->data->nb_tx_queues = 0; > diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c > index 3236290e402..7075d69022c 100644 > --- a/drivers/net/fm10k/fm10k_ethdev.c > +++ b/drivers/net/fm10k/fm10k_ethdev.c > @@ -51,8 +51,8 @@ static int > fm10k_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on); > static void fm10k_MAC_filter_set(struct rte_eth_dev *dev, > const u8 *mac, bool add, uint32_t pool); > -static void fm10k_tx_queue_release(void *queue); > -static void fm10k_rx_queue_release(void *queue); > +static void fm10k_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > +static void fm10k_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > static void fm10k_set_rx_function(struct rte_eth_dev *dev); > static void fm10k_set_tx_function(struct rte_eth_dev *dev); > static int fm10k_check_ftag(struct rte_devargs *devargs); > @@ -1210,7 +1210,7 @@ fm10k_dev_queue_release(struct rte_eth_dev *dev) > > if (dev->data->rx_queues) { > for (i = 0; i < dev->data->nb_rx_queues; i++) > - fm10k_rx_queue_release(dev->data->rx_queues[i]); > + fm10k_rx_queue_release(dev, i); > } > } > > @@ -1891,11 +1891,11 @@ fm10k_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id, > } > > static void > -fm10k_rx_queue_release(void *queue) > +fm10k_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > PMD_INIT_FUNC_TRACE(); > > - rx_queue_free(queue); > + rx_queue_free(dev->data->rx_queues[qid]); > } > > static inline int > @@ -2080,9 +2080,9 @@ fm10k_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id, > } > > static void > -fm10k_tx_queue_release(void *queue) > +fm10k_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct fm10k_tx_queue *q = queue; > + struct fm10k_tx_queue *q = dev->data->tx_queues[qid]; > PMD_INIT_FUNC_TRACE(); > > tx_queue_free(q); > diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c > index c01e2ec1d45..cd4dad8588f 100644 > --- a/drivers/net/hinic/hinic_pmd_ethdev.c > +++ b/drivers/net/hinic/hinic_pmd_ethdev.c > @@ -1075,12 +1075,14 @@ static int hinic_dev_start(struct rte_eth_dev *dev) > /** > * DPDK callback to release the receive queue. > * > - * @param queue > - * Generic receive queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param qid > + * Receive queue index. > */ > -static void hinic_rx_queue_release(void *queue) > +static void hinic_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct hinic_rxq *rxq = queue; > + struct hinic_rxq *rxq = dev->data->rx_queues[qid]; > struct hinic_nic_dev *nic_dev; > > if (!rxq) { > @@ -1107,12 +1109,14 @@ static void hinic_rx_queue_release(void *queue) > /** > * DPDK callback to release the transmit queue. > * > - * @param queue > - * Generic transmit queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param qid > + * Transmit queue index. > */ > -static void hinic_tx_queue_release(void *queue) > +static void hinic_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct hinic_txq *txq = queue; > + struct hinic_txq *txq = dev->data->tx_queues[qid]; > struct hinic_nic_dev *nic_dev; > > if (!txq) { > diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h > index 0e4e4269a12..fc81b8a5d41 100644 > --- a/drivers/net/hns3/hns3_ethdev.h > +++ b/drivers/net/hns3/hns3_ethdev.h > @@ -104,6 +104,9 @@ > > #define HNS3_MAX_USER_PRIO 8 > #define HNS3_PG_NUM 4 > + > +#define HNS3_DEV(hw) &rte_eth_devices[(hw)->data->port_id] > + > enum hns3_fc_mode { > HNS3_FC_NONE, > HNS3_FC_RX_PAUSE, > diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c > index 481872e3957..9d22c105da9 100644 > --- a/drivers/net/hns3/hns3_rxtx.c > +++ b/drivers/net/hns3/hns3_rxtx.c > @@ -109,9 +109,9 @@ hns3_tx_queue_release(void *queue) > } > > void > -hns3_dev_rx_queue_release(void *queue) > +hns3_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct hns3_rx_queue *rxq = queue; > + struct hns3_rx_queue *rxq = dev->data->rx_queues[qid]; > struct hns3_adapter *hns; > > if (rxq == NULL) > @@ -119,14 +119,14 @@ hns3_dev_rx_queue_release(void *queue) > > hns = rxq->hns; > rte_spinlock_lock(&hns->hw.lock); > - hns3_rx_queue_release(queue); > + hns3_rx_queue_release(rxq); > rte_spinlock_unlock(&hns->hw.lock); > } > > void > -hns3_dev_tx_queue_release(void *queue) > +hns3_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct hns3_tx_queue *txq = queue; > + struct hns3_tx_queue *txq = dev->data->tx_queues[qid]; > struct hns3_adapter *hns; > > if (txq == NULL) > @@ -134,7 +134,7 @@ hns3_dev_tx_queue_release(void *queue) > > hns = txq->hns; > rte_spinlock_lock(&hns->hw.lock); > - hns3_tx_queue_release(queue); > + hns3_tx_queue_release(txq); > rte_spinlock_unlock(&hns->hw.lock); > } > > @@ -1536,7 +1536,7 @@ hns3_fake_rx_queue_config(struct hns3_hw *hw, uint16_t nb_queues) > /* re-configure */ > rxq = hw->fkq_data.rx_queues; > for (i = nb_queues; i < old_nb_queues; i++) > - hns3_dev_rx_queue_release(rxq[i]); > + hns3_dev_rx_queue_release(HNS3_DEV(hw), i); > > rxq = rte_realloc(rxq, sizeof(rxq[0]) * nb_queues, > RTE_CACHE_LINE_SIZE); > @@ -1549,9 +1549,8 @@ hns3_fake_rx_queue_config(struct hns3_hw *hw, uint16_t nb_queues) > > hw->fkq_data.rx_queues = rxq; > } else if (hw->fkq_data.rx_queues != NULL && nb_queues == 0) { > - rxq = hw->fkq_data.rx_queues; > for (i = nb_queues; i < old_nb_queues; i++) > - hns3_dev_rx_queue_release(rxq[i]); > + hns3_dev_rx_queue_release(HNS3_DEV(hw), i); > > rte_free(hw->fkq_data.rx_queues); > hw->fkq_data.rx_queues = NULL; > @@ -1583,7 +1582,7 @@ hns3_fake_tx_queue_config(struct hns3_hw *hw, uint16_t nb_queues) > /* re-configure */ > txq = hw->fkq_data.tx_queues; > for (i = nb_queues; i < old_nb_queues; i++) > - hns3_dev_tx_queue_release(txq[i]); > + hns3_dev_tx_queue_release(HNS3_DEV(hw), i); > txq = rte_realloc(txq, sizeof(txq[0]) * nb_queues, > RTE_CACHE_LINE_SIZE); > if (txq == NULL) > @@ -1597,7 +1596,7 @@ hns3_fake_tx_queue_config(struct hns3_hw *hw, uint16_t nb_queues) > } else if (hw->fkq_data.tx_queues != NULL && nb_queues == 0) { > txq = hw->fkq_data.tx_queues; > for (i = nb_queues; i < old_nb_queues; i++) > - hns3_dev_tx_queue_release(txq[i]); > + hns3_dev_tx_queue_release(HNS3_DEV(hw), i); > > rte_free(hw->fkq_data.tx_queues); > hw->fkq_data.tx_queues = NULL; > diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h > index cd7c21c1d0c..390e4ae685a 100644 > --- a/drivers/net/hns3/hns3_rxtx.h > +++ b/drivers/net/hns3/hns3_rxtx.h > @@ -677,8 +677,8 @@ hns3_write_txq_tail_reg(struct hns3_tx_queue *txq, uint32_t value) > rte_write32_relaxed(rte_cpu_to_le_32(value), txq->io_tail_reg); > } > > -void hns3_dev_rx_queue_release(void *queue); > -void hns3_dev_tx_queue_release(void *queue); > +void hns3_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > +void hns3_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > void hns3_free_all_queues(struct rte_eth_dev *dev); > int hns3_reset_all_tqps(struct hns3_adapter *hns); > void hns3_dev_all_rx_queue_intr_enable(struct hns3_hw *hw, bool en); > diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c > index af075fda2a2..105a6a657ff 100644 > --- a/drivers/net/i40e/i40e_fdir.c > +++ b/drivers/net/i40e/i40e_fdir.c > @@ -264,10 +264,10 @@ i40e_fdir_setup(struct i40e_pf *pf) > return I40E_SUCCESS; > > fail_mem: > - i40e_dev_rx_queue_release(pf->fdir.rxq); > + i40e_rx_queue_release(pf->fdir.rxq); > pf->fdir.rxq = NULL; > fail_setup_rx: > - i40e_dev_tx_queue_release(pf->fdir.txq); > + i40e_tx_queue_release(pf->fdir.txq); > pf->fdir.txq = NULL; > fail_setup_tx: > i40e_vsi_release(vsi); > @@ -302,10 +302,10 @@ i40e_fdir_teardown(struct i40e_pf *pf) > PMD_DRV_LOG(DEBUG, "Failed to do FDIR RX switch off"); > > rte_eth_dma_zone_free(dev, "fdir_rx_ring", pf->fdir.rxq->queue_id); > - i40e_dev_rx_queue_release(pf->fdir.rxq); > + i40e_rx_queue_release(pf->fdir.rxq); > pf->fdir.rxq = NULL; > rte_eth_dma_zone_free(dev, "fdir_tx_ring", pf->fdir.txq->queue_id); > - i40e_dev_tx_queue_release(pf->fdir.txq); > + i40e_tx_queue_release(pf->fdir.txq); > pf->fdir.txq = NULL; > i40e_vsi_release(vsi); > pf->fdir.fdir_vsi = NULL; > diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c > index 3eb82578b0d..629f98e7966 100644 > --- a/drivers/net/i40e/i40e_rxtx.c > +++ b/drivers/net/i40e/i40e_rxtx.c > @@ -1985,7 +1985,7 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev, > > /* Free memory if needed */ > if (dev->data->rx_queues[queue_idx]) { > - i40e_dev_rx_queue_release(dev->data->rx_queues[queue_idx]); > + i40e_rx_queue_release(dev->data->rx_queues[queue_idx]); > dev->data->rx_queues[queue_idx] = NULL; > } > > @@ -2029,7 +2029,7 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev, > rz = rte_eth_dma_zone_reserve(dev, "rx_ring", queue_idx, > ring_size, I40E_RING_BASE_ALIGN, socket_id); > if (!rz) { > - i40e_dev_rx_queue_release(rxq); > + i40e_rx_queue_release(rxq); > PMD_DRV_LOG(ERR, "Failed to reserve DMA memory for RX"); > return -ENOMEM; > } > @@ -2049,7 +2049,7 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev, > RTE_CACHE_LINE_SIZE, > socket_id); > if (!rxq->sw_ring) { > - i40e_dev_rx_queue_release(rxq); > + i40e_rx_queue_release(rxq); > PMD_DRV_LOG(ERR, "Failed to allocate memory for SW ring"); > return -ENOMEM; > } > @@ -2072,7 +2072,7 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev, > > if (dev->data->dev_started) { > if (i40e_dev_rx_queue_setup_runtime(dev, rxq)) { > - i40e_dev_rx_queue_release(rxq); > + i40e_rx_queue_release(rxq); > return -EINVAL; > } > } else { > @@ -2102,7 +2102,19 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev, > } > > void > -i40e_dev_rx_queue_release(void *rxq) > +i40e_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > +{ > + i40e_rx_queue_release(dev->data->rx_queues[qid]); > +} > + > +void > +i40e_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > +{ > + i40e_tx_queue_release(dev->data->tx_queues[qid]); > +} > + > +void > +i40e_rx_queue_release(void *rxq) > { > struct i40e_rx_queue *q = (struct i40e_rx_queue *)rxq; > > @@ -2407,7 +2419,7 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev, > > /* Free memory if needed. */ > if (dev->data->tx_queues[queue_idx]) { > - i40e_dev_tx_queue_release(dev->data->tx_queues[queue_idx]); > + i40e_tx_queue_release(dev->data->tx_queues[queue_idx]); > dev->data->tx_queues[queue_idx] = NULL; > } > > @@ -2428,7 +2440,7 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev, > tz = rte_eth_dma_zone_reserve(dev, "tx_ring", queue_idx, > ring_size, I40E_RING_BASE_ALIGN, socket_id); > if (!tz) { > - i40e_dev_tx_queue_release(txq); > + i40e_tx_queue_release(txq); > PMD_DRV_LOG(ERR, "Failed to reserve DMA memory for TX"); > return -ENOMEM; > } > @@ -2456,7 +2468,7 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev, > RTE_CACHE_LINE_SIZE, > socket_id); > if (!txq->sw_ring) { > - i40e_dev_tx_queue_release(txq); > + i40e_tx_queue_release(txq); > PMD_DRV_LOG(ERR, "Failed to allocate memory for SW TX ring"); > return -ENOMEM; > } > @@ -2479,7 +2491,7 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev, > > if (dev->data->dev_started) { > if (i40e_dev_tx_queue_setup_runtime(dev, txq)) { > - i40e_dev_tx_queue_release(txq); > + i40e_tx_queue_release(txq); > return -EINVAL; > } > } else { > @@ -2495,7 +2507,7 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev, > } > > void > -i40e_dev_tx_queue_release(void *txq) > +i40e_tx_queue_release(void *txq) > { > struct i40e_tx_queue *q = (struct i40e_tx_queue *)txq; > > @@ -3060,7 +3072,7 @@ i40e_dev_free_queues(struct rte_eth_dev *dev) > for (i = 0; i < dev->data->nb_rx_queues; i++) { > if (!dev->data->rx_queues[i]) > continue; > - i40e_dev_rx_queue_release(dev->data->rx_queues[i]); > + i40e_rx_queue_release(dev->data->rx_queues[i]); > dev->data->rx_queues[i] = NULL; > rte_eth_dma_zone_free(dev, "rx_ring", i); > } > @@ -3068,7 +3080,7 @@ i40e_dev_free_queues(struct rte_eth_dev *dev) > for (i = 0; i < dev->data->nb_tx_queues; i++) { > if (!dev->data->tx_queues[i]) > continue; > - i40e_dev_tx_queue_release(dev->data->tx_queues[i]); > + i40e_tx_queue_release(dev->data->tx_queues[i]); > dev->data->tx_queues[i] = NULL; > rte_eth_dma_zone_free(dev, "tx_ring", i); > } > @@ -3108,7 +3120,7 @@ i40e_fdir_setup_tx_resources(struct i40e_pf *pf) > I40E_FDIR_QUEUE_ID, ring_size, > I40E_RING_BASE_ALIGN, SOCKET_ID_ANY); > if (!tz) { > - i40e_dev_tx_queue_release(txq); > + i40e_tx_queue_release(txq); > PMD_DRV_LOG(ERR, "Failed to reserve DMA memory for TX."); > return I40E_ERR_NO_MEMORY; > } > @@ -3166,7 +3178,7 @@ i40e_fdir_setup_rx_resources(struct i40e_pf *pf) > I40E_FDIR_QUEUE_ID, ring_size, > I40E_RING_BASE_ALIGN, SOCKET_ID_ANY); > if (!rz) { > - i40e_dev_rx_queue_release(rxq); > + i40e_rx_queue_release(rxq); > PMD_DRV_LOG(ERR, "Failed to reserve DMA memory for RX."); > return I40E_ERR_NO_MEMORY; > } > diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h > index 5ccf5773e85..8d6ab16b4fe 100644 > --- a/drivers/net/i40e/i40e_rxtx.h > +++ b/drivers/net/i40e/i40e_rxtx.h > @@ -197,8 +197,10 @@ int i40e_dev_tx_queue_setup(struct rte_eth_dev *dev, > uint16_t nb_desc, > unsigned int socket_id, > const struct rte_eth_txconf *tx_conf); > -void i40e_dev_rx_queue_release(void *rxq); > -void i40e_dev_tx_queue_release(void *txq); > +void i40e_rx_queue_release(void *rxq); > +void i40e_tx_queue_release(void *txq); > +void i40e_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > +void i40e_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > uint16_t i40e_recv_pkts(void *rx_queue, > struct rte_mbuf **rx_pkts, > uint16_t nb_pkts); > diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c > index 87afc0b4cb9..88661e5d74a 100644 > --- a/drivers/net/iavf/iavf_rxtx.c > +++ b/drivers/net/iavf/iavf_rxtx.c > @@ -562,7 +562,7 @@ iavf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, > > /* Free memory if needed */ > if (dev->data->rx_queues[queue_idx]) { > - iavf_dev_rx_queue_release(dev->data->rx_queues[queue_idx]); > + iavf_dev_rx_queue_release(dev, queue_idx); > dev->data->rx_queues[queue_idx] = NULL; > } > > @@ -721,7 +721,7 @@ iavf_dev_tx_queue_setup(struct rte_eth_dev *dev, > > /* Free memory if needed. */ > if (dev->data->tx_queues[queue_idx]) { > - iavf_dev_tx_queue_release(dev->data->tx_queues[queue_idx]); > + iavf_dev_tx_queue_release(dev, queue_idx); > dev->data->tx_queues[queue_idx] = NULL; > } > > @@ -962,9 +962,9 @@ iavf_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id) > } > > void > -iavf_dev_rx_queue_release(void *rxq) > +iavf_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct iavf_rx_queue *q = (struct iavf_rx_queue *)rxq; > + struct iavf_rx_queue *q = dev->data->rx_queues[qid]; > > if (!q) > return; > @@ -976,9 +976,9 @@ iavf_dev_rx_queue_release(void *rxq) > } > > void > -iavf_dev_tx_queue_release(void *txq) > +iavf_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct iavf_tx_queue *q = (struct iavf_tx_queue *)txq; > + struct iavf_tx_queue *q = dev->data->tx_queues[qid]; > > if (!q) > return; > diff --git a/drivers/net/iavf/iavf_rxtx.h b/drivers/net/iavf/iavf_rxtx.h > index e210b913d63..c7a868cf1dd 100644 > --- a/drivers/net/iavf/iavf_rxtx.h > +++ b/drivers/net/iavf/iavf_rxtx.h > @@ -420,7 +420,7 @@ int iavf_dev_rx_queue_setup(struct rte_eth_dev *dev, > > int iavf_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id); > int iavf_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id); > -void iavf_dev_rx_queue_release(void *rxq); > +void iavf_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > int iavf_dev_tx_queue_setup(struct rte_eth_dev *dev, > uint16_t queue_idx, > @@ -430,7 +430,7 @@ int iavf_dev_tx_queue_setup(struct rte_eth_dev *dev, > int iavf_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id); > int iavf_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id); > int iavf_dev_tx_done_cleanup(void *txq, uint32_t free_cnt); > -void iavf_dev_tx_queue_release(void *txq); > +void iavf_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > void iavf_stop_queues(struct rte_eth_dev *dev); > uint16_t iavf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, > uint16_t nb_pkts); > diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c > index f510bad381d..0dc34d2e8d1 100644 > --- a/drivers/net/ice/ice_dcf_ethdev.c > +++ b/drivers/net/ice/ice_dcf_ethdev.c > @@ -1059,8 +1059,8 @@ static const struct eth_dev_ops ice_dcf_eth_dev_ops = { > .dev_infos_get = ice_dcf_dev_info_get, > .rx_queue_setup = ice_rx_queue_setup, > .tx_queue_setup = ice_tx_queue_setup, > - .rx_queue_release = ice_rx_queue_release, > - .tx_queue_release = ice_tx_queue_release, > + .rx_queue_release = ice_dev_rx_queue_release, > + .tx_queue_release = ice_dev_tx_queue_release, > .rx_queue_start = ice_dcf_rx_queue_start, > .tx_queue_start = ice_dcf_tx_queue_start, > .rx_queue_stop = ice_dcf_rx_queue_stop, > diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c > index e24a3b6e161..093d2170cb2 100644 > --- a/drivers/net/ice/ice_ethdev.c > +++ b/drivers/net/ice/ice_ethdev.c > @@ -189,9 +189,9 @@ static const struct eth_dev_ops ice_eth_dev_ops = { > .tx_queue_start = ice_tx_queue_start, > .tx_queue_stop = ice_tx_queue_stop, > .rx_queue_setup = ice_rx_queue_setup, > - .rx_queue_release = ice_rx_queue_release, > + .rx_queue_release = ice_dev_rx_queue_release, > .tx_queue_setup = ice_tx_queue_setup, > - .tx_queue_release = ice_tx_queue_release, > + .tx_queue_release = ice_dev_tx_queue_release, > .dev_infos_get = ice_dev_info_get, > .dev_supported_ptypes_get = ice_dev_supported_ptypes_get, > .link_update = ice_link_update, > diff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c > index 5d7ab4f047e..7f86cebe93f 100644 > --- a/drivers/net/ice/ice_rxtx.c > +++ b/drivers/net/ice/ice_rxtx.c > @@ -1374,6 +1374,18 @@ ice_tx_queue_setup(struct rte_eth_dev *dev, > return 0; > } > > +void > +ice_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > +{ > + ice_rx_queue_release(dev->data->rx_queues[qid]); > +} > + > +void > +ice_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > +{ > + ice_tx_queue_release(dev->data->tx_queues[qid]); > +} > + > void > ice_tx_queue_release(void *txq) > { > diff --git a/drivers/net/ice/ice_rxtx.h b/drivers/net/ice/ice_rxtx.h > index b10db0874d2..7f9838b58a4 100644 > --- a/drivers/net/ice/ice_rxtx.h > +++ b/drivers/net/ice/ice_rxtx.h > @@ -209,6 +209,8 @@ int ice_fdir_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id); > int ice_fdir_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id); > void ice_rx_queue_release(void *rxq); > void ice_tx_queue_release(void *txq); > +void ice_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > +void ice_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > void ice_free_queues(struct rte_eth_dev *dev); > int ice_fdir_setup_tx_resources(struct ice_pf *pf); > int ice_fdir_setup_rx_resources(struct ice_pf *pf); > diff --git a/drivers/net/igc/igc_ethdev.c b/drivers/net/igc/igc_ethdev.c > index 224a0954836..e634306249c 100644 > --- a/drivers/net/igc/igc_ethdev.c > +++ b/drivers/net/igc/igc_ethdev.c > @@ -1153,13 +1153,13 @@ igc_dev_free_queues(struct rte_eth_dev *dev) > uint16_t i; > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - eth_igc_rx_queue_release(dev->data->rx_queues[i]); > + eth_igc_rx_queue_release(dev, i); > dev->data->rx_queues[i] = NULL; > } > dev->data->nb_rx_queues = 0; > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - eth_igc_tx_queue_release(dev->data->tx_queues[i]); > + eth_igc_tx_queue_release(dev, i); > dev->data->tx_queues[i] = NULL; > } > dev->data->nb_tx_queues = 0; > diff --git a/drivers/net/igc/igc_txrx.c b/drivers/net/igc/igc_txrx.c > index b5489eedd22..7dee1bb0fa5 100644 > --- a/drivers/net/igc/igc_txrx.c > +++ b/drivers/net/igc/igc_txrx.c > @@ -716,10 +716,10 @@ igc_rx_queue_release(struct igc_rx_queue *rxq) > rte_free(rxq); > } > > -void eth_igc_rx_queue_release(void *rxq) > +void eth_igc_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - if (rxq) > - igc_rx_queue_release(rxq); > + if (dev->data->rx_queues[qid]) > + igc_rx_queue_release(dev->data->rx_queues[qid]); > } > > uint32_t eth_igc_rx_queue_count(struct rte_eth_dev *dev, > @@ -1899,10 +1899,10 @@ igc_tx_queue_release(struct igc_tx_queue *txq) > rte_free(txq); > } > > -void eth_igc_tx_queue_release(void *txq) > +void eth_igc_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - if (txq) > - igc_tx_queue_release(txq); > + if (dev->data->tx_queues[qid]) > + igc_tx_queue_release(dev->data->tx_queues[qid]); > } > > static void > diff --git a/drivers/net/igc/igc_txrx.h b/drivers/net/igc/igc_txrx.h > index f2b2d75bbc8..57bb87b3e4f 100644 > --- a/drivers/net/igc/igc_txrx.h > +++ b/drivers/net/igc/igc_txrx.h > @@ -14,8 +14,8 @@ extern "C" { > /* > * RX/TX function prototypes > */ > -void eth_igc_tx_queue_release(void *txq); > -void eth_igc_rx_queue_release(void *rxq); > +void eth_igc_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > +void eth_igc_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > void igc_dev_clear_queues(struct rte_eth_dev *dev); > int eth_igc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id, > uint16_t nb_rx_desc, unsigned int socket_id, > diff --git a/drivers/net/ionic/ionic_lif.c b/drivers/net/ionic/ionic_lif.c > index 431eda777b7..a1f9ce2d81c 100644 > --- a/drivers/net/ionic/ionic_lif.c > +++ b/drivers/net/ionic/ionic_lif.c > @@ -1056,11 +1056,11 @@ ionic_lif_free_queues(struct ionic_lif *lif) > uint32_t i; > > for (i = 0; i < lif->ntxqcqs; i++) { > - ionic_dev_tx_queue_release(lif->eth_dev->data->tx_queues[i]); > + ionic_dev_tx_queue_release(lif->eth_dev, i); > lif->eth_dev->data->tx_queues[i] = NULL; > } > for (i = 0; i < lif->nrxqcqs; i++) { > - ionic_dev_rx_queue_release(lif->eth_dev->data->rx_queues[i]); > + ionic_dev_rx_queue_release(lif->eth_dev, i); > lif->eth_dev->data->rx_queues[i] = NULL; > } > } > diff --git a/drivers/net/ionic/ionic_rxtx.c b/drivers/net/ionic/ionic_rxtx.c > index b83ea1bcaa6..67631a5813b 100644 > --- a/drivers/net/ionic/ionic_rxtx.c > +++ b/drivers/net/ionic/ionic_rxtx.c > @@ -118,9 +118,9 @@ ionic_tx_flush(struct ionic_tx_qcq *txq) > } > > void __rte_cold > -ionic_dev_tx_queue_release(void *tx_queue) > +ionic_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct ionic_tx_qcq *txq = tx_queue; > + struct ionic_tx_qcq *txq = dev->data->tx_queues[qid]; > struct ionic_tx_stats *stats = &txq->stats; > > IONIC_PRINT_CALL(); > @@ -185,8 +185,7 @@ ionic_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t tx_queue_id, > > /* Free memory prior to re-allocation if needed... */ > if (eth_dev->data->tx_queues[tx_queue_id] != NULL) { > - void *tx_queue = eth_dev->data->tx_queues[tx_queue_id]; > - ionic_dev_tx_queue_release(tx_queue); > + ionic_dev_tx_queue_release(eth_dev, tx_queue_id); > eth_dev->data->tx_queues[tx_queue_id] = NULL; > } > > @@ -664,9 +663,9 @@ ionic_rx_empty(struct ionic_rx_qcq *rxq) > } > > void __rte_cold > -ionic_dev_rx_queue_release(void *rx_queue) > +ionic_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct ionic_rx_qcq *rxq = rx_queue; > + struct ionic_rx_qcq *rxq = dev->data->rx_queues[qid]; > struct ionic_rx_stats *stats; > > if (!rxq) > @@ -726,8 +725,7 @@ ionic_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, > > /* Free memory prior to re-allocation if needed... */ > if (eth_dev->data->rx_queues[rx_queue_id] != NULL) { > - void *rx_queue = eth_dev->data->rx_queues[rx_queue_id]; > - ionic_dev_rx_queue_release(rx_queue); > + ionic_dev_rx_queue_release(eth_dev, rx_queue_id); > eth_dev->data->rx_queues[rx_queue_id] = NULL; > } > > diff --git a/drivers/net/ionic/ionic_rxtx.h b/drivers/net/ionic/ionic_rxtx.h > index 5c85b9c493a..befbe61cef0 100644 > --- a/drivers/net/ionic/ionic_rxtx.h > +++ b/drivers/net/ionic/ionic_rxtx.h > @@ -25,14 +25,14 @@ uint16_t ionic_prep_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, > int ionic_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id, > uint16_t nb_desc, uint32_t socket_id, > const struct rte_eth_rxconf *rx_conf, struct rte_mempool *mp); > -void ionic_dev_rx_queue_release(void *rxq); > +void ionic_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > int ionic_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id); > int ionic_dev_rx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t rx_queue_id); > > int ionic_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id, > uint16_t nb_desc, uint32_t socket_id, > const struct rte_eth_txconf *tx_conf); > -void ionic_dev_tx_queue_release(void *tx_queue); > +void ionic_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > int ionic_dev_tx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t tx_queue_id); > int ionic_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id); > > diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h > index a0ce18ca246..25ad14d0845 100644 > --- a/drivers/net/ixgbe/ixgbe_ethdev.h > +++ b/drivers/net/ixgbe/ixgbe_ethdev.h > @@ -589,9 +589,9 @@ void ixgbe_dev_clear_queues(struct rte_eth_dev *dev); > > void ixgbe_dev_free_queues(struct rte_eth_dev *dev); > > -void ixgbe_dev_rx_queue_release(void *rxq); > +void ixgbe_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > -void ixgbe_dev_tx_queue_release(void *txq); > +void ixgbe_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > int ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id, > uint16_t nb_rx_desc, unsigned int socket_id, > diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c > index bfdfd5e755d..176daaff9d7 100644 > --- a/drivers/net/ixgbe/ixgbe_rxtx.c > +++ b/drivers/net/ixgbe/ixgbe_rxtx.c > @@ -2487,9 +2487,9 @@ ixgbe_tx_queue_release(struct ixgbe_tx_queue *txq) > } > > void __rte_cold > -ixgbe_dev_tx_queue_release(void *txq) > +ixgbe_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - ixgbe_tx_queue_release(txq); > + ixgbe_tx_queue_release(dev->data->tx_queues[qid]); > } > > /* (Re)set dynamic ixgbe_tx_queue fields to defaults */ > @@ -2892,9 +2892,9 @@ ixgbe_rx_queue_release(struct ixgbe_rx_queue *rxq) > } > > void __rte_cold > -ixgbe_dev_rx_queue_release(void *rxq) > +ixgbe_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - ixgbe_rx_queue_release(rxq); > + ixgbe_rx_queue_release(dev->data->rx_queues[qid]); > } > > /* > @@ -3431,14 +3431,14 @@ ixgbe_dev_free_queues(struct rte_eth_dev *dev) > PMD_INIT_FUNC_TRACE(); > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - ixgbe_dev_rx_queue_release(dev->data->rx_queues[i]); > + ixgbe_dev_rx_queue_release(dev, i); > dev->data->rx_queues[i] = NULL; > rte_eth_dma_zone_free(dev, "rx_ring", i); > } > dev->data->nb_rx_queues = 0; > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - ixgbe_dev_tx_queue_release(dev->data->tx_queues[i]); > + ixgbe_dev_tx_queue_release(dev, i); > dev->data->tx_queues[i] = NULL; > rte_eth_dma_zone_free(dev, "tx_ring", i); > } > diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c > index b72060a4499..dbdab188e96 100644 > --- a/drivers/net/liquidio/lio_ethdev.c > +++ b/drivers/net/liquidio/lio_ethdev.c > @@ -1182,7 +1182,7 @@ lio_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no, > > /* Free previous allocation if any */ > if (eth_dev->data->rx_queues[q_no] != NULL) { > - lio_dev_rx_queue_release(eth_dev->data->rx_queues[q_no]); > + lio_dev_rx_queue_release(eth_dev, q_no); > eth_dev->data->rx_queues[q_no] = NULL; > } > > @@ -1204,16 +1204,18 @@ lio_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no, > * Release the receive queue/ringbuffer. Called by > * the upper layers. > * > - * @param rxq > - * Opaque pointer to the receive queue to release > + * @param eth_dev > + * Pointer to Ethernet device structure. > + * @param q_no > + * Receive queue index. > * > * @return > * - nothing > */ > void > -lio_dev_rx_queue_release(void *rxq) > +lio_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t q_no) > { > - struct lio_droq *droq = rxq; > + struct lio_droq *droq = dev->data->rx_queues[q_no]; > int oq_no; > > if (droq) { > @@ -1262,7 +1264,7 @@ lio_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no, > > /* Free previous allocation if any */ > if (eth_dev->data->tx_queues[q_no] != NULL) { > - lio_dev_tx_queue_release(eth_dev->data->tx_queues[q_no]); > + lio_dev_tx_queue_release(eth_dev, q_no); > eth_dev->data->tx_queues[q_no] = NULL; > } > > @@ -1292,16 +1294,18 @@ lio_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no, > * Release the transmit queue/ringbuffer. Called by > * the upper layers. > * > - * @param txq > - * Opaque pointer to the transmit queue to release > + * @param eth_dev > + * Pointer to Ethernet device structure. > + * @param q_no > + * Transmit queue index. > * > * @return > * - nothing > */ > void > -lio_dev_tx_queue_release(void *txq) > +lio_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t q_no) > { > - struct lio_instr_queue *tq = txq; > + struct lio_instr_queue *tq = dev->data->tx_queues[q_no]; > uint32_t fw_mapped_iq_no; > > > diff --git a/drivers/net/liquidio/lio_ethdev.h b/drivers/net/liquidio/lio_ethdev.h > index d33be1c44dc..ece2b038580 100644 > --- a/drivers/net/liquidio/lio_ethdev.h > +++ b/drivers/net/liquidio/lio_ethdev.h > @@ -172,8 +172,8 @@ struct lio_rss_set { > uint8_t key[LIO_RSS_MAX_KEY_SZ]; > }; > > -void lio_dev_rx_queue_release(void *rxq); > +void lio_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t q_no); > > -void lio_dev_tx_queue_release(void *txq); > +void lio_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t q_no); > > #endif /* _LIO_ETHDEV_H_ */ > diff --git a/drivers/net/liquidio/lio_rxtx.c b/drivers/net/liquidio/lio_rxtx.c > index a067b60e47e..616abec0700 100644 > --- a/drivers/net/liquidio/lio_rxtx.c > +++ b/drivers/net/liquidio/lio_rxtx.c > @@ -1791,7 +1791,7 @@ lio_dev_clear_queues(struct rte_eth_dev *eth_dev) > for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { > txq = eth_dev->data->tx_queues[i]; > if (txq != NULL) { > - lio_dev_tx_queue_release(txq); > + lio_dev_tx_queue_release(eth_dev, i); > eth_dev->data->tx_queues[i] = NULL; > } > } > @@ -1799,7 +1799,7 @@ lio_dev_clear_queues(struct rte_eth_dev *eth_dev) > for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { > rxq = eth_dev->data->rx_queues[i]; > if (rxq != NULL) { > - lio_dev_rx_queue_release(rxq); > + lio_dev_rx_queue_release(eth_dev, i); > eth_dev->data->rx_queues[i] = NULL; > } > } > diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c > index fd9e877c3df..980150293e8 100644 > --- a/drivers/net/memif/rte_eth_memif.c > +++ b/drivers/net/memif/rte_eth_memif.c > @@ -1258,9 +1258,9 @@ memif_dev_close(struct rte_eth_dev *dev) > memif_disconnect(dev); > > for (i = 0; i < dev->data->nb_rx_queues; i++) > - (*dev->dev_ops->rx_queue_release)(dev->data->rx_queues[i]); > + (*dev->dev_ops->rx_queue_release)(dev, i); > for (i = 0; i < dev->data->nb_tx_queues; i++) > - (*dev->dev_ops->tx_queue_release)(dev->data->tx_queues[i]); > + (*dev->dev_ops->tx_queue_release)(dev, i); > > memif_socket_remove_device(dev); > } else { > @@ -1352,9 +1352,20 @@ memif_rx_queue_setup(struct rte_eth_dev *dev, > } > > static void > -memif_queue_release(void *queue) > +memif_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct memif_queue *mq = (struct memif_queue *)queue; > + struct memif_queue *mq = dev->data->rx_queues[qid]; > + > + if (!mq) > + return; > + > + rte_free(mq); > +} > + > +static void > +memif_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > +{ > + struct memif_queue *mq = dev->data->tx_queues[qid]; > > if (!mq) > return; > @@ -1471,8 +1482,8 @@ static const struct eth_dev_ops ops = { > .dev_configure = memif_dev_configure, > .tx_queue_setup = memif_tx_queue_setup, > .rx_queue_setup = memif_rx_queue_setup, > - .rx_queue_release = memif_queue_release, > - .tx_queue_release = memif_queue_release, > + .rx_queue_release = memif_rx_queue_release, > + .tx_queue_release = memif_tx_queue_release, > .rx_queue_intr_enable = memif_rx_queue_intr_enable, > .rx_queue_intr_disable = memif_rx_queue_intr_disable, > .link_update = memif_link_update, > diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c > index 7f9f300c6cb..f7fe831d61a 100644 > --- a/drivers/net/mlx4/mlx4.c > +++ b/drivers/net/mlx4/mlx4.c > @@ -391,9 +391,9 @@ mlx4_dev_close(struct rte_eth_dev *dev) > mlx4_flow_clean(priv); > mlx4_rss_deinit(priv); > for (i = 0; i != dev->data->nb_rx_queues; ++i) > - mlx4_rx_queue_release(dev->data->rx_queues[i]); > + mlx4_rx_queue_release(dev, i); > for (i = 0; i != dev->data->nb_tx_queues; ++i) > - mlx4_tx_queue_release(dev->data->tx_queues[i]); > + mlx4_tx_queue_release(dev, i); > mlx4_proc_priv_uninit(dev); > mlx4_mr_release(dev); > if (priv->pd != NULL) { > diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c > index 978cbb8201e..2b75c07fad7 100644 > --- a/drivers/net/mlx4/mlx4_rxq.c > +++ b/drivers/net/mlx4/mlx4_rxq.c > @@ -826,6 +826,7 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > }, > .socket = socket, > }; > + dev->data->rx_queues[idx] = rxq; > /* Enable scattered packets support for this queue if necessary. */ > MLX4_ASSERT(mb_len >= RTE_PKTMBUF_HEADROOM); > if (dev->data->dev_conf.rxmode.max_rx_pkt_len <= > @@ -896,12 +897,10 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > } > } > DEBUG("%p: adding Rx queue %p to list", (void *)dev, (void *)rxq); > - dev->data->rx_queues[idx] = rxq; > return 0; > error: > - dev->data->rx_queues[idx] = NULL; > ret = rte_errno; > - mlx4_rx_queue_release(rxq); > + mlx4_rx_queue_release(dev, idx); > rte_errno = ret; > MLX4_ASSERT(rte_errno > 0); > return -rte_errno; > @@ -910,26 +909,20 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > /** > * DPDK callback to release a Rx queue. > * > - * @param dpdk_rxq > - * Generic Rx queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param idx > + * Receive queue index. > */ > void > -mlx4_rx_queue_release(void *dpdk_rxq) > +mlx4_rx_queue_release(struct rte_eth_dev *dev, uint16_t idx) > { > - struct rxq *rxq = (struct rxq *)dpdk_rxq; > - struct mlx4_priv *priv; > - unsigned int i; > + struct rxq *rxq = dev->data->rx_queues[idx]; > > if (rxq == NULL) > return; > - priv = rxq->priv; > - for (i = 0; i != ETH_DEV(priv)->data->nb_rx_queues; ++i) > - if (ETH_DEV(priv)->data->rx_queues[i] == rxq) { > - DEBUG("%p: removing Rx queue %p from list", > - (void *)ETH_DEV(priv), (void *)rxq); > - ETH_DEV(priv)->data->rx_queues[i] = NULL; > - break; > - } > + dev->data->rx_queues[idx] = NULL; > + DEBUG("%p: removing Rx queue %hu from list", (void *)dev, idx); > MLX4_ASSERT(!rxq->cq); > MLX4_ASSERT(!rxq->wq); > MLX4_ASSERT(!rxq->wqes); > diff --git a/drivers/net/mlx4/mlx4_rxtx.h b/drivers/net/mlx4/mlx4_rxtx.h > index c838afc242c..83e9534cd0a 100644 > --- a/drivers/net/mlx4/mlx4_rxtx.h > +++ b/drivers/net/mlx4/mlx4_rxtx.h > @@ -141,7 +141,7 @@ int mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, > uint16_t desc, unsigned int socket, > const struct rte_eth_rxconf *conf, > struct rte_mempool *mp); > -void mlx4_rx_queue_release(void *dpdk_rxq); > +void mlx4_rx_queue_release(struct rte_eth_dev *dev, uint16_t idx); > > /* mlx4_rxtx.c */ > > @@ -162,7 +162,7 @@ uint64_t mlx4_get_tx_port_offloads(struct mlx4_priv *priv); > int mlx4_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, > uint16_t desc, unsigned int socket, > const struct rte_eth_txconf *conf); > -void mlx4_tx_queue_release(void *dpdk_txq); > +void mlx4_tx_queue_release(struct rte_eth_dev *dev, uint16_t idx); > > /* mlx4_mr.c */ > > diff --git a/drivers/net/mlx4/mlx4_txq.c b/drivers/net/mlx4/mlx4_txq.c > index 2df26842fbe..7d8c4f2a222 100644 > --- a/drivers/net/mlx4/mlx4_txq.c > +++ b/drivers/net/mlx4/mlx4_txq.c > @@ -404,6 +404,7 @@ mlx4_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > .lb = !!priv->vf, > .bounce_buf = bounce_buf, > }; > + dev->data->tx_queues[idx] = txq; > priv->verbs_alloc_ctx.type = MLX4_VERBS_ALLOC_TYPE_TX_QUEUE; > priv->verbs_alloc_ctx.obj = txq; > txq->cq = mlx4_glue->create_cq(priv->ctx, desc, NULL, NULL, 0); > @@ -507,13 +508,11 @@ mlx4_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > /* Save pointer of global generation number to check memory event. */ > txq->mr_ctrl.dev_gen_ptr = &priv->mr.dev_gen; > DEBUG("%p: adding Tx queue %p to list", (void *)dev, (void *)txq); > - dev->data->tx_queues[idx] = txq; > priv->verbs_alloc_ctx.type = MLX4_VERBS_ALLOC_TYPE_NONE; > return 0; > error: > - dev->data->tx_queues[idx] = NULL; > ret = rte_errno; > - mlx4_tx_queue_release(txq); > + mlx4_tx_queue_release(dev, idx); > rte_errno = ret; > MLX4_ASSERT(rte_errno > 0); > priv->verbs_alloc_ctx.type = MLX4_VERBS_ALLOC_TYPE_NONE; > @@ -523,26 +522,20 @@ mlx4_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > /** > * DPDK callback to release a Tx queue. > * > - * @param dpdk_txq > - * Generic Tx queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param idx > + * Transmit queue index. > */ > void > -mlx4_tx_queue_release(void *dpdk_txq) > +mlx4_tx_queue_release(struct rte_eth_dev *dev, uint16_t idx) > { > - struct txq *txq = (struct txq *)dpdk_txq; > - struct mlx4_priv *priv; > - unsigned int i; > + struct txq *txq = dev->data->tx_queues[idx]; > > if (txq == NULL) > return; > - priv = txq->priv; > - for (i = 0; i != ETH_DEV(priv)->data->nb_tx_queues; ++i) > - if (ETH_DEV(priv)->data->tx_queues[i] == txq) { > - DEBUG("%p: removing Tx queue %p from list", > - (void *)ETH_DEV(priv), (void *)txq); > - ETH_DEV(priv)->data->tx_queues[i] = NULL; > - break; > - } > + DEBUG("%p: removing Tx queue %hu from list", (void *)dev, idx); > + dev->data->tx_queues[idx] = NULL; > mlx4_txq_free_elts(txq); > if (txq->qp) > claim_zero(mlx4_glue->destroy_qp(txq->qp)); > diff --git a/drivers/net/mlx5/mlx5_rx.h b/drivers/net/mlx5/mlx5_rx.h > index 3f2b99fb65f..2b7ad3e48b3 100644 > --- a/drivers/net/mlx5/mlx5_rx.h > +++ b/drivers/net/mlx5/mlx5_rx.h > @@ -191,7 +191,7 @@ int mlx5_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > int mlx5_rx_hairpin_queue_setup > (struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > const struct rte_eth_hairpin_conf *hairpin_conf); > -void mlx5_rx_queue_release(void *dpdk_rxq); > +void mlx5_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > int mlx5_rx_intr_vec_enable(struct rte_eth_dev *dev); > void mlx5_rx_intr_vec_disable(struct rte_eth_dev *dev); > int mlx5_rx_intr_enable(struct rte_eth_dev *dev, uint16_t rx_queue_id); > diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c > index abd8ce79898..b68443bed50 100644 > --- a/drivers/net/mlx5/mlx5_rxq.c > +++ b/drivers/net/mlx5/mlx5_rxq.c > @@ -794,25 +794,22 @@ mlx5_rx_hairpin_queue_setup(struct rte_eth_dev *dev, uint16_t idx, > /** > * DPDK callback to release a RX queue. > * > - * @param dpdk_rxq > - * Generic RX queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param qid > + * Receive queue index. > */ > void > -mlx5_rx_queue_release(void *dpdk_rxq) > +mlx5_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct mlx5_rxq_data *rxq = (struct mlx5_rxq_data *)dpdk_rxq; > - struct mlx5_rxq_ctrl *rxq_ctrl; > - struct mlx5_priv *priv; > + struct mlx5_rxq_data *rxq = dev->data->rx_queues[qid]; > > if (rxq == NULL) > return; > - rxq_ctrl = container_of(rxq, struct mlx5_rxq_ctrl, rxq); > - priv = rxq_ctrl->priv; > - if (!mlx5_rxq_releasable(ETH_DEV(priv), rxq_ctrl->rxq.idx)) > + if (!mlx5_rxq_releasable(dev, qid)) > rte_panic("port %u Rx queue %u is still used by a flow and" > - " cannot be removed\n", > - PORT_ID(priv), rxq->idx); > - mlx5_rxq_release(ETH_DEV(priv), rxq_ctrl->rxq.idx); > + " cannot be removed\n", dev->data->port_id, qid); > + mlx5_rxq_release(dev, qid); > } > > /** > diff --git a/drivers/net/mlx5/mlx5_tx.h b/drivers/net/mlx5/mlx5_tx.h > index 1a359193715..73364ed2690 100644 > --- a/drivers/net/mlx5/mlx5_tx.h > +++ b/drivers/net/mlx5/mlx5_tx.h > @@ -204,7 +204,7 @@ int mlx5_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > int mlx5_tx_hairpin_queue_setup > (struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > const struct rte_eth_hairpin_conf *hairpin_conf); > -void mlx5_tx_queue_release(void *dpdk_txq); > +void mlx5_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > void txq_uar_init(struct mlx5_txq_ctrl *txq_ctrl); > int mlx5_tx_uar_init_secondary(struct rte_eth_dev *dev, int fd); > void mlx5_tx_uar_uninit_secondary(struct rte_eth_dev *dev); > diff --git a/drivers/net/mlx5/mlx5_txq.c b/drivers/net/mlx5/mlx5_txq.c > index eb4d34ca559..92fbdab5689 100644 > --- a/drivers/net/mlx5/mlx5_txq.c > +++ b/drivers/net/mlx5/mlx5_txq.c > @@ -470,28 +470,21 @@ mlx5_tx_hairpin_queue_setup(struct rte_eth_dev *dev, uint16_t idx, > /** > * DPDK callback to release a TX queue. > * > - * @param dpdk_txq > - * Generic TX queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param qid > + * Transmit queue index. > */ > void > -mlx5_tx_queue_release(void *dpdk_txq) > +mlx5_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct mlx5_txq_data *txq = (struct mlx5_txq_data *)dpdk_txq; > - struct mlx5_txq_ctrl *txq_ctrl; > - struct mlx5_priv *priv; > - unsigned int i; > + struct mlx5_txq_data *txq = dev->data->tx_queues[qid]; > > if (txq == NULL) > return; > - txq_ctrl = container_of(txq, struct mlx5_txq_ctrl, txq); > - priv = txq_ctrl->priv; > - for (i = 0; (i != priv->txqs_n); ++i) > - if ((*priv->txqs)[i] == txq) { > - DRV_LOG(DEBUG, "port %u removing Tx queue %u from list", > - PORT_ID(priv), txq->idx); > - mlx5_txq_release(ETH_DEV(priv), i); > - break; > - } > + DRV_LOG(DEBUG, "port %u removing Tx queue %u from list", > + dev->data->port_id, qid); > + mlx5_txq_release(dev, qid); > } > > /** > diff --git a/drivers/net/mvneta/mvneta_ethdev.c b/drivers/net/mvneta/mvneta_ethdev.c > index a3ee1502046..f51bc2258fe 100644 > --- a/drivers/net/mvneta/mvneta_ethdev.c > +++ b/drivers/net/mvneta/mvneta_ethdev.c > @@ -446,12 +446,12 @@ mvneta_dev_close(struct rte_eth_dev *dev) > ret = mvneta_dev_stop(dev); > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - mvneta_rx_queue_release(dev->data->rx_queues[i]); > + mvneta_rx_queue_release(dev, i); > dev->data->rx_queues[i] = NULL; > } > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - mvneta_tx_queue_release(dev->data->tx_queues[i]); > + mvneta_tx_queue_release(dev, i); > dev->data->tx_queues[i] = NULL; > } > > diff --git a/drivers/net/mvneta/mvneta_rxtx.c b/drivers/net/mvneta/mvneta_rxtx.c > index dfa7ecc0903..2d61930382c 100644 > --- a/drivers/net/mvneta/mvneta_rxtx.c > +++ b/drivers/net/mvneta/mvneta_rxtx.c > @@ -796,13 +796,15 @@ mvneta_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > /** > * DPDK callback to release the transmit queue. > * > - * @param txq > - * Generic transmit queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param qid > + * Transmit queue index. > */ > void > -mvneta_tx_queue_release(void *txq) > +mvneta_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct mvneta_txq *q = txq; > + struct mvneta_txq *q = dev->data->tx_queues[qid]; > > if (!q) > return; > @@ -959,13 +961,15 @@ mvneta_flush_queues(struct rte_eth_dev *dev) > /** > * DPDK callback to release the receive queue. > * > - * @param rxq > - * Generic receive queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param qid > + * Receive queue index. > */ > void > -mvneta_rx_queue_release(void *rxq) > +mvneta_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct mvneta_rxq *q = rxq; > + struct mvneta_rxq *q = dev->data->rx_queues[qid]; > > if (!q) > return; > @@ -978,7 +982,7 @@ mvneta_rx_queue_release(void *rxq) > if (q->priv->ppio) > mvneta_rx_queue_flush(q); > > - rte_free(rxq); > + rte_free(q); > } > > /** > diff --git a/drivers/net/mvneta/mvneta_rxtx.h b/drivers/net/mvneta/mvneta_rxtx.h > index cc291901772..41b7539a577 100644 > --- a/drivers/net/mvneta/mvneta_rxtx.h > +++ b/drivers/net/mvneta/mvneta_rxtx.h > @@ -32,7 +32,7 @@ int > mvneta_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > unsigned int socket, const struct rte_eth_txconf *conf); > > -void mvneta_rx_queue_release(void *rxq); > -void mvneta_tx_queue_release(void *txq); > +void mvneta_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > +void mvneta_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > #endif /* _MVNETA_RXTX_H_ */ > diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c > index 078aefbb8da..65d011300a9 100644 > --- a/drivers/net/mvpp2/mrvl_ethdev.c > +++ b/drivers/net/mvpp2/mrvl_ethdev.c > @@ -2059,13 +2059,15 @@ mrvl_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > /** > * DPDK callback to release the receive queue. > * > - * @param rxq > - * Generic receive queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param qid > + * Receive queue index. > */ > static void > -mrvl_rx_queue_release(void *rxq) > +mrvl_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct mrvl_rxq *q = rxq; > + struct mrvl_rxq *q = dev->data->rx_queues[qid]; > struct pp2_ppio_tc_params *tc_params; > int i, num, tc, inq; > struct pp2_hif *hif; > @@ -2146,13 +2148,15 @@ mrvl_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, > /** > * DPDK callback to release the transmit queue. > * > - * @param txq > - * Generic transmit queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param qid > + * Transmit queue index. > */ > static void > -mrvl_tx_queue_release(void *txq) > +mrvl_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct mrvl_txq *q = txq; > + struct mrvl_txq *q = dev->data->tx_queues[qid]; > > if (!q) > return; > diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c > index c6bf7cc1323..e880dc2bb2a 100644 > --- a/drivers/net/netvsc/hn_rxtx.c > +++ b/drivers/net/netvsc/hn_rxtx.c > @@ -356,9 +356,9 @@ static void hn_txd_put(struct hn_tx_queue *txq, struct hn_txdesc *txd) > } > > void > -hn_dev_tx_queue_release(void *arg) > +hn_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct hn_tx_queue *txq = arg; > + struct hn_tx_queue *txq = dev->data->tx_queues[qid]; > > PMD_INIT_FUNC_TRACE(); > > @@ -1004,9 +1004,9 @@ hn_rx_queue_free(struct hn_rx_queue *rxq, bool keep_primary) > } > > void > -hn_dev_rx_queue_release(void *arg) > +hn_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct hn_rx_queue *rxq = arg; > + struct hn_rx_queue *rxq = dev->data->rx_queues[qid]; > > PMD_INIT_FUNC_TRACE(); > > @@ -1648,7 +1648,7 @@ hn_dev_free_queues(struct rte_eth_dev *dev) > dev->data->nb_rx_queues = 0; > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - hn_dev_tx_queue_release(dev->data->tx_queues[i]); > + hn_dev_tx_queue_release(dev, i); > dev->data->tx_queues[i] = NULL; > } > dev->data->nb_tx_queues = 0; > diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h > index 43642408bc9..2cd1f8a8818 100644 > --- a/drivers/net/netvsc/hn_var.h > +++ b/drivers/net/netvsc/hn_var.h > @@ -198,7 +198,7 @@ int hn_dev_link_update(struct rte_eth_dev *dev, int wait); > int hn_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, > uint16_t nb_desc, unsigned int socket_id, > const struct rte_eth_txconf *tx_conf); > -void hn_dev_tx_queue_release(void *arg); > +void hn_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > void hn_dev_tx_queue_info(struct rte_eth_dev *dev, uint16_t queue_idx, > struct rte_eth_txq_info *qinfo); > int hn_dev_tx_done_cleanup(void *arg, uint32_t free_cnt); > @@ -214,7 +214,7 @@ int hn_dev_rx_queue_setup(struct rte_eth_dev *dev, > struct rte_mempool *mp); > void hn_dev_rx_queue_info(struct rte_eth_dev *dev, uint16_t queue_id, > struct rte_eth_rxq_info *qinfo); > -void hn_dev_rx_queue_release(void *arg); > +void hn_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > uint32_t hn_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t queue_id); > int hn_dev_rx_queue_status(void *rxq, uint16_t offset); > void hn_dev_free_queues(struct rte_eth_dev *dev); > diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c > index 75192e63197..fead8eba5de 100644 > --- a/drivers/net/netvsc/hn_vf.c > +++ b/drivers/net/netvsc/hn_vf.c > @@ -624,11 +624,8 @@ void hn_vf_tx_queue_release(struct hn_data *hv, uint16_t queue_id) > > rte_rwlock_read_lock(&hv->vf_lock); > vf_dev = hn_get_vf_dev(hv); > - if (vf_dev && vf_dev->dev_ops->tx_queue_release) { > - void *subq = vf_dev->data->tx_queues[queue_id]; > - > - (*vf_dev->dev_ops->tx_queue_release)(subq); > - } > + if (vf_dev && vf_dev->dev_ops->tx_queue_release) > + (*vf_dev->dev_ops->tx_queue_release)(vf_dev, queue_id); > > rte_rwlock_read_unlock(&hv->vf_lock); > } > @@ -659,11 +656,8 @@ void hn_vf_rx_queue_release(struct hn_data *hv, uint16_t queue_id) > > rte_rwlock_read_lock(&hv->vf_lock); > vf_dev = hn_get_vf_dev(hv); > - if (vf_dev && vf_dev->dev_ops->rx_queue_release) { > - void *subq = vf_dev->data->rx_queues[queue_id]; > - > - (*vf_dev->dev_ops->rx_queue_release)(subq); > - } > + if (vf_dev && vf_dev->dev_ops->rx_queue_release) > + (*vf_dev->dev_ops->rx_queue_release)(vf_dev, queue_id); > rte_rwlock_read_unlock(&hv->vf_lock); > } > > diff --git a/drivers/net/nfb/nfb_ethdev.c b/drivers/net/nfb/nfb_ethdev.c > index 7e91d598474..99d93ebf466 100644 > --- a/drivers/net/nfb/nfb_ethdev.c > +++ b/drivers/net/nfb/nfb_ethdev.c > @@ -231,12 +231,12 @@ nfb_eth_dev_close(struct rte_eth_dev *dev) > nfb_nc_txmac_deinit(internals->txmac, internals->max_txmac); > > for (i = 0; i < nb_rx; i++) { > - nfb_eth_rx_queue_release(dev->data->rx_queues[i]); > + nfb_eth_rx_queue_release(dev, i); > dev->data->rx_queues[i] = NULL; > } > dev->data->nb_rx_queues = 0; > for (i = 0; i < nb_tx; i++) { > - nfb_eth_tx_queue_release(dev->data->tx_queues[i]); > + nfb_eth_tx_queue_release(dev, i); > dev->data->tx_queues[i] = NULL; > } > dev->data->nb_tx_queues = 0; > diff --git a/drivers/net/nfb/nfb_rx.c b/drivers/net/nfb/nfb_rx.c > index d6d4ba9663c..3ebb332ae46 100644 > --- a/drivers/net/nfb/nfb_rx.c > +++ b/drivers/net/nfb/nfb_rx.c > @@ -176,9 +176,10 @@ nfb_eth_rx_queue_init(struct nfb_device *nfb, > } > > void > -nfb_eth_rx_queue_release(void *q) > +nfb_eth_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct ndp_rx_queue *rxq = (struct ndp_rx_queue *)q; > + struct ndp_rx_queue *rxq = dev->data->rx_queues[qid]; > + > if (rxq->queue != NULL) { > ndp_close_rx_queue(rxq->queue); > rte_free(rxq); > diff --git a/drivers/net/nfb/nfb_rx.h b/drivers/net/nfb/nfb_rx.h > index c9708259af1..638205d53c7 100644 > --- a/drivers/net/nfb/nfb_rx.h > +++ b/drivers/net/nfb/nfb_rx.h > @@ -94,11 +94,13 @@ nfb_eth_rx_queue_setup(struct rte_eth_dev *dev, > /** > * DPDK callback to release a RX queue. > * > - * @param dpdk_rxq > - * Generic RX queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param qid > + * Receive queue index. > */ > void > -nfb_eth_rx_queue_release(void *q); > +nfb_eth_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > /** > * Start traffic on Rx queue. > diff --git a/drivers/net/nfb/nfb_tx.c b/drivers/net/nfb/nfb_tx.c > index 9b912feb1de..d49fc324e76 100644 > --- a/drivers/net/nfb/nfb_tx.c > +++ b/drivers/net/nfb/nfb_tx.c > @@ -102,9 +102,10 @@ nfb_eth_tx_queue_init(struct nfb_device *nfb, > } > > void > -nfb_eth_tx_queue_release(void *q) > +nfb_eth_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct ndp_tx_queue *txq = (struct ndp_tx_queue *)q; > + struct ndp_tx_queue *txq = dev->data->tx_queues[qid]; > + > if (txq->queue != NULL) { > ndp_close_tx_queue(txq->queue); > rte_free(txq); > diff --git a/drivers/net/nfb/nfb_tx.h b/drivers/net/nfb/nfb_tx.h > index 28daeae0b8e..d3cbe3e6b3f 100644 > --- a/drivers/net/nfb/nfb_tx.h > +++ b/drivers/net/nfb/nfb_tx.h > @@ -70,11 +70,13 @@ nfb_eth_tx_queue_init(struct nfb_device *nfb, > /** > * DPDK callback to release a RX queue. > * > - * @param dpdk_rxq > - * Generic RX queue pointer. > + * @param dev > + * Pointer to Ethernet device structure. > + * @param qid > + * Receive queue index. > */ > void > -nfb_eth_tx_queue_release(void *q); > +nfb_eth_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > /** > * Start traffic on Tx queue. > diff --git a/drivers/net/nfp/nfp_rxtx.c b/drivers/net/nfp/nfp_rxtx.c > index 1402c5f84a0..feeacb56147 100644 > --- a/drivers/net/nfp/nfp_rxtx.c > +++ b/drivers/net/nfp/nfp_rxtx.c > @@ -464,9 +464,9 @@ nfp_net_rx_queue_release_mbufs(struct nfp_net_rxq *rxq) > } > > void > -nfp_net_rx_queue_release(void *rx_queue) > +nfp_net_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx) > { > - struct nfp_net_rxq *rxq = rx_queue; > + struct nfp_net_rxq *rxq = dev->data->rx_queues[queue_idx]; > > if (rxq) { > nfp_net_rx_queue_release_mbufs(rxq); > @@ -513,7 +513,7 @@ nfp_net_rx_queue_setup(struct rte_eth_dev *dev, > * calling nfp_net_stop > */ > if (dev->data->rx_queues[queue_idx]) { > - nfp_net_rx_queue_release(dev->data->rx_queues[queue_idx]); > + nfp_net_rx_queue_release(dev, queue_idx); > dev->data->rx_queues[queue_idx] = NULL; > } > > @@ -523,6 +523,8 @@ nfp_net_rx_queue_setup(struct rte_eth_dev *dev, > if (rxq == NULL) > return -ENOMEM; > > + dev->data->rx_queues[queue_idx] = rxq; > + > /* Hw queues mapping based on firmware configuration */ > rxq->qidx = queue_idx; > rxq->fl_qcidx = queue_idx * hw->stride_rx; > @@ -556,7 +558,8 @@ nfp_net_rx_queue_setup(struct rte_eth_dev *dev, > > if (tz == NULL) { > PMD_DRV_LOG(ERR, "Error allocating rx dma"); > - nfp_net_rx_queue_release(rxq); > + nfp_net_rx_queue_release(dev, queue_idx); > + dev->data->rx_queues[queue_idx] = NULL; > return -ENOMEM; > } > > @@ -569,7 +572,8 @@ nfp_net_rx_queue_setup(struct rte_eth_dev *dev, > sizeof(*rxq->rxbufs) * nb_desc, > RTE_CACHE_LINE_SIZE, socket_id); > if (rxq->rxbufs == NULL) { > - nfp_net_rx_queue_release(rxq); > + nfp_net_rx_queue_release(dev, queue_idx); > + dev->data->rx_queues[queue_idx] = NULL; > return -ENOMEM; > } > > @@ -578,7 +582,6 @@ nfp_net_rx_queue_setup(struct rte_eth_dev *dev, > > nfp_net_reset_rx_queue(rxq); > > - dev->data->rx_queues[queue_idx] = rxq; > rxq->hw = hw; > > /* > @@ -651,9 +654,9 @@ nfp_net_tx_queue_release_mbufs(struct nfp_net_txq *txq) > } > > void > -nfp_net_tx_queue_release(void *tx_queue) > +nfp_net_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx) > { > - struct nfp_net_txq *txq = tx_queue; > + struct nfp_net_txq *txq = dev->data->tx_queues[queue_idx]; > > if (txq) { > nfp_net_tx_queue_release_mbufs(txq); > @@ -714,7 +717,7 @@ nfp_net_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, > if (dev->data->tx_queues[queue_idx]) { > PMD_TX_LOG(DEBUG, "Freeing memory prior to re-allocation %d", > queue_idx); > - nfp_net_tx_queue_release(dev->data->tx_queues[queue_idx]); > + nfp_net_tx_queue_release(dev, queue_idx); > dev->data->tx_queues[queue_idx] = NULL; > } > > @@ -726,6 +729,8 @@ nfp_net_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, > return -ENOMEM; > } > > + dev->data->tx_queues[queue_idx] = txq; > + > /* > * Allocate TX ring hardware descriptors. A memzone large enough to > * handle the maximum ring size is allocated in order to allow for > @@ -737,7 +742,8 @@ nfp_net_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, > socket_id); > if (tz == NULL) { > PMD_DRV_LOG(ERR, "Error allocating tx dma"); > - nfp_net_tx_queue_release(txq); > + nfp_net_tx_queue_release(dev, queue_idx); > + dev->data->tx_queues[queue_idx] = NULL; > return -ENOMEM; > } > > @@ -763,7 +769,8 @@ nfp_net_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, > sizeof(*txq->txbufs) * nb_desc, > RTE_CACHE_LINE_SIZE, socket_id); > if (txq->txbufs == NULL) { > - nfp_net_tx_queue_release(txq); > + nfp_net_tx_queue_release(dev, queue_idx); > + dev->data->tx_queues[queue_idx] = NULL; > return -ENOMEM; > } > PMD_TX_LOG(DEBUG, "txbufs=%p hw_ring=%p dma_addr=0x%" PRIx64, > @@ -771,7 +778,6 @@ nfp_net_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, > > nfp_net_reset_tx_queue(txq); > > - dev->data->tx_queues[queue_idx] = txq; > txq->hw = hw; > > /* > diff --git a/drivers/net/nfp/nfp_rxtx.h b/drivers/net/nfp/nfp_rxtx.h > index b0a8bf81b0f..ab49898605d 100644 > --- a/drivers/net/nfp/nfp_rxtx.h > +++ b/drivers/net/nfp/nfp_rxtx.h > @@ -279,13 +279,13 @@ uint32_t nfp_net_rx_queue_count(struct rte_eth_dev *dev, > uint16_t queue_idx); > uint16_t nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, > uint16_t nb_pkts); > -void nfp_net_rx_queue_release(void *rxq); > +void nfp_net_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx); > void nfp_net_reset_rx_queue(struct nfp_net_rxq *rxq); > int nfp_net_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, > uint16_t nb_desc, unsigned int socket_id, > const struct rte_eth_rxconf *rx_conf, > struct rte_mempool *mp); > -void nfp_net_tx_queue_release(void *txq); > +void nfp_net_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_idx); > void nfp_net_reset_tx_queue(struct nfp_net_txq *txq); > int nfp_net_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, > uint16_t nb_desc, unsigned int socket_id, > diff --git a/drivers/net/ngbe/ngbe_ethdev.h b/drivers/net/ngbe/ngbe_ethdev.h > index 7fb72f3f1f8..c039e7dcc30 100644 > --- a/drivers/net/ngbe/ngbe_ethdev.h > +++ b/drivers/net/ngbe/ngbe_ethdev.h > @@ -69,9 +69,9 @@ void ngbe_dev_clear_queues(struct rte_eth_dev *dev); > > void ngbe_dev_free_queues(struct rte_eth_dev *dev); > > -void ngbe_dev_rx_queue_release(void *rxq); > +void ngbe_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > -void ngbe_dev_tx_queue_release(void *txq); > +void ngbe_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > int ngbe_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id, > uint16_t nb_rx_desc, unsigned int socket_id, > diff --git a/drivers/net/ngbe/ngbe_rxtx.c b/drivers/net/ngbe/ngbe_rxtx.c > index 5c06e0d5508..d508015bd26 100644 > --- a/drivers/net/ngbe/ngbe_rxtx.c > +++ b/drivers/net/ngbe/ngbe_rxtx.c > @@ -453,9 +453,9 @@ ngbe_tx_queue_release(struct ngbe_tx_queue *txq) > } > > void > -ngbe_dev_tx_queue_release(void *txq) > +ngbe_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - ngbe_tx_queue_release(txq); > + ngbe_tx_queue_release(dev->data->tx_queues[qid]); > } > > /* (Re)set dynamic ngbe_tx_queue fields to defaults */ > @@ -673,9 +673,9 @@ ngbe_rx_queue_release(struct ngbe_rx_queue *rxq) > } > > void > -ngbe_dev_rx_queue_release(void *rxq) > +ngbe_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - ngbe_rx_queue_release(rxq); > + ngbe_rx_queue_release(dev->data->rx_queues[qid]); > } > > /* > @@ -916,13 +916,13 @@ ngbe_dev_free_queues(struct rte_eth_dev *dev) > PMD_INIT_FUNC_TRACE(); > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - ngbe_dev_rx_queue_release(dev->data->rx_queues[i]); > + ngbe_dev_rx_queue_release(dev, i); > dev->data->rx_queues[i] = NULL; > } > dev->data->nb_rx_queues = 0; > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - ngbe_dev_tx_queue_release(dev->data->tx_queues[i]); > + ngbe_dev_tx_queue_release(dev, i); > dev->data->tx_queues[i] = NULL; > } > dev->data->nb_tx_queues = 0; > diff --git a/drivers/net/null/rte_eth_null.c b/drivers/net/null/rte_eth_null.c > index 508bafc12a1..25b9e5b1ce1 100644 > --- a/drivers/net/null/rte_eth_null.c > +++ b/drivers/net/null/rte_eth_null.c > @@ -353,14 +353,24 @@ eth_stats_reset(struct rte_eth_dev *dev) > } > > static void > -eth_queue_release(void *q) > +eth_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct null_queue *nq; > + struct null_queue *nq = dev->data->rx_queues[qid]; > > - if (q == NULL) > + if (nq == NULL) > + return; > + > + rte_free(nq->dummy_packet); > +} > + > +static void > +eth_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > +{ > + struct null_queue *nq = dev->data->tx_queues[qid]; > + > + if (nq == NULL) > return; > > - nq = q; > rte_free(nq->dummy_packet); > } > > @@ -483,8 +493,8 @@ static const struct eth_dev_ops ops = { > .dev_infos_get = eth_dev_info, > .rx_queue_setup = eth_rx_queue_setup, > .tx_queue_setup = eth_tx_queue_setup, > - .rx_queue_release = eth_queue_release, > - .tx_queue_release = eth_queue_release, > + .rx_queue_release = eth_rx_queue_release, > + .tx_queue_release = eth_tx_queue_release, > .mtu_set = eth_mtu_set, > .link_update = eth_link_update, > .mac_addr_set = eth_mac_address_set, > diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c > index 9f4c0503b4d..7c91494f0e2 100644 > --- a/drivers/net/octeontx/octeontx_ethdev.c > +++ b/drivers/net/octeontx/octeontx_ethdev.c > @@ -971,20 +971,18 @@ octeontx_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx) > } > > static void > -octeontx_dev_tx_queue_release(void *tx_queue) > +octeontx_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct octeontx_txq *txq = tx_queue; > int res; > > PMD_INIT_FUNC_TRACE(); > > - if (txq) { > - res = octeontx_dev_tx_queue_stop(txq->eth_dev, txq->queue_id); > + if (dev->data->tx_queues[qid]) { > + res = octeontx_dev_tx_queue_stop(dev, qid); > if (res < 0) > - octeontx_log_err("failed stop tx_queue(%d)\n", > - txq->queue_id); > + octeontx_log_err("failed stop tx_queue(%d)\n", qid); > > - rte_free(txq); > + rte_free(dev->data->tx_queues[qid]); > } > } > > @@ -1013,7 +1011,7 @@ octeontx_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx, > if (dev->data->tx_queues[qidx] != NULL) { > PMD_TX_LOG(DEBUG, "freeing memory prior to re-allocation %d", > qidx); > - octeontx_dev_tx_queue_release(dev->data->tx_queues[qidx]); > + octeontx_dev_tx_queue_release(dev, qidx); > dev->data->tx_queues[qidx] = NULL; > } > > @@ -1221,9 +1219,9 @@ octeontx_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx, > } > > static void > -octeontx_dev_rx_queue_release(void *rxq) > +octeontx_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - rte_free(rxq); > + rte_free(dev->data->rx_queues[qid]); > } > > static const uint32_t * > diff --git a/drivers/net/octeontx2/otx2_ethdev.c b/drivers/net/octeontx2/otx2_ethdev.c > index 75d4cabf2e7..d576bc69892 100644 > --- a/drivers/net/octeontx2/otx2_ethdev.c > +++ b/drivers/net/octeontx2/otx2_ethdev.c > @@ -555,16 +555,17 @@ otx2_nix_rxq_mbuf_setup(struct otx2_eth_dev *dev, uint16_t port_id) > } > > static void > -otx2_nix_rx_queue_release(void *rx_queue) > +otx2_nix_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct otx2_eth_rxq *rxq = rx_queue; > + struct otx2_eth_rxq *rxq = dev->data->rx_queues[qid]; > > if (!rxq) > return; > > otx2_nix_dbg("Releasing rxq %u", rxq->rq); > nix_cq_rq_uninit(rxq->eth_dev, rxq); > - rte_free(rx_queue); > + rte_free(rxq); > + dev->data->rx_queues[qid] = NULL; > } > > static int > @@ -608,9 +609,8 @@ otx2_nix_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t rq, > /* Free memory prior to re-allocation if needed */ > if (eth_dev->data->rx_queues[rq] != NULL) { > otx2_nix_dbg("Freeing memory prior to re-allocation %d", rq); > - otx2_nix_rx_queue_release(eth_dev->data->rx_queues[rq]); > + otx2_nix_rx_queue_release(eth_dev, rq); > rte_eth_dma_zone_free(eth_dev, "cq", rq); > - eth_dev->data->rx_queues[rq] = NULL; > } > > offloads = rx_conf->offloads | eth_dev->data->dev_conf.rxmode.offloads; > @@ -641,6 +641,8 @@ otx2_nix_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t rq, > rxq->lookup_mem = otx2_nix_fastpath_lookup_mem_get(); > rxq->tstamp = &dev->tstamp; > > + eth_dev->data->rx_queues[rq] = rxq; > + > /* Alloc completion queue */ > rc = nix_cq_rq_init(eth_dev, dev, rq, rxq, mp); > if (rc) { > @@ -657,7 +659,6 @@ otx2_nix_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t rq, > otx2_nix_dbg("rq=%d pool=%s qsize=%d nb_desc=%d->%d", > rq, mp->name, qsize, nb_desc, rxq->qlen); > > - eth_dev->data->rx_queues[rq] = rxq; > eth_dev->data->rx_queue_state[rq] = RTE_ETH_QUEUE_STATE_STOPPED; > > /* Calculating delta and freq mult between PTP HI clock and tsc. > @@ -679,7 +680,7 @@ otx2_nix_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t rq, > return 0; > > free_rxq: > - otx2_nix_rx_queue_release(rxq); > + otx2_nix_rx_queue_release(eth_dev, rq); > fail: > return rc; > } > @@ -1217,16 +1218,13 @@ otx2_nix_form_default_desc(struct otx2_eth_txq *txq) > } > > static void > -otx2_nix_tx_queue_release(void *_txq) > +otx2_nix_tx_queue_release(struct rte_eth_dev *eth_dev, uint16_t qid) > { > - struct otx2_eth_txq *txq = _txq; > - struct rte_eth_dev *eth_dev; > + struct otx2_eth_txq *txq = eth_dev->data->tx_queues[qid]; > > if (!txq) > return; > > - eth_dev = txq->dev->eth_dev; > - > otx2_nix_dbg("Releasing txq %u", txq->sq); > > /* Flush and disable tm */ > @@ -1241,6 +1239,7 @@ otx2_nix_tx_queue_release(void *_txq) > } > otx2_nix_sq_flush_post(txq); > rte_free(txq); > + eth_dev->data->tx_queues[qid] = NULL; > } > > > @@ -1268,8 +1267,7 @@ otx2_nix_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t sq, > /* Free memory prior to re-allocation if needed. */ > if (eth_dev->data->tx_queues[sq] != NULL) { > otx2_nix_dbg("Freeing memory prior to re-allocation %d", sq); > - otx2_nix_tx_queue_release(eth_dev->data->tx_queues[sq]); > - eth_dev->data->tx_queues[sq] = NULL; > + otx2_nix_tx_queue_release(eth_dev, sq); > } > > /* Find the expected offloads for this queue */ > @@ -1288,6 +1286,7 @@ otx2_nix_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t sq, > txq->sqb_pool = NULL; > txq->offloads = offloads; > dev->tx_offloads |= offloads; > + eth_dev->data->tx_queues[sq] = txq; > > /* > * Allocate memory for flow control updates from HW. > @@ -1334,12 +1333,11 @@ otx2_nix_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t sq, > " lmt_addr=%p nb_sqb_bufs=%d sqes_per_sqb_log2=%d", sq, > fc->addr, offloads, txq->sqb_pool->pool_id, txq->lmt_addr, > txq->nb_sqb_bufs, txq->sqes_per_sqb_log2); > - eth_dev->data->tx_queues[sq] = txq; > eth_dev->data->tx_queue_state[sq] = RTE_ETH_QUEUE_STATE_STOPPED; > return 0; > > free_txq: > - otx2_nix_tx_queue_release(txq); > + otx2_nix_tx_queue_release(eth_dev, sq); > fail: > return rc; > } > @@ -1378,8 +1376,7 @@ nix_store_queue_cfg_and_then_release(struct rte_eth_dev *eth_dev) > } > memcpy(&tx_qconf[i], &txq[i]->qconf, sizeof(*tx_qconf)); > tx_qconf[i].valid = true; > - otx2_nix_tx_queue_release(txq[i]); > - eth_dev->data->tx_queues[i] = NULL; > + otx2_nix_tx_queue_release(eth_dev, i); > } > > rxq = (struct otx2_eth_rxq **)eth_dev->data->rx_queues; > @@ -1391,8 +1388,7 @@ nix_store_queue_cfg_and_then_release(struct rte_eth_dev *eth_dev) > } > memcpy(&rx_qconf[i], &rxq[i]->qconf, sizeof(*rx_qconf)); > rx_qconf[i].valid = true; > - otx2_nix_rx_queue_release(rxq[i]); > - eth_dev->data->rx_queues[i] = NULL; > + otx2_nix_rx_queue_release(eth_dev, i); > } > > dev->tx_qconf = tx_qconf; > @@ -1412,8 +1408,6 @@ nix_restore_queue_cfg(struct rte_eth_dev *eth_dev) > struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev); > struct otx2_eth_qconf *tx_qconf = dev->tx_qconf; > struct otx2_eth_qconf *rx_qconf = dev->rx_qconf; > - struct otx2_eth_txq **txq; > - struct otx2_eth_rxq **rxq; > int rc, i, nb_rxq, nb_txq; > > nb_rxq = RTE_MIN(dev->configured_nb_rx_qs, eth_dev->data->nb_rx_queues); > @@ -1450,9 +1444,8 @@ nix_restore_queue_cfg(struct rte_eth_dev *eth_dev) > &tx_qconf[i].conf.tx); > if (rc) { > otx2_err("Failed to setup tx queue rc=%d", rc); > - txq = (struct otx2_eth_txq **)eth_dev->data->tx_queues; > for (i -= 1; i >= 0; i--) > - otx2_nix_tx_queue_release(txq[i]); > + otx2_nix_tx_queue_release(eth_dev, i); > goto fail; > } > } > @@ -1468,9 +1461,8 @@ nix_restore_queue_cfg(struct rte_eth_dev *eth_dev) > rx_qconf[i].mempool); > if (rc) { > otx2_err("Failed to setup rx queue rc=%d", rc); > - rxq = (struct otx2_eth_rxq **)eth_dev->data->rx_queues; > for (i -= 1; i >= 0; i--) > - otx2_nix_rx_queue_release(rxq[i]); > + otx2_nix_rx_queue_release(eth_dev, i); > goto release_tx_queues; > } > } > @@ -1480,9 +1472,8 @@ nix_restore_queue_cfg(struct rte_eth_dev *eth_dev) > return 0; > > release_tx_queues: > - txq = (struct otx2_eth_txq **)eth_dev->data->tx_queues; > for (i = 0; i < eth_dev->data->nb_tx_queues; i++) > - otx2_nix_tx_queue_release(txq[i]); > + otx2_nix_tx_queue_release(eth_dev, i); > fail: > if (tx_qconf) > free(tx_qconf); > @@ -2647,17 +2638,13 @@ otx2_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool mbox_close) > dev->ops = NULL; > > /* Free up SQs */ > - for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { > - otx2_nix_tx_queue_release(eth_dev->data->tx_queues[i]); > - eth_dev->data->tx_queues[i] = NULL; > - } > + for (i = 0; i < eth_dev->data->nb_tx_queues; i++) > + otx2_nix_tx_queue_release(eth_dev, i); > eth_dev->data->nb_tx_queues = 0; > > /* Free up RQ's and CQ's */ > - for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { > - otx2_nix_rx_queue_release(eth_dev->data->rx_queues[i]); > - eth_dev->data->rx_queues[i] = NULL; > - } > + for (i = 0; i < eth_dev->data->nb_rx_queues; i++) > + otx2_nix_rx_queue_release(eth_dev, i); > eth_dev->data->nb_rx_queues = 0; > > /* Free tm resources */ > diff --git a/drivers/net/octeontx_ep/otx_ep_ethdev.c b/drivers/net/octeontx_ep/otx_ep_ethdev.c > index a243683d61d..eed0e05a8fc 100644 > --- a/drivers/net/octeontx_ep/otx_ep_ethdev.c > +++ b/drivers/net/octeontx_ep/otx_ep_ethdev.c > @@ -248,16 +248,18 @@ otx_ep_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no, > * Release the receive queue/ringbuffer. Called by > * the upper layers. > * > - * @param rxq > - * Opaque pointer to the receive queue to release > + * @param dev > + * Pointer to Ethernet device structure. > + * @param q_no > + * Receive queue index. > * > * @return > * - nothing > */ > static void > -otx_ep_rx_queue_release(void *rxq) > +otx_ep_rx_queue_release(struct rte_eth_dev *dev, uint16_t q_no) > { > - struct otx_ep_droq *rq = (struct otx_ep_droq *)rxq; > + struct otx_ep_droq *rq = dev->data->rx_queues[q_no]; > struct otx_ep_device *otx_epvf = rq->otx_ep_dev; > int q_id = rq->q_no; > > @@ -321,16 +323,18 @@ otx_ep_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no, > * Release the transmit queue/ringbuffer. Called by > * the upper layers. > * > - * @param txq > - * Opaque pointer to the transmit queue to release > + * @param dev > + * Pointer to Ethernet device structure. > + * @param q_no > + * Transmit queue index. > * > * @return > * - nothing > */ > static void > -otx_ep_tx_queue_release(void *txq) > +otx_ep_tx_queue_release(struct rte_eth_dev *dev, uint16_t q_no) > { > - struct otx_ep_instr_queue *tq = (struct otx_ep_instr_queue *)txq; > + struct otx_ep_instr_queue *tq = dev->data->tx_queues[q_no]; > > otx_ep_delete_iqs(tq->otx_ep_dev, tq->q_no); > } > diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c > index a4304e0eff4..fd8c62a1826 100644 > --- a/drivers/net/qede/qede_ethdev.c > +++ b/drivers/net/qede/qede_ethdev.c > @@ -2396,13 +2396,25 @@ qede_dev_reset(struct rte_eth_dev *dev) > return qede_eth_dev_init(dev); > } > > +static void > +qede_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > +{ > + qede_rx_queue_release(dev->data->rx_queues[qid]); > +} > + > +static void > +qede_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > +{ > + qede_tx_queue_release(dev->data->tx_queues[qid]); > +} > + > static const struct eth_dev_ops qede_eth_dev_ops = { > .dev_configure = qede_dev_configure, > .dev_infos_get = qede_dev_info_get, > .rx_queue_setup = qede_rx_queue_setup, > - .rx_queue_release = qede_rx_queue_release, > + .rx_queue_release = qede_dev_rx_queue_release, > .tx_queue_setup = qede_tx_queue_setup, > - .tx_queue_release = qede_tx_queue_release, > + .tx_queue_release = qede_dev_tx_queue_release, > .dev_start = qede_dev_start, > .dev_reset = qede_dev_reset, > .dev_set_link_up = qede_dev_set_link_up, > @@ -2444,9 +2456,9 @@ static const struct eth_dev_ops qede_eth_vf_dev_ops = { > .dev_configure = qede_dev_configure, > .dev_infos_get = qede_dev_info_get, > .rx_queue_setup = qede_rx_queue_setup, > - .rx_queue_release = qede_rx_queue_release, > + .rx_queue_release = qede_dev_rx_queue_release, > .tx_queue_setup = qede_tx_queue_setup, > - .tx_queue_release = qede_tx_queue_release, > + .tx_queue_release = qede_dev_tx_queue_release, > .dev_start = qede_dev_start, > .dev_reset = qede_dev_reset, > .dev_set_link_up = qede_dev_set_link_up, > diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c > index 2db0d000c3a..2f85925b7b6 100644 > --- a/drivers/net/sfc/sfc_ethdev.c > +++ b/drivers/net/sfc/sfc_ethdev.c > @@ -504,9 +504,9 @@ sfc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t ethdev_qid, > } > > static void > -sfc_rx_queue_release(void *queue) > +sfc_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct sfc_dp_rxq *dp_rxq = queue; > + struct sfc_dp_rxq *dp_rxq = dev->data->rx_queues[qid]; > struct sfc_rxq *rxq; > struct sfc_adapter *sa; > sfc_sw_index_t sw_index; > @@ -561,9 +561,9 @@ sfc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t ethdev_qid, > } > > static void > -sfc_tx_queue_release(void *queue) > +sfc_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct sfc_dp_txq *dp_txq = queue; > + struct sfc_dp_txq *dp_txq = dev->data->tx_queues[qid]; > struct sfc_txq *txq; > sfc_sw_index_t sw_index; > struct sfc_adapter *sa; > diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c > index 7416a6b1b81..76977f3757f 100644 > --- a/drivers/net/szedata2/rte_eth_szedata2.c > +++ b/drivers/net/szedata2/rte_eth_szedata2.c > @@ -1143,26 +1143,28 @@ eth_stats_reset(struct rte_eth_dev *dev) > } > > static void > -eth_rx_queue_release(void *q) > +eth_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct szedata2_rx_queue *rxq = (struct szedata2_rx_queue *)q; > + struct szedata2_rx_queue *rxq = dev->data->rx_queues[qid]; > > if (rxq != NULL) { > if (rxq->sze != NULL) > szedata_close(rxq->sze); > rte_free(rxq); > + dev->data->rx_queues[qid] = NULL; > } > } > > static void > -eth_tx_queue_release(void *q) > +eth_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct szedata2_tx_queue *txq = (struct szedata2_tx_queue *)q; > + struct szedata2_tx_queue *txq = dev->data->tx_queues[qid]; > > if (txq != NULL) { > if (txq->sze != NULL) > szedata_close(txq->sze); > rte_free(txq); > + dev->data->tx_queues[i] = NULL; > } > } > > @@ -1182,15 +1184,11 @@ eth_dev_close(struct rte_eth_dev *dev) > > free(internals->sze_dev_path); > > - for (i = 0; i < nb_rx; i++) { > - eth_rx_queue_release(dev->data->rx_queues[i]); > - dev->data->rx_queues[i] = NULL; > - } > + for (i = 0; i < nb_rx; i++) > + eth_rx_queue_release(dev, i); > dev->data->nb_rx_queues = 0; > - for (i = 0; i < nb_tx; i++) { > - eth_tx_queue_release(dev->data->tx_queues[i]); > - dev->data->tx_queues[i] = NULL; > - } > + for (i = 0; i < nb_tx; i++) > + eth_tx_queue_release(dev, i); > dev->data->nb_tx_queues = 0; > > return ret; > @@ -1244,10 +1242,8 @@ eth_rx_queue_setup(struct rte_eth_dev *dev, > > PMD_INIT_FUNC_TRACE(); > > - if (dev->data->rx_queues[rx_queue_id] != NULL) { > - eth_rx_queue_release(dev->data->rx_queues[rx_queue_id]); > - dev->data->rx_queues[rx_queue_id] = NULL; > - } > + if (dev->data->rx_queues[rx_queue_id] != NULL) > + eth_rx_queue_release(dev, rx_queue_id); > > rxq = rte_zmalloc_socket("szedata2 rx queue", > sizeof(struct szedata2_rx_queue), > @@ -1259,18 +1255,20 @@ eth_rx_queue_setup(struct rte_eth_dev *dev, > } > > rxq->priv = internals; > + dev->data->rx_queues[rx_queue_id] = rxq; > + > rxq->sze = szedata_open(internals->sze_dev_path); > if (rxq->sze == NULL) { > PMD_INIT_LOG(ERR, "szedata_open() failed for rx queue id " > "%" PRIu16 "!", rx_queue_id); > - eth_rx_queue_release(rxq); > + eth_rx_queue_release(dev, rx_queue_id); > return -EINVAL; > } > ret = szedata_subscribe3(rxq->sze, &rx, &tx); > if (ret != 0 || rx == 0) { > PMD_INIT_LOG(ERR, "szedata_subscribe3() failed for rx queue id " > "%" PRIu16 "!", rx_queue_id); > - eth_rx_queue_release(rxq); > + eth_rx_queue_release(dev, rx_queue_id); > return -EINVAL; > } > rxq->rx_channel = rx_channel; > @@ -1281,8 +1279,6 @@ eth_rx_queue_setup(struct rte_eth_dev *dev, > rxq->rx_bytes = 0; > rxq->err_pkts = 0; > > - dev->data->rx_queues[rx_queue_id] = rxq; > - > PMD_INIT_LOG(DEBUG, "Configured rx queue id %" PRIu16 " on socket " > "%u (channel id %u).", rxq->qid, socket_id, > rxq->rx_channel); > @@ -1306,10 +1302,8 @@ eth_tx_queue_setup(struct rte_eth_dev *dev, > > PMD_INIT_FUNC_TRACE(); > > - if (dev->data->tx_queues[tx_queue_id] != NULL) { > - eth_tx_queue_release(dev->data->tx_queues[tx_queue_id]); > - dev->data->tx_queues[tx_queue_id] = NULL; > - } > + if (dev->data->tx_queues[tx_queue_id] != NULL) > + eth_tx_queue_release(dev, tx_queue_id); > > txq = rte_zmalloc_socket("szedata2 tx queue", > sizeof(struct szedata2_tx_queue), > @@ -1321,18 +1315,20 @@ eth_tx_queue_setup(struct rte_eth_dev *dev, > } > > txq->priv = internals; > + dev->data->tx_queues[tx_queue_id] = txq; > + > txq->sze = szedata_open(internals->sze_dev_path); > if (txq->sze == NULL) { > PMD_INIT_LOG(ERR, "szedata_open() failed for tx queue id " > "%" PRIu16 "!", tx_queue_id); > - eth_tx_queue_release(txq); > + eth_tx_queue_release(dev, tx_queue_id); > return -EINVAL; > } > ret = szedata_subscribe3(txq->sze, &rx, &tx); > if (ret != 0 || tx == 0) { > PMD_INIT_LOG(ERR, "szedata_subscribe3() failed for tx queue id " > "%" PRIu16 "!", tx_queue_id); > - eth_tx_queue_release(txq); > + eth_tx_queue_release(dev, tx_queue_id); > return -EINVAL; > } > txq->tx_channel = tx_channel; > @@ -1341,8 +1337,6 @@ eth_tx_queue_setup(struct rte_eth_dev *dev, > txq->tx_bytes = 0; > txq->err_pkts = 0; > > - dev->data->tx_queues[tx_queue_id] = txq; > - > PMD_INIT_LOG(DEBUG, "Configured tx queue id %" PRIu16 " on socket " > "%u (channel id %u).", txq->qid, socket_id, > txq->tx_channel); > diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c > index c515de3bf71..046f17669d0 100644 > --- a/drivers/net/tap/rte_eth_tap.c > +++ b/drivers/net/tap/rte_eth_tap.c > @@ -1151,9 +1151,9 @@ tap_dev_close(struct rte_eth_dev *dev) > } > > static void > -tap_rx_queue_release(void *queue) > +tap_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct rx_queue *rxq = queue; > + struct rx_queue *rxq = dev->data->rx_queues[qid]; > struct pmd_process_private *process_private; > > if (!rxq) > @@ -1170,9 +1170,9 @@ tap_rx_queue_release(void *queue) > } > > static void > -tap_tx_queue_release(void *queue) > +tap_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct tx_queue *txq = queue; > + struct tx_queue *txq = dev->data->tx_queues[qid]; > struct pmd_process_private *process_private; > > if (!txq) > diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c > index 561a98fc81a..5502f1ee693 100644 > --- a/drivers/net/thunderx/nicvf_ethdev.c > +++ b/drivers/net/thunderx/nicvf_ethdev.c > @@ -858,13 +858,12 @@ nicvf_configure_rss_reta(struct rte_eth_dev *dev) > } > > static void > -nicvf_dev_tx_queue_release(void *sq) > +nicvf_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - struct nicvf_txq *txq; > + struct nicvf_txq *txq = dev->data->tx_queues[qid]; > > PMD_INIT_FUNC_TRACE(); > > - txq = (struct nicvf_txq *)sq; > if (txq) { > if (txq->txbuffs != NULL) { > nicvf_tx_queue_release_mbufs(txq); > @@ -872,6 +871,7 @@ nicvf_dev_tx_queue_release(void *sq) > txq->txbuffs = NULL; > } > rte_free(txq); > + dev->data->tx_queues[qid] = NULL; > } > } > > @@ -985,8 +985,7 @@ nicvf_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx, > if (dev->data->tx_queues[nicvf_netdev_qidx(nic, qidx)] != NULL) { > PMD_TX_LOG(DEBUG, "Freeing memory prior to re-allocation %d", > nicvf_netdev_qidx(nic, qidx)); > - nicvf_dev_tx_queue_release( > - dev->data->tx_queues[nicvf_netdev_qidx(nic, qidx)]); > + nicvf_dev_tx_queue_release(dev, nicvf_netdev_qidx(nic, qidx)); > dev->data->tx_queues[nicvf_netdev_qidx(nic, qidx)] = NULL; > } > > @@ -1020,19 +1019,21 @@ nicvf_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx, > txq->pool_free = nicvf_single_pool_free_xmited_buffers; > } > > + dev->data->tx_queues[nicvf_netdev_qidx(nic, qidx)] = txq; > + > /* Allocate software ring */ > txq->txbuffs = rte_zmalloc_socket("txq->txbuffs", > nb_desc * sizeof(struct rte_mbuf *), > RTE_CACHE_LINE_SIZE, nic->node); > > if (txq->txbuffs == NULL) { > - nicvf_dev_tx_queue_release(txq); > + nicvf_dev_tx_queue_release(dev, nicvf_netdev_qidx(nic, qidx)); > return -ENOMEM; > } > > if (nicvf_qset_sq_alloc(dev, nic, txq, qidx, nb_desc)) { > PMD_INIT_LOG(ERR, "Failed to allocate mem for sq %d", qidx); > - nicvf_dev_tx_queue_release(txq); > + nicvf_dev_tx_queue_release(dev, nicvf_netdev_qidx(nic, qidx)); > return -ENOMEM; > } > > @@ -1043,7 +1044,6 @@ nicvf_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx, > nicvf_netdev_qidx(nic, qidx), txq, nb_desc, txq->desc, > txq->phys, txq->offloads); > > - dev->data->tx_queues[nicvf_netdev_qidx(nic, qidx)] = txq; > dev->data->tx_queue_state[nicvf_netdev_qidx(nic, qidx)] = > RTE_ETH_QUEUE_STATE_STOPPED; > return 0; > @@ -1161,11 +1161,11 @@ nicvf_vf_stop_rx_queue(struct rte_eth_dev *dev, struct nicvf *nic, > } > > static void > -nicvf_dev_rx_queue_release(void *rx_queue) > +nicvf_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > PMD_INIT_FUNC_TRACE(); > > - rte_free(rx_queue); > + rte_free(dev->data->rx_queues[qid]); > } > > static int > @@ -1336,8 +1336,7 @@ nicvf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx, > if (dev->data->rx_queues[nicvf_netdev_qidx(nic, qidx)] != NULL) { > PMD_RX_LOG(DEBUG, "Freeing memory prior to re-allocation %d", > nicvf_netdev_qidx(nic, qidx)); > - nicvf_dev_rx_queue_release( > - dev->data->rx_queues[nicvf_netdev_qidx(nic, qidx)]); > + nicvf_dev_rx_queue_release(dev, nicvf_netdev_qidx(nic, qidx)); > dev->data->rx_queues[nicvf_netdev_qidx(nic, qidx)] = NULL; > } > > @@ -1365,12 +1364,14 @@ nicvf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx, > else > rxq->rbptr_offset = NICVF_CQE_RBPTR_WORD; > > + dev->data->rx_queues[nicvf_netdev_qidx(nic, qidx)] = rxq; > + > nicvf_rxq_mbuf_setup(rxq); > > /* Alloc completion queue */ > if (nicvf_qset_cq_alloc(dev, nic, rxq, rxq->queue_id, nb_desc)) { > PMD_INIT_LOG(ERR, "failed to allocate cq %u", rxq->queue_id); > - nicvf_dev_rx_queue_release(rxq); > + nicvf_dev_rx_queue_release(dev, nicvf_netdev_qidx(nic, qidx)); > return -ENOMEM; > } > > @@ -1382,7 +1383,6 @@ nicvf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx, > nicvf_netdev_qidx(nic, qidx), rxq, mp->name, nb_desc, > rte_mempool_avail_count(mp), rxq->phys, offloads); > > - dev->data->rx_queues[nicvf_netdev_qidx(nic, qidx)] = rxq; > dev->data->rx_queue_state[nicvf_netdev_qidx(nic, qidx)] = > RTE_ETH_QUEUE_STATE_STOPPED; > return 0; > diff --git a/drivers/net/txgbe/txgbe_ethdev.h b/drivers/net/txgbe/txgbe_ethdev.h > index 3021933965c..d979b120271 100644 > --- a/drivers/net/txgbe/txgbe_ethdev.h > +++ b/drivers/net/txgbe/txgbe_ethdev.h > @@ -433,9 +433,9 @@ void txgbe_dev_clear_queues(struct rte_eth_dev *dev); > > void txgbe_dev_free_queues(struct rte_eth_dev *dev); > > -void txgbe_dev_rx_queue_release(void *rxq); > +void txgbe_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > -void txgbe_dev_tx_queue_release(void *txq); > +void txgbe_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > int txgbe_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id, > uint16_t nb_rx_desc, unsigned int socket_id, > diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c > index 1a261287d1b..b6339fe50b4 100644 > --- a/drivers/net/txgbe/txgbe_rxtx.c > +++ b/drivers/net/txgbe/txgbe_rxtx.c > @@ -2109,9 +2109,9 @@ txgbe_tx_queue_release(struct txgbe_tx_queue *txq) > } > > void __rte_cold > -txgbe_dev_tx_queue_release(void *txq) > +txgbe_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - txgbe_tx_queue_release(txq); > + txgbe_tx_queue_release(dev->data->tx_queues[qid]); > } > > /* (Re)set dynamic txgbe_tx_queue fields to defaults */ > @@ -2437,9 +2437,9 @@ txgbe_rx_queue_release(struct txgbe_rx_queue *rxq) > } > > void __rte_cold > -txgbe_dev_rx_queue_release(void *rxq) > +txgbe_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - txgbe_rx_queue_release(rxq); > + txgbe_rx_queue_release(dev->data->rx_queues[qid]); > } > > /* > @@ -2795,13 +2795,13 @@ txgbe_dev_free_queues(struct rte_eth_dev *dev) > PMD_INIT_FUNC_TRACE(); > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - txgbe_dev_rx_queue_release(dev->data->rx_queues[i]); > + txgbe_dev_rx_queue_release(dev, i); > dev->data->rx_queues[i] = NULL; > } > dev->data->nb_rx_queues = 0; > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - txgbe_dev_tx_queue_release(dev->data->tx_queues[i]); > + txgbe_dev_tx_queue_release(dev, i); > dev->data->tx_queues[i] = NULL; > } > dev->data->nb_tx_queues = 0; > diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c > index a202931e9ae..2e24e5f7ffb 100644 > --- a/drivers/net/vhost/rte_eth_vhost.c > +++ b/drivers/net/vhost/rte_eth_vhost.c > @@ -1346,9 +1346,15 @@ eth_stats_reset(struct rte_eth_dev *dev) > } > > static void > -eth_queue_release(void *q) > +eth_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - rte_free(q); > + rte_free(dev->data->rx_queues[qid]); > +} > + > +static void > +eth_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > +{ > + rte_free(dev->data->tx_queues[qid]); > } > > static int > @@ -1388,8 +1394,8 @@ static const struct eth_dev_ops ops = { > .dev_infos_get = eth_dev_info, > .rx_queue_setup = eth_rx_queue_setup, > .tx_queue_setup = eth_tx_queue_setup, > - .rx_queue_release = eth_queue_release, > - .tx_queue_release = eth_queue_release, > + .rx_queue_release = eth_rx_queue_release, > + .tx_queue_release = eth_tx_queue_release, > .tx_done_cleanup = eth_tx_done_cleanup, > .link_update = eth_link_update, > .stats_get = eth_stats_get, > diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c > index 2f40ae907dc..cfffc94c489 100644 > --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c > +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c > @@ -1058,18 +1058,12 @@ vmxnet3_free_queues(struct rte_eth_dev *dev) > > PMD_INIT_FUNC_TRACE(); > > - for (i = 0; i < dev->data->nb_rx_queues; i++) { > - void *rxq = dev->data->rx_queues[i]; > - > - vmxnet3_dev_rx_queue_release(rxq); > - } > + for (i = 0; i < dev->data->nb_rx_queues; i++) > + vmxnet3_dev_rx_queue_release(dev, i); > dev->data->nb_rx_queues = 0; > > - for (i = 0; i < dev->data->nb_tx_queues; i++) { > - void *txq = dev->data->tx_queues[i]; > - > - vmxnet3_dev_tx_queue_release(txq); > - } > + for (i = 0; i < dev->data->nb_tx_queues; i++) > + vmxnet3_dev_tx_queue_release(dev, i); > dev->data->nb_tx_queues = 0; > } > > diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h b/drivers/net/vmxnet3/vmxnet3_ethdev.h > index 59bee9723cf..8950175460f 100644 > --- a/drivers/net/vmxnet3/vmxnet3_ethdev.h > +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h > @@ -182,8 +182,8 @@ vmxnet3_rx_data_ring(struct vmxnet3_hw *hw, uint32 rqID) > > void vmxnet3_dev_clear_queues(struct rte_eth_dev *dev); > > -void vmxnet3_dev_rx_queue_release(void *rxq); > -void vmxnet3_dev_tx_queue_release(void *txq); > +void vmxnet3_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > +void vmxnet3_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid); > > int vmxnet3_v4_rss_configure(struct rte_eth_dev *dev); > > diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c b/drivers/net/vmxnet3/vmxnet3_rxtx.c > index 5cf53d4de82..b01c4c01f9c 100644 > --- a/drivers/net/vmxnet3/vmxnet3_rxtx.c > +++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c > @@ -165,9 +165,9 @@ vmxnet3_cmd_ring_release(vmxnet3_cmd_ring_t *ring) > } > > void > -vmxnet3_dev_tx_queue_release(void *txq) > +vmxnet3_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > - vmxnet3_tx_queue_t *tq = txq; > + vmxnet3_tx_queue_t *tq = dev->data->tx_queues[qid]; > > if (tq != NULL) { > /* Release mbufs */ > @@ -182,10 +182,10 @@ vmxnet3_dev_tx_queue_release(void *txq) > } > > void > -vmxnet3_dev_rx_queue_release(void *rxq) > +vmxnet3_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) > { > int i; > - vmxnet3_rx_queue_t *rq = rxq; > + vmxnet3_rx_queue_t *rq = dev->data->rx_queues[qid]; > > if (rq != NULL) { > /* Release mbufs */ > diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h > index cc2c75261c4..2f0fd3516d8 100644 > --- a/lib/ethdev/ethdev_driver.h > +++ b/lib/ethdev/ethdev_driver.h > @@ -278,7 +278,8 @@ typedef int (*eth_rx_disable_intr_t)(struct rte_eth_dev *dev, > uint16_t rx_queue_id); > /**< @internal Disable interrupt of a receive queue of an Ethernet device. */ > > -typedef void (*eth_queue_release_t)(void *queue); > +typedef void (*eth_queue_release_t)(struct rte_eth_dev *dev, > + uint16_t queue_id); > /**< @internal Release memory resources allocated by given RX/TX queue. */ > > typedef int (*eth_fw_version_get_t)(struct rte_eth_dev *dev, > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c > index 4439ad336e2..61aa49efec6 100644 > --- a/lib/ethdev/rte_ethdev.c > +++ b/lib/ethdev/rte_ethdev.c > @@ -898,7 +898,7 @@ eth_dev_rxq_release(struct rte_eth_dev *dev, uint16_t qid) > return; > > if (dev->dev_ops->rx_queue_release != NULL) > - (*dev->dev_ops->rx_queue_release)(rxq[qid]); > + (*dev->dev_ops->rx_queue_release)(dev, qid); > rxq[qid] = NULL; > } > > @@ -911,7 +911,7 @@ eth_dev_txq_release(struct rte_eth_dev *dev, uint16_t qid) > return; > > if (dev->dev_ops->tx_queue_release != NULL) > - (*dev->dev_ops->tx_queue_release)(txq[qid]); > + (*dev->dev_ops->tx_queue_release)(dev, qid); > txq[qid] = NULL; > } > > -- > 2.33.0 > Acked-by: Somnath Kotur