> -----Original Message-----
> From: Maxime Coquelin <maxime.coque...@redhat.com>
> Sent: Wednesday, September 30, 2020 12:14 AM
> 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: [PATCH v3 7/8] net/virtio: split virtio-user start
> 
> Move feature bit settings in device start out as an standalone
> function, so that feature bit could be negotiated at device
> feature_ok status.
> 
> Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
> ---
>  .../net/virtio/virtio_user/virtio_user_dev.c  | 50 ++++++++++++-------
>  .../net/virtio/virtio_user/virtio_user_dev.h  |  1 +
>  drivers/net/virtio/virtio_user_ethdev.c       |  4 ++
>  3 files changed, 37 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> index ded44bf32b..63424656e3 100644
> --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> @@ -112,25 +112,11 @@ virtio_user_queue_setup(struct virtio_user_dev *dev,
>  }
> 
>  int
> -virtio_user_start_device(struct virtio_user_dev *dev)
> +virtio_user_dev_set_features(struct virtio_user_dev *dev)
>  {
>       uint64_t features;
> -     int ret;
> +     int ret = -1;
> 
> -     /*
> -      * XXX workaround!
> -      *
> -      * We need to make sure that the locks will be
> -      * taken in the correct order to avoid deadlocks.
> -      *
> -      * Before releasing this lock, this thread should
> -      * not trigger any memory hotplug events.
> -      *
> -      * This is a temporary workaround, and should be
> -      * replaced when we get proper supports from the
> -      * memory subsystem in the future.
> -      */
> -     rte_mcfg_mem_read_lock();
>       pthread_mutex_lock(&dev->mutex);
> 
>       if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER &&
> @@ -141,10 +127,8 @@ virtio_user_start_device(struct virtio_user_dev *dev)
>       if (virtio_user_queue_setup(dev, virtio_user_create_queue) < 0)
>               goto error;
> 
> -     /* Step 1: negotiate protocol features & set features */
>       features = dev->features;
> 
> -
>       /* Strip VIRTIO_NET_F_MAC, as MAC address is handled in vdev init */
>       features &= ~(1ull << VIRTIO_NET_F_MAC);
>       /* Strip VIRTIO_NET_F_CTRL_VQ, as devices do not really need to know
> */
> @@ -154,6 +138,36 @@ virtio_user_start_device(struct virtio_user_dev *dev)
>       if (ret < 0)
>               goto error;
>       PMD_DRV_LOG(INFO, "set features: %" PRIx64, features);
> +error:
> +     pthread_mutex_unlock(&dev->mutex);
> +
> +     return ret;
> +}
> +
> +int
> +virtio_user_start_device(struct virtio_user_dev *dev)
> +{
> +     int ret;
> +
> +     /*
> +      * XXX workaround!
> +      *
> +      * We need to make sure that the locks will be
> +      * taken in the correct order to avoid deadlocks.
> +      *
> +      * Before releasing this lock, this thread should
> +      * not trigger any memory hotplug events.
> +      *
> +      * This is a temporary workaround, and should be
> +      * replaced when we get proper supports from the
> +      * memory subsystem in the future.
> +      */
> +     rte_mcfg_mem_read_lock();
> +     pthread_mutex_lock(&dev->mutex);
> +
> +     if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER &&
> +                     dev->vhostfd < 0)
> +             goto error;
> 
>       /* Step 2: share memory regions */
>       ret = dev->ops->send_request(dev, VHOST_USER_SET_MEM_TABLE, NULL);
> diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h
> b/drivers/net/virtio/virtio_user/virtio_user_dev.h
> index 1c8c98b1cd..3e9d1a1eb3 100644
> --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h
> +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h
> @@ -68,6 +68,7 @@ struct virtio_user_dev {
>       bool            started;
>  };
> 
> +int virtio_user_dev_set_features(struct virtio_user_dev *dev);
>  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,
> diff --git a/drivers/net/virtio/virtio_user_ethdev.c
> b/drivers/net/virtio/virtio_user_ethdev.c
> index 3a51afd711..f56fc238c4 100644
> --- a/drivers/net/virtio/virtio_user_ethdev.c
> +++ b/drivers/net/virtio/virtio_user_ethdev.c
> @@ -269,7 +269,11 @@ static void
>  virtio_user_set_status(struct virtio_hw *hw, uint8_t status)
>  {
>       struct virtio_user_dev *dev = virtio_user_get_dev(hw);
> +     uint8_t old_status = dev->status;
> 
> +     if (status & VIRTIO_CONFIG_STATUS_FEATURES_OK &&
> +                     ~old_status & VIRTIO_CONFIG_STATUS_FEATURES_OK)
> +             virtio_user_dev_set_features(dev);
>       if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK)
>               virtio_user_start_device(dev);
>       else if (status == VIRTIO_CONFIG_STATUS_RESET)
> --
> 2.26.2

Reviewed-by: Chenbo Xia <chenbo....@intel.com>

Reply via email to