net/sfc: support main MAC address change
[dpdk.git] / examples / vhost / main.c
index 195b1db..4789947 100644 (file)
@@ -127,6 +127,7 @@ static uint32_t enable_tx_csum;
 static uint32_t enable_tso;
 
 static int client_mode;
+static int dequeue_zero_copy;
 
 /* Specify timeout (in useconds) between retries on RX. */
 static uint32_t burst_rx_delay_time = BURST_RX_WAIT_US;
@@ -294,6 +295,17 @@ port_init(uint8_t port)
 
        rx_ring_size = RTE_TEST_RX_DESC_DEFAULT;
        tx_ring_size = RTE_TEST_TX_DESC_DEFAULT;
+
+       /*
+        * When dequeue zero copy is enabled, guest Tx used vring will be
+        * updated only when corresponding mbuf is freed. Thus, the nb_tx_desc
+        * (tx_ring_size here) must be small enough so that the driver will
+        * hit the free threshold easily and free mbufs timely. Otherwise,
+        * guest Tx vring would be starved.
+        */
+       if (dequeue_zero_copy)
+               tx_ring_size = 64;
+
        tx_rings = (uint16_t)rte_lcore_count();
 
        retval = validate_num_devices(MAX_DEVICES);
@@ -470,7 +482,8 @@ us_vhost_usage(const char *prgname)
        "               --socket-file: The path of the socket file.\n"
        "               --tx-csum [0|1] disable/enable TX checksum offload.\n"
        "               --tso [0|1] disable/enable TCP segment offload.\n"
-       "               --client register a vhost-user socket as client mode.\n",
+       "               --client register a vhost-user socket as client mode.\n"
+       "               --dequeue-zero-copy enables dequeue zero copy\n",
               prgname);
 }
 
@@ -495,6 +508,7 @@ us_vhost_parse_args(int argc, char **argv)
                {"tx-csum", required_argument, NULL, 0},
                {"tso", required_argument, NULL, 0},
                {"client", no_argument, &client_mode, 1},
+               {"dequeue-zero-copy", no_argument, &dequeue_zero_copy, 1},
                {NULL, 0, 0, 0},
        };
 
@@ -818,17 +832,17 @@ virtio_tx_local(struct vhost_dev *vdev, struct rte_mbuf *m)
                return -1;
 
        if (vdev->vid == dst_vdev->vid) {
-               RTE_LOG(DEBUG, VHOST_DATA,
+               RTE_LOG_DP(DEBUG, VHOST_DATA,
                        "(%d) TX: src and dst MAC is same. Dropping packet.\n",
                        vdev->vid);
                return 0;
        }
 
-       RTE_LOG(DEBUG, VHOST_DATA,
+       RTE_LOG_DP(DEBUG, VHOST_DATA,
                "(%d) TX: MAC address is local\n", dst_vdev->vid);
 
        if (unlikely(dst_vdev->remove)) {
-               RTE_LOG(DEBUG, VHOST_DATA,
+               RTE_LOG_DP(DEBUG, VHOST_DATA,
                        "(%d) device is marked for removal\n", dst_vdev->vid);
                return 0;
        }
@@ -853,7 +867,7 @@ find_local_dest(struct vhost_dev *vdev, struct rte_mbuf *m,
                return 0;
 
        if (vdev->vid == dst_vdev->vid) {
-               RTE_LOG(DEBUG, VHOST_DATA,
+               RTE_LOG_DP(DEBUG, VHOST_DATA,
                        "(%d) TX: src and dst MAC is same. Dropping packet.\n",
                        vdev->vid);
                return -1;
@@ -867,7 +881,7 @@ find_local_dest(struct vhost_dev *vdev, struct rte_mbuf *m,
        *offset  = VLAN_HLEN;
        *vlan_tag = vlan_tags[vdev->vid];
 
-       RTE_LOG(DEBUG, VHOST_DATA,
+       RTE_LOG_DP(DEBUG, VHOST_DATA,
                "(%d) TX: pkt to local VM device id: (%d), vlan tag: %u.\n",
                vdev->vid, dst_vdev->vid, *vlan_tag);
 
@@ -959,7 +973,7 @@ virtio_tx_route(struct vhost_dev *vdev, struct rte_mbuf *m, uint16_t vlan_tag)
                }
        }
 
-       RTE_LOG(DEBUG, VHOST_DATA,
+       RTE_LOG_DP(DEBUG, VHOST_DATA,
                "(%d) TX: MAC address is external\n", vdev->vid);
 
 queue2nic:
@@ -1027,7 +1041,7 @@ drain_mbuf_table(struct mbuf_table *tx_q)
        if (unlikely(cur_tsc - prev_tsc > MBUF_TABLE_DRAIN_TSC)) {
                prev_tsc = cur_tsc;
 
-               RTE_LOG(DEBUG, VHOST_DATA,
+               RTE_LOG_DP(DEBUG, VHOST_DATA,
                        "TX queue drained after timeout with burst size %u\n",
                        tx_q->len);
                do_drain_mbuf_table(tx_q);
@@ -1379,7 +1393,7 @@ create_mbuf_pool(uint16_t nr_port, uint32_t nr_switch_core, uint32_t mbuf_size,
                mtu = 64 * 1024;
 
        nr_mbufs_per_core  = (mtu + mbuf_size) * MAX_PKT_BURST /
-                       (mbuf_size - RTE_PKTMBUF_HEADROOM) * MAX_PKT_BURST;
+                       (mbuf_size - RTE_PKTMBUF_HEADROOM);
        nr_mbufs_per_core += nr_rx_desc;
        nr_mbufs_per_core  = RTE_MAX(nr_mbufs_per_core, nr_mbuf_cache);
 
@@ -1395,8 +1409,7 @@ create_mbuf_pool(uint16_t nr_port, uint32_t nr_switch_core, uint32_t mbuf_size,
 }
 
 /*
- * Main function, does initialisation and calls the per-lcore functions. The CUSE
- * device is also registered here to handle the IOCTLs.
+ * Main function, does initialisation and calls the per-lcore functions.
  */
 int
 main(int argc, char *argv[])
@@ -1423,11 +1436,12 @@ main(int argc, char *argv[])
        if (ret < 0)
                rte_exit(EXIT_FAILURE, "Invalid argument\n");
 
-       for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id ++)
+       for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
                TAILQ_INIT(&lcore_info[lcore_id].vdev_list);
 
                if (rte_lcore_is_enabled(lcore_id))
-                       lcore_ids[core_id ++] = lcore_id;
+                       lcore_ids[core_id++] = lcore_id;
+       }
 
        if (rte_lcore_count() > RTE_MAX_LCORE)
                rte_exit(EXIT_FAILURE,"Not enough cores\n");
@@ -1501,6 +1515,9 @@ main(int argc, char *argv[])
        if (client_mode)
                flags |= RTE_VHOST_USER_CLIENT;
 
+       if (dequeue_zero_copy)
+               flags |= RTE_VHOST_USER_DEQUEUE_ZERO_COPY;
+
        /* Register vhost user driver to handle vhost messages. */
        for (i = 0; i < nb_sockets; i++) {
                ret = rte_vhost_driver_register
@@ -1514,7 +1531,6 @@ main(int argc, char *argv[])
 
        rte_vhost_driver_callback_register(&virtio_net_device_ops);
 
-       /* Start CUSE session. */
        rte_vhost_driver_session_start();
        return 0;