Add new parameter "packed_vec" which can disable vectorized packed ring datapath explicitly. When "packed_vec" option is on, driver will check packed ring vectorized datapath prerequisites. If any one of them not matched, vectorized datapath won't be selected.
Signed-off-by: Marvin Liu <yong....@intel.com> diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 7433d2f08..8103b7a18 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -251,6 +251,8 @@ struct virtio_hw { uint8_t use_msix; uint8_t modern; uint8_t use_simple_rx; + uint8_t packed_vec_rx; + uint8_t packed_vec_tx; uint8_t use_inorder_rx; uint8_t use_inorder_tx; uint8_t weak_barriers; diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index e61af4068..399ac5511 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -450,6 +450,8 @@ static const char *valid_args[] = { VIRTIO_USER_ARG_IN_ORDER, #define VIRTIO_USER_ARG_PACKED_VQ "packed_vq" VIRTIO_USER_ARG_PACKED_VQ, +#define VIRTIO_USER_ARG_PACKED_VEC "packed_vec" + VIRTIO_USER_ARG_PACKED_VEC, NULL }; @@ -552,6 +554,8 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev) uint64_t mrg_rxbuf = 1; uint64_t in_order = 1; uint64_t packed_vq = 0; + uint64_t packed_vec = 0; + char *path = NULL; char *ifname = NULL; char *mac_addr = NULL; @@ -668,6 +672,15 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev) } } + if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_PACKED_VEC) == 1) { + if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_PACKED_VEC, + &get_integer_arg, &packed_vec) < 0) { + PMD_INIT_LOG(ERR, "error to parse %s", + VIRTIO_USER_ARG_PACKED_VQ); + goto end; + } + } + if (queues > 1 && cq == 0) { PMD_INIT_LOG(ERR, "multi-q requires ctrl-q"); goto end; @@ -705,6 +718,17 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev) } hw = eth_dev->data->dev_private; +#if defined(RTE_ARCH_X86) && defined(CC_AVX512_SUPPORT) + if (packed_vec) { + hw->packed_vec_rx = 1; + hw->packed_vec_tx = 1; + } +#else + if (packed_vec) + PMD_INIT_LOG(ERR, "building environment not match vectorized " + "packed ring datapath requirement"); +#endif + if (virtio_user_dev_init(hw->virtio_user_dev, path, queues, cq, queue_size, mac_addr, &ifname, server_mode, mrg_rxbuf, in_order, packed_vq) < 0) { @@ -777,4 +801,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_virtio_user, "server=<0|1> " "mrg_rxbuf=<0|1> " "in_order=<0|1> " - "packed_vq=<0|1>"); + "packed_vq=<0|1>" + "packed_vec=<0|1>"); -- 2.17.1