net/virtio-user: support memory hotplug
[dpdk.git] / drivers / net / virtio / virtio_rxtx.c
index 854af39..a8aa87b 100644 (file)
@@ -30,6 +30,7 @@
 #include "virtio_pci.h"
 #include "virtqueue.h"
 #include "virtio_rxtx.h"
+#include "virtio_rxtx_simple.h"
 
 #ifdef RTE_LIBRTE_VIRTIO_DEBUG_DUMP
 #define VIRTIO_DUMP_PACKET(m, len) rte_pktmbuf_dump(stdout, m, len)
 #define  VIRTIO_DUMP_PACKET(m, len) do { } while (0)
 #endif
 
-
-#define VIRTIO_SIMPLE_FLAGS ((uint32_t)ETH_TXQ_FLAGS_NOMULTSEGS | \
-       ETH_TXQ_FLAGS_NOOFFLOADS)
-
 int
 virtio_dev_rx_queue_done(void *rxq, uint16_t offset)
 {
@@ -388,9 +385,10 @@ virtio_dev_rx_queue_setup(struct rte_eth_dev *dev,
                        uint16_t queue_idx,
                        uint16_t nb_desc,
                        unsigned int socket_id __rte_unused,
-                       __rte_unused const struct rte_eth_rxconf *rx_conf,
+                       const struct rte_eth_rxconf *rx_conf,
                        struct rte_mempool *mp)
 {
+       const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
        uint16_t vtpci_queue_idx = 2 * queue_idx + VTNET_SQ_RQ_QUEUE_IDX;
        struct virtio_hw *hw = dev->data->dev_private;
        struct virtqueue *vq = hw->vqs[vtpci_queue_idx];
@@ -409,6 +407,11 @@ virtio_dev_rx_queue_setup(struct rte_eth_dev *dev,
                rte_exit(EXIT_FAILURE,
                        "Cannot allocate mbufs for rx virtqueue");
        }
+
+       if ((rx_conf->offloads ^ rxmode->offloads) &
+           VIRTIO_PMD_PER_DEVICE_RX_OFFLOADS)
+               return -EINVAL;
+
        dev->data->rx_queues[queue_idx] = rxvq;
 
        return 0;
@@ -437,6 +440,8 @@ virtio_dev_rx_queue_setup_finish(struct rte_eth_dev *dev, uint16_t queue_idx)
                        vq->vq_ring.desc[desc_idx].flags =
                                VRING_DESC_F_WRITE;
                }
+
+               virtio_rxq_vec_setup(rxvq);
        }
 
        memset(&rxvq->fake_mbuf, 0, sizeof(rxvq->fake_mbuf));
@@ -446,30 +451,31 @@ virtio_dev_rx_queue_setup_finish(struct rte_eth_dev *dev, uint16_t queue_idx)
                        &rxvq->fake_mbuf;
        }
 
-       while (!virtqueue_full(vq)) {
-               m = rte_mbuf_raw_alloc(rxvq->mpool);
-               if (m == NULL)
-                       break;
+       if (hw->use_simple_rx) {
+               while (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) {
+                       virtio_rxq_rearm_vec(rxvq);
+                       nbufs += RTE_VIRTIO_VPMD_RX_REARM_THRESH;
+               }
+       } else {
+               while (!virtqueue_full(vq)) {
+                       m = rte_mbuf_raw_alloc(rxvq->mpool);
+                       if (m == NULL)
+                               break;
 
-               /* Enqueue allocated buffers */
-               if (hw->use_simple_rx)
-                       error = virtqueue_enqueue_recv_refill_simple(vq, m);
-               else
+                       /* Enqueue allocated buffers */
                        error = virtqueue_enqueue_recv_refill(vq, m);
-
-               if (error) {
-                       rte_pktmbuf_free(m);
-                       break;
+                       if (error) {
+                               rte_pktmbuf_free(m);
+                               break;
+                       }
+                       nbufs++;
                }
-               nbufs++;
-       }
 
-       vq_update_avail_idx(vq);
+               vq_update_avail_idx(vq);
+       }
 
        PMD_INIT_LOG(DEBUG, "Allocated %d bufs", nbufs);
 
-       virtio_rxq_vec_setup(rxvq);
-
        VIRTQUEUE_DUMP(vq);
 
        return 0;
@@ -498,7 +504,7 @@ virtio_dev_tx_queue_setup(struct rte_eth_dev *dev,
        PMD_INIT_FUNC_TRACE();
 
        /* cannot use simple rxtx funcs with multisegs or offloads */
-       if ((tx_conf->txq_flags & VIRTIO_SIMPLE_FLAGS) != VIRTIO_SIMPLE_FLAGS)
+       if (tx_conf->offloads)
                hw->use_simple_tx = 0;
 
        if (nb_desc == 0 || nb_desc > vq->vq_nentries)