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

Reply via email to