From f908b22ea47a84bd1cb5c644bc12f5307721cea6 Mon Sep 17 00:00:00 2001 From: Adrian Moreno Date: Tue, 29 Sep 2020 18:13:59 +0200 Subject: [PATCH] net/virtio: move backend type selection to ethdev This is a preparation patch with no functional change. Use an enum instead of a boolean for the backend type. Move the detection logic to the ethdev layer (where it is needed for the first time). The virtio_user_dev stores the backend type in the virtio_user_dev struct so the type is only determined once Signed-off-by: Maxime Coquelin Signed-off-by: Adrian Moreno Reviewed-by: Chenbo Xia --- .../net/virtio/virtio_user/virtio_user_dev.c | 37 ++++++++----------- .../net/virtio/virtio_user/virtio_user_dev.h | 11 +++++- drivers/net/virtio/virtio_user_ethdev.c | 28 +++++++++++++- 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 2a0c861085..b79a9f84aa 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -111,17 +111,6 @@ virtio_user_queue_setup(struct virtio_user_dev *dev, return 0; } -int -is_vhost_user_by_type(const char *path) -{ - struct stat sb; - - if (stat(path, &sb) == -1) - return 0; - - return S_ISSOCK(sb.st_mode); -} - int virtio_user_start_device(struct virtio_user_dev *dev) { @@ -144,7 +133,8 @@ virtio_user_start_device(struct virtio_user_dev *dev) rte_mcfg_mem_read_lock(); pthread_mutex_lock(&dev->mutex); - if (is_vhost_user_by_type(dev->path) && dev->vhostfd < 0) + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER && + dev->vhostfd < 0) goto error; /* Step 0: tell vhost to create queues */ @@ -360,16 +350,16 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) dev->tapfds = NULL; if (dev->is_server) { - if (access(dev->path, F_OK) == 0 && - !is_vhost_user_by_type(dev->path)) { - PMD_DRV_LOG(ERR, "Server mode doesn't support vhost-kernel!"); + if (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) { + PMD_DRV_LOG(ERR, "Server mode only supports vhost-user!"); return -1; } dev->ops = &virtio_ops_user; } else { - if (is_vhost_user_by_type(dev->path)) { + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) { dev->ops = &virtio_ops_user; - } else { + } else if (dev->backend_type == + VIRTIO_USER_BACKEND_VHOST_KERNEL) { dev->ops = &virtio_ops_kernel; dev->vhostfds = malloc(dev->max_queue_pairs * @@ -430,7 +420,8 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, int cq, int queue_size, const char *mac, char **ifname, - int server, int mrg_rxbuf, int in_order, int packed_vq) + int server, int mrg_rxbuf, int in_order, int packed_vq, + enum virtio_user_backend_type backend_type) { uint64_t protocol_features = 0; @@ -445,6 +436,8 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, dev->frontend_features = 0; dev->unsupported_features = ~VIRTIO_USER_SUPPORTED_FEATURES; dev->protocol_features = VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES; + dev->backend_type = backend_type; + parse_mac(dev, mac); if (*ifname) { @@ -457,7 +450,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, return -1; } - if (!is_vhost_user_by_type(dev->path)) + if (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) dev->unsupported_features |= (1ULL << VHOST_USER_F_PROTOCOL_FEATURES); @@ -539,7 +532,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, } /* The backend will not report this feature, we add it explicitly */ - if (is_vhost_user_by_type(dev->path)) + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) dev->frontend_features |= (1ull << VIRTIO_NET_F_STATUS); /* @@ -792,7 +785,7 @@ virtio_user_send_status_update(struct virtio_user_dev *dev, uint8_t status) uint64_t arg = status; /* Vhost-user only for now */ - if (!is_vhost_user_by_type(dev->path)) + if (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) return 0; if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) @@ -815,7 +808,7 @@ virtio_user_update_status(struct virtio_user_dev *dev) int err; /* Vhost-user only for now */ - if (!is_vhost_user_by_type(dev->path)) + if (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) return 0; if (!(dev->protocol_features & (1UL << VHOST_USER_PROTOCOL_F_STATUS))) diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index 9377d5ba66..575bf430c0 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -10,6 +10,12 @@ #include "../virtio_pci.h" #include "../virtio_ring.h" +enum virtio_user_backend_type { + VIRTIO_USER_BACKEND_UNKNOWN, + VIRTIO_USER_BACKEND_VHOST_USER, + VIRTIO_USER_BACKEND_VHOST_KERNEL, +}; + struct virtio_user_queue { uint16_t used_idx; bool avail_wrap_counter; @@ -17,6 +23,7 @@ struct virtio_user_queue { }; struct virtio_user_dev { + enum virtio_user_backend_type backend_type; /* for vhost_user backend */ int vhostfd; int listenfd; /* listening fd */ @@ -60,13 +67,13 @@ struct virtio_user_dev { bool started; }; -int is_vhost_user_by_type(const char *path); int virtio_user_start_device(struct virtio_user_dev *dev); int virtio_user_stop_device(struct virtio_user_dev *dev); int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, int cq, int queue_size, const char *mac, char **ifname, int server, int mrg_rxbuf, int in_order, - int packed_vq); + int packed_vq, + enum virtio_user_backend_type backend_type); void virtio_user_dev_uninit(struct virtio_user_dev *dev); void virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx); void virtio_user_handle_cq_packed(struct virtio_user_dev *dev, diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 60d17af888..38b49bad5f 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -518,6 +519,19 @@ get_integer_arg(const char *key __rte_unused, return -errno; } +static enum virtio_user_backend_type +virtio_user_backend_type(const char *path) +{ + struct stat sb; + + if (stat(path, &sb) == -1) + return VIRTIO_USER_BACKEND_UNKNOWN; + + return S_ISSOCK(sb.st_mode) ? + VIRTIO_USER_BACKEND_VHOST_USER : + VIRTIO_USER_BACKEND_VHOST_KERNEL; +} + static struct rte_eth_dev * virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev) { @@ -579,6 +593,7 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev) struct rte_kvargs *kvlist = NULL; struct rte_eth_dev *eth_dev; struct virtio_hw *hw; + enum virtio_user_backend_type backend_type = VIRTIO_USER_BACKEND_UNKNOWN; uint64_t queues = VIRTIO_USER_DEF_Q_NUM; uint64_t cq = VIRTIO_USER_DEF_CQ_EN; uint64_t queue_size = VIRTIO_USER_DEF_Q_SZ; @@ -631,8 +646,17 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev) goto end; } + backend_type = virtio_user_backend_type(path); + if (backend_type == VIRTIO_USER_BACKEND_UNKNOWN) { + PMD_INIT_LOG(ERR, + "unable to determine backend type for path %s", + path); + goto end; + } + + if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_INTERFACE_NAME) == 1) { - if (is_vhost_user_by_type(path)) { + if (backend_type != VIRTIO_USER_BACKEND_VHOST_KERNEL) { PMD_INIT_LOG(ERR, "arg %s applies only to vhost-kernel backend", VIRTIO_USER_ARG_INTERFACE_NAME); @@ -751,7 +775,7 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev) hw = eth_dev->data->dev_private; 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) { + mrg_rxbuf, in_order, packed_vq, backend_type) < 0) { PMD_INIT_LOG(ERR, "virtio_user_dev_init fails"); virtio_user_eth_dev_free(eth_dev); goto end; -- 2.20.1