Correct my typo issue that vhost-user can't launch with client mode. BR, Yinan
> -----Original Message----- > From: Wang, Yinan > Sent: 2020?10?16? 13:42 > To: Maxime Coquelin <maxime.coque...@redhat.com>; dev@dpdk.org; Xia, > Chenbo <chenbo....@intel.com>; Fu, Patrick <patrick...@intel.com>; > amore...@redhat.com > Subject: RE: [dpdk-dev] [PATCH v3 3/8] net/virtio: move backend type selection > to ethdev > > Hi Adrian, > > This patch introduce a regression issue that vhost-user can't launch with > server > mode, details in https://bugs.dpdk.org/show_bug.cgi?id=559. > This issue blocked amount of regression cases, could you help to take a look? > Thanks in advance! > > > BR, > Yinan > > > > -----Original Message----- > > From: dev <dev-boun...@dpdk.org> On Behalf Of Maxime Coquelin > > Sent: 2020?9?30? 0:14 > > To: dev@dpdk.org; Xia, Chenbo <chenbo....@intel.com>; Fu, Patrick > > <patrick...@intel.com>; amore...@redhat.com > > Cc: Maxime Coquelin <maxime.coque...@redhat.com> > > Subject: [dpdk-dev] [PATCH v3 3/8] net/virtio: move backend type selection > > to > > ethdev > > > > From: Adrian Moreno <amore...@redhat.com> > > > > 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 <maxime.coque...@redhat.com> > > Signed-off-by: Adrian Moreno <amore...@redhat.com> > > --- > > .../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 <sys/types.h> > > #include <unistd.h> > > #include <fcntl.h> > > +#include <sys/stat.h> > > #include <sys/socket.h> > > > > #include <rte_malloc.h> > > @@ -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.26.2