net/virtio: split virtio-user start
authorMaxime Coquelin <maxime.coquelin@redhat.com>
Tue, 29 Sep 2020 16:14:03 +0000 (18:14 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 30 Sep 2020 21:16:56 +0000 (23:16 +0200)
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.coquelin@redhat.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
drivers/net/virtio/virtio_user/virtio_user_dev.c
drivers/net/virtio/virtio_user/virtio_user_dev.h
drivers/net/virtio/virtio_user_ethdev.c

index ded44bf..6342465 100644 (file)
@@ -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);
index 1c8c98b..3e9d1a1 100644 (file)
@@ -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,
index 3a51afd..f56fc23 100644 (file)
@@ -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)