Add support for queue operations:
 - rx_queue_release
 - tx_queue_release

Signed-off-by: Beilei Xing <beilei.x...@intel.com>
Signed-off-by: Xiaoyun Li <xiaoyun...@intel.com>
Signed-off-by: Junfeng Guo <junfeng....@intel.com>
---
 drivers/net/idpf/idpf_ethdev.c |  2 +
 drivers/net/idpf/idpf_rxtx.c   | 81 ++++++++++++++++++++++++++++++++++
 drivers/net/idpf/idpf_rxtx.h   |  3 ++
 3 files changed, 86 insertions(+)

diff --git a/drivers/net/idpf/idpf_ethdev.c b/drivers/net/idpf/idpf_ethdev.c
index 6040050dd9..4c058660b4 100644
--- a/drivers/net/idpf/idpf_ethdev.c
+++ b/drivers/net/idpf/idpf_ethdev.c
@@ -66,7 +66,9 @@ static const struct eth_dev_ops idpf_eth_dev_ops = {
        .tx_queue_start                 = idpf_tx_queue_start,
        .tx_queue_stop                  = idpf_tx_queue_stop,
        .rx_queue_setup                 = idpf_rx_queue_setup,
+       .rx_queue_release               = idpf_dev_rx_queue_release,
        .tx_queue_setup                 = idpf_tx_queue_setup,
+       .tx_queue_release               = idpf_dev_tx_queue_release,
        .dev_infos_get                  = idpf_dev_info_get,
        .link_update                    = idpf_dev_link_update,
 };
diff --git a/drivers/net/idpf/idpf_rxtx.c b/drivers/net/idpf/idpf_rxtx.c
index c14fd4324e..298eaf0a1a 100644
--- a/drivers/net/idpf/idpf_rxtx.c
+++ b/drivers/net/idpf/idpf_rxtx.c
@@ -120,6 +120,51 @@ static const struct idpf_txq_ops def_txq_ops = {
        .release_mbufs = release_txq_mbufs,
 };
 
+static void
+idpf_rx_queue_release(void *rxq)
+{
+       struct idpf_rx_queue *q = (struct idpf_rx_queue *)rxq;
+
+       if (q == NULL)
+               return;
+
+       /* Split queue */
+       if (q->bufq1 != NULL && q->bufq2 != NULL) {
+               q->bufq1->ops->release_mbufs(q->bufq1);
+               rte_free(q->bufq1->sw_ring);
+               rte_memzone_free(q->bufq1->mz);
+               rte_free(q->bufq1);
+               q->bufq2->ops->release_mbufs(q->bufq2);
+               rte_free(q->bufq2->sw_ring);
+               rte_memzone_free(q->bufq2->mz);
+               rte_free(q->bufq2);
+               rte_memzone_free(q->mz);
+               rte_free(q);
+               return;
+       }
+
+       /* Single queue */
+       q->ops->release_mbufs(q);
+       rte_free(q->sw_ring);
+       rte_memzone_free(q->mz);
+       rte_free(q);
+}
+
+static void
+idpf_tx_queue_release(void *txq)
+{
+       struct idpf_tx_queue *q = (struct idpf_tx_queue *)txq;
+
+       if (q == NULL)
+               return;
+
+       rte_free(q->complq);
+       q->ops->release_mbufs(q);
+       rte_free(q->sw_ring);
+       rte_memzone_free(q->mz);
+       rte_free(q);
+}
+
 static inline void
 reset_split_rx_descq(struct idpf_rx_queue *rxq)
 {
@@ -401,6 +446,12 @@ idpf_rx_split_queue_setup(struct rte_eth_dev *dev, 
uint16_t queue_idx,
        if (check_rx_thresh(nb_desc, rx_free_thresh) != 0)
                return -EINVAL;
 
+       /* Free memory if needed */
+       if (dev->data->rx_queues[queue_idx] != NULL) {
+               idpf_rx_queue_release(dev->data->rx_queues[queue_idx]);
+               dev->data->rx_queues[queue_idx] = NULL;
+       }
+
        /* Setup Rx description queue */
        rxq = rte_zmalloc_socket("idpf rxq",
                                 sizeof(struct idpf_rx_queue),
@@ -541,6 +592,12 @@ idpf_rx_single_queue_setup(struct rte_eth_dev *dev, 
uint16_t queue_idx,
        if (check_rx_thresh(nb_desc, rx_free_thresh) != 0)
                return -EINVAL;
 
+       /* Free memory if needed */
+       if (dev->data->rx_queues[queue_idx] != NULL) {
+               idpf_rx_queue_release(dev->data->rx_queues[queue_idx]);
+               dev->data->rx_queues[queue_idx] = NULL;
+       }
+
        /* Setup Rx description queue */
        rxq = rte_zmalloc_socket("idpf rxq",
                                 sizeof(struct idpf_rx_queue),
@@ -654,6 +711,12 @@ idpf_tx_split_queue_setup(struct rte_eth_dev *dev, 
uint16_t queue_idx,
        if (check_tx_thresh(nb_desc, tx_rs_thresh, tx_free_thresh) != 0)
                return -EINVAL;
 
+       /* Free memory if needed. */
+       if (dev->data->tx_queues[queue_idx] != NULL) {
+               idpf_tx_queue_release(dev->data->tx_queues[queue_idx]);
+               dev->data->tx_queues[queue_idx] = NULL;
+       }
+
        /* Allocate the TX queue data structure. */
        txq = rte_zmalloc_socket("idpf split txq",
                                 sizeof(struct idpf_tx_queue),
@@ -776,6 +839,12 @@ idpf_tx_single_queue_setup(struct rte_eth_dev *dev, 
uint16_t queue_idx,
        if (check_tx_thresh(nb_desc, tx_rs_thresh, tx_free_thresh) != 0)
                return -EINVAL;
 
+       /* Free memory if needed. */
+       if (dev->data->tx_queues[queue_idx] != NULL) {
+               idpf_tx_queue_release(dev->data->tx_queues[queue_idx]);
+               dev->data->tx_queues[queue_idx] = NULL;
+       }
+
        /* Allocate the TX queue data structure. */
        txq = rte_zmalloc_socket("idpf txq",
                                 sizeof(struct idpf_tx_queue),
@@ -1124,6 +1193,18 @@ idpf_tx_queue_stop(struct rte_eth_dev *dev, uint16_t 
tx_queue_id)
        return 0;
 }
 
+void
+idpf_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid)
+{
+       idpf_rx_queue_release(dev->data->rx_queues[qid]);
+}
+
+void
+idpf_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid)
+{
+       idpf_tx_queue_release(dev->data->tx_queues[qid]);
+}
+
 void
 idpf_stop_queues(struct rte_eth_dev *dev)
 {
diff --git a/drivers/net/idpf/idpf_rxtx.h b/drivers/net/idpf/idpf_rxtx.h
index e1de436a4a..9f767079b2 100644
--- a/drivers/net/idpf/idpf_rxtx.h
+++ b/drivers/net/idpf/idpf_rxtx.h
@@ -126,12 +126,15 @@ int idpf_rx_queue_setup(struct rte_eth_dev *dev, uint16_t 
queue_idx,
 int idpf_rx_queue_init(struct rte_eth_dev *dev, uint16_t rx_queue_id);
 int idpf_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id);
 int idpf_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id);
+void idpf_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid);
+
 int idpf_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);
 int idpf_tx_queue_init(struct rte_eth_dev *dev, uint16_t tx_queue_id);
 int idpf_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id);
 int idpf_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id);
+void idpf_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid);
 
 void idpf_stop_queues(struct rte_eth_dev *dev);
 #endif /* _IDPF_RXTX_H_ */
-- 
2.34.1

Reply via email to