net/virtio: move queue configure code to proper place
authorYuanhan Liu <yuanhan.liu@linux.intel.com>
Sat, 5 Nov 2016 09:41:01 +0000 (17:41 +0800)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 7 Nov 2016 14:40:13 +0000 (15:40 +0100)
The only piece of code of virtio_dev_rxtx_start() is actually doing
queue configure/setup work. So, move it to corresponding queue_setup
callback.

Once that is done, virtio_dev_rxtx_start() becomes an empty function,
thus it's being removed.

Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
drivers/net/virtio/virtio_ethdev.c
drivers/net/virtio/virtio_ethdev.h
drivers/net/virtio/virtio_rxtx.c

index 7b90d71..adfc69d 100644 (file)
@@ -1497,8 +1497,6 @@ virtio_dev_start(struct rte_eth_dev *dev)
        if (hw->started)
                return 0;
 
-       /* Do final configuration before rx/tx engine starts */
-       virtio_dev_rxtx_start(dev);
        vtpci_reinit_complete(hw);
 
        hw->started = 1;
index 8a3fa6d..27d9a19 100644 (file)
@@ -78,8 +78,6 @@ void virtio_dev_cq_start(struct rte_eth_dev *dev);
 /*
  * RX/TX function prototypes
  */
-void virtio_dev_rxtx_start(struct rte_eth_dev *dev);
-
 int  virtio_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,
index 24129d6..22d97a4 100644 (file)
@@ -388,112 +388,6 @@ virtio_dev_cq_start(struct rte_eth_dev *dev)
        }
 }
 
-void
-virtio_dev_rxtx_start(struct rte_eth_dev *dev)
-{
-       /*
-        * Start receive and transmit vrings
-        * -    Setup vring structure for all queues
-        * -    Initialize descriptor for the rx vring
-        * -    Allocate blank mbufs for the each rx descriptor
-        *
-        */
-       uint16_t i;
-       uint16_t desc_idx;
-       struct virtio_hw *hw = dev->data->dev_private;
-
-       PMD_INIT_FUNC_TRACE();
-
-       /* Start rx vring. */
-       for (i = 0; i < dev->data->nb_rx_queues; i++) {
-               struct virtnet_rx *rxvq = dev->data->rx_queues[i];
-               struct virtqueue *vq = rxvq->vq;
-               int error, nbufs;
-               struct rte_mbuf *m;
-
-               if (rxvq->mpool == NULL) {
-                       rte_exit(EXIT_FAILURE,
-                               "Cannot allocate mbufs for rx virtqueue");
-               }
-
-               /* Allocate blank mbufs for the each rx descriptor */
-               nbufs = 0;
-               error = ENOSPC;
-
-               if (hw->use_simple_rxtx) {
-                       for (desc_idx = 0; desc_idx < vq->vq_nentries;
-                            desc_idx++) {
-                               vq->vq_ring.avail->ring[desc_idx] = desc_idx;
-                               vq->vq_ring.desc[desc_idx].flags =
-                                       VRING_DESC_F_WRITE;
-                       }
-               }
-
-               memset(&rxvq->fake_mbuf, 0, sizeof(rxvq->fake_mbuf));
-               for (desc_idx = 0; desc_idx < RTE_PMD_VIRTIO_RX_MAX_BURST;
-                    desc_idx++) {
-                       vq->sw_ring[vq->vq_nentries + desc_idx] =
-                               &rxvq->fake_mbuf;
-               }
-
-               while (!virtqueue_full(vq)) {
-                       m = rte_mbuf_raw_alloc(rxvq->mpool);
-                       if (m == NULL)
-                               break;
-
-                       /******************************************
-                       *         Enqueue allocated buffers        *
-                       *******************************************/
-                       if (hw->use_simple_rxtx)
-                               error = virtqueue_enqueue_recv_refill_simple(vq, m);
-                       else
-                               error = virtqueue_enqueue_recv_refill(vq, m);
-
-                       if (error) {
-                               rte_pktmbuf_free(m);
-                               break;
-                       }
-                       nbufs++;
-               }
-
-               vq_update_avail_idx(vq);
-
-               PMD_INIT_LOG(DEBUG, "Allocated %d bufs", nbufs);
-
-               VIRTQUEUE_DUMP(vq);
-       }
-
-       /* Start tx vring. */
-       for (i = 0; i < dev->data->nb_tx_queues; i++) {
-               struct virtnet_tx *txvq = dev->data->tx_queues[i];
-               struct virtqueue *vq = txvq->vq;
-
-               if (hw->use_simple_rxtx) {
-                       uint16_t mid_idx  = vq->vq_nentries >> 1;
-
-                       for (desc_idx = 0; desc_idx < mid_idx; desc_idx++) {
-                               vq->vq_ring.avail->ring[desc_idx] =
-                                       desc_idx + mid_idx;
-                               vq->vq_ring.desc[desc_idx + mid_idx].next =
-                                       desc_idx;
-                               vq->vq_ring.desc[desc_idx + mid_idx].addr =
-                                       txvq->virtio_net_hdr_mem +
-                                       offsetof(struct virtio_tx_region, tx_hdr);
-                               vq->vq_ring.desc[desc_idx + mid_idx].len =
-                                       vq->hw->vtnet_hdr_size;
-                               vq->vq_ring.desc[desc_idx + mid_idx].flags =
-                                       VRING_DESC_F_NEXT;
-                               vq->vq_ring.desc[desc_idx].flags = 0;
-                       }
-                       for (desc_idx = mid_idx; desc_idx < vq->vq_nentries;
-                            desc_idx++)
-                               vq->vq_ring.avail->ring[desc_idx] = desc_idx;
-               }
-
-               VIRTQUEUE_DUMP(vq);
-       }
-}
-
 int
 virtio_dev_rx_queue_setup(struct rte_eth_dev *dev,
                        uint16_t queue_idx,
@@ -506,6 +400,9 @@ virtio_dev_rx_queue_setup(struct rte_eth_dev *dev,
        struct virtio_hw *hw = dev->data->dev_private;
        struct virtqueue *vq = hw->vqs[vtpci_queue_idx];
        struct virtnet_rx *rxvq;
+       int error, nbufs;
+       struct rte_mbuf *m;
+       uint16_t desc_idx;
 
        PMD_INIT_FUNC_TRACE();
 
@@ -514,13 +411,61 @@ virtio_dev_rx_queue_setup(struct rte_eth_dev *dev,
        vq->vq_free_cnt = RTE_MIN(vq->vq_free_cnt, nb_desc);
 
        rxvq = &vq->rxq;
-       rxvq->mpool = mp;
        rxvq->queue_id = queue_idx;
-
+       rxvq->mpool = mp;
+       if (rxvq->mpool == NULL) {
+               rte_exit(EXIT_FAILURE,
+                       "Cannot allocate mbufs for rx virtqueue");
+       }
        dev->data->rx_queues[queue_idx] = rxvq;
 
+
+       /* Allocate blank mbufs for the each rx descriptor */
+       nbufs = 0;
+       error = ENOSPC;
+
+       if (hw->use_simple_rxtx) {
+               for (desc_idx = 0; desc_idx < vq->vq_nentries;
+                    desc_idx++) {
+                       vq->vq_ring.avail->ring[desc_idx] = desc_idx;
+                       vq->vq_ring.desc[desc_idx].flags =
+                               VRING_DESC_F_WRITE;
+               }
+       }
+
+       memset(&rxvq->fake_mbuf, 0, sizeof(rxvq->fake_mbuf));
+       for (desc_idx = 0; desc_idx < RTE_PMD_VIRTIO_RX_MAX_BURST;
+            desc_idx++) {
+               vq->sw_ring[vq->vq_nentries + desc_idx] =
+                       &rxvq->fake_mbuf;
+       }
+
+       while (!virtqueue_full(vq)) {
+               m = rte_mbuf_raw_alloc(rxvq->mpool);
+               if (m == NULL)
+                       break;
+
+               /* Enqueue allocated buffers */
+               if (hw->use_simple_rxtx)
+                       error = virtqueue_enqueue_recv_refill_simple(vq, m);
+               else
+                       error = virtqueue_enqueue_recv_refill(vq, m);
+
+               if (error) {
+                       rte_pktmbuf_free(m);
+                       break;
+               }
+               nbufs++;
+       }
+
+       vq_update_avail_idx(vq);
+
+       PMD_INIT_LOG(DEBUG, "Allocated %d bufs", nbufs);
+
        virtio_rxq_vec_setup(rxvq);
 
+       VIRTQUEUE_DUMP(vq);
+
        return 0;
 }
 
@@ -568,6 +513,7 @@ virtio_dev_tx_queue_setup(struct rte_eth_dev *dev,
        struct virtqueue *vq = hw->vqs[vtpci_queue_idx];
        struct virtnet_tx *txvq;
        uint16_t tx_free_thresh;
+       uint16_t desc_idx;
 
        PMD_INIT_FUNC_TRACE();
 
@@ -596,6 +542,30 @@ virtio_dev_tx_queue_setup(struct rte_eth_dev *dev,
 
        vq->vq_free_thresh = tx_free_thresh;
 
+       if (hw->use_simple_rxtx) {
+               uint16_t mid_idx  = vq->vq_nentries >> 1;
+
+               for (desc_idx = 0; desc_idx < mid_idx; desc_idx++) {
+                       vq->vq_ring.avail->ring[desc_idx] =
+                               desc_idx + mid_idx;
+                       vq->vq_ring.desc[desc_idx + mid_idx].next =
+                               desc_idx;
+                       vq->vq_ring.desc[desc_idx + mid_idx].addr =
+                               txvq->virtio_net_hdr_mem +
+                               offsetof(struct virtio_tx_region, tx_hdr);
+                       vq->vq_ring.desc[desc_idx + mid_idx].len =
+                               vq->hw->vtnet_hdr_size;
+                       vq->vq_ring.desc[desc_idx + mid_idx].flags =
+                               VRING_DESC_F_NEXT;
+                       vq->vq_ring.desc[desc_idx].flags = 0;
+               }
+               for (desc_idx = mid_idx; desc_idx < vq->vq_nentries;
+                    desc_idx++)
+                       vq->vq_ring.avail->ring[desc_idx] = desc_idx;
+       }
+
+       VIRTQUEUE_DUMP(vq);
+
        dev->data->tx_queues[queue_idx] = txvq;
        return 0;
 }