> -----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>