]> git.droids-corp.org - dpdk.git/commitdiff
net/virtio-user: do not assume vhost status feature
authorAdrian Moreno <amorenoz@redhat.com>
Mon, 26 Oct 2020 16:39:29 +0000 (17:39 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 3 Nov 2020 22:35:05 +0000 (23:35 +0100)
There are some status reads and updates that need to happen before the
protocol features are negotiated. Therefore, assuming the backend does
support this feature can lead to failures.

On server mode, do not assume the backend supports
VHOST_USER_PROTOCOL_F_STATUS. Activate it back on reconnection and
clear it on disconnection.

Fixes: 57912824615f ("net/virtio-user: support vhost status setting")
Cc: stable@dpdk.org
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
drivers/net/virtio/virtio_user/virtio_user_dev.c
drivers/net/virtio/virtio_user_ethdev.c

index 36e5619dfc4ef59b198ab68bc5f162a2155e0a37..053f0267ca40ea051b149b2f5f7ab299519d65a3 100644 (file)
@@ -523,6 +523,12 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
                 * later.
                 */
                dev->device_features = VIRTIO_USER_SUPPORTED_FEATURES;
+
+               /* We cannot assume VHOST_USER_PROTOCOL_F_STATUS is supported
+                * until it's negotiated
+                */
+               dev->protocol_features &=
+                       ~(1ULL << VHOST_USER_PROTOCOL_F_STATUS);
        }
 
 
index 97ddc56517997f1ae3022bd2d8b669f5d7cdaf78..142bdc0bd80a0c07aedef2907ae409e79b4aa778 100644 (file)
@@ -92,6 +92,9 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev)
                                        &protocol_features))
                        return -1;
 
+               /* Offer VHOST_USER_PROTOCOL_F_STATUS */
+               dev->protocol_features |=
+                       (1ULL << VHOST_USER_PROTOCOL_F_STATUS);
                dev->protocol_features &= protocol_features;
 
                if (dev->ops->send_request(dev,
@@ -168,6 +171,11 @@ virtio_user_delayed_handler(void *param)
                if (dev->vhostfd >= 0) {
                        close(dev->vhostfd);
                        dev->vhostfd = -1;
+                       /* Until the featuers are negotiated again, don't assume
+                        * the backend supports VHOST_USER_PROTOCOL_F_STATUS
+                        */
+                       dev->protocol_features &=
+                               ~(1ULL << VHOST_USER_PROTOCOL_F_STATUS);
                }
                eth_dev->intr_handle->fd = dev->listenfd;
                rte_intr_callback_register(eth_dev->intr_handle,