ethdev: change queue release callback
[dpdk.git] / drivers / net / memif / rte_eth_memif.c
index de6becd..9801502 100644 (file)
@@ -199,6 +199,7 @@ memif_dev_info(struct rte_eth_dev *dev __rte_unused, struct rte_eth_dev_info *de
        dev_info->max_rx_queues = ETH_MEMIF_MAX_NUM_Q_PAIRS;
        dev_info->max_tx_queues = ETH_MEMIF_MAX_NUM_Q_PAIRS;
        dev_info->min_rx_bufsize = 0;
+       dev_info->tx_offload_capa = DEV_TX_OFFLOAD_MULTI_SEGS;
 
        return 0;
 }
@@ -567,7 +568,7 @@ eth_memif_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
                rte_eth_devices[mq->in_port].process_private;
        memif_ring_t *ring = memif_get_ring_from_queue(proc_private, mq);
        uint16_t slot, saved_slot, n_free, ring_size, mask, n_tx_pkts = 0;
-       uint16_t src_len, src_off, dst_len, dst_off, cp_len;
+       uint16_t src_len, src_off, dst_len, dst_off, cp_len, nb_segs;
        memif_ring_type_t type = mq->type;
        memif_desc_t *d0;
        struct rte_mbuf *mbuf;
@@ -615,6 +616,7 @@ eth_memif_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
 
        while (n_tx_pkts < nb_pkts && n_free) {
                mbuf_head = *bufs++;
+               nb_segs = mbuf_head->nb_segs;
                mbuf = mbuf_head;
 
                saved_slot = slot;
@@ -659,7 +661,7 @@ next_in_chain:
                        d0->length = dst_off;
                }
 
-               if (rte_pktmbuf_is_contiguous(mbuf) == 0) {
+               if (--nb_segs > 0) {
                        mbuf = mbuf->next;
                        goto next_in_chain;
                }
@@ -696,6 +698,7 @@ memif_tx_one_zc(struct pmd_process_private *proc_private, struct memif_queue *mq
                uint16_t slot, uint16_t n_free)
 {
        memif_desc_t *d0;
+       uint16_t nb_segs = mbuf->nb_segs;
        int used_slots = 1;
 
 next_in_chain:
@@ -716,7 +719,7 @@ next_in_chain:
        d0->flags = 0;
 
        /* check if buffer is chained */
-       if (rte_pktmbuf_is_contiguous(mbuf) == 0) {
+       if (--nb_segs > 0) {
                if (n_free < 2)
                        return 0;
                /* mark buffer as chained */
@@ -1255,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 {
@@ -1349,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 = 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 = (struct memif_queue *)queue;
+       struct memif_queue *mq = dev->data->tx_queues[qid];
 
        if (!mq)
                return;
@@ -1468,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,