]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
um: virtio_uml: query the number of vqs if supported
authorBenjamin Berg <benjamin.berg@intel.com>
Sun, 3 Nov 2024 21:28:54 +0000 (22:28 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 7 Nov 2024 17:05:07 +0000 (18:05 +0100)
When the VHOST_USER_PROTOCOL_F_MQ protocol feature flag is set, we can
query the maximum number of virtual queues. Do so when supported and
extend the check to verify that we are not trying to allocate more
queues.

Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Link: https://patch.msgid.link/20241103212854.1436046-5-benjamin@sipsolutions.net
[add a message to the WARN_ON]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
arch/um/drivers/vhost_user.h
arch/um/drivers/virtio_uml.c

index 6f147cd3c9f76a81995a8229c6eac01c1f8c5227..fcfa3b7e021bae961cd76d830929b03b70ac5562 100644 (file)
@@ -10,6 +10,7 @@
 /* Feature bits */
 #define VHOST_USER_F_PROTOCOL_FEATURES 30
 /* Protocol feature bits */
+#define VHOST_USER_PROTOCOL_F_MQ                       0
 #define VHOST_USER_PROTOCOL_F_REPLY_ACK                        3
 #define VHOST_USER_PROTOCOL_F_SLAVE_REQ                        5
 #define VHOST_USER_PROTOCOL_F_CONFIG                   9
@@ -23,7 +24,8 @@
 /* Supported transport features */
 #define VHOST_USER_SUPPORTED_F         BIT_ULL(VHOST_USER_F_PROTOCOL_FEATURES)
 /* Supported protocol features */
-#define VHOST_USER_SUPPORTED_PROTOCOL_F        (BIT_ULL(VHOST_USER_PROTOCOL_F_REPLY_ACK) | \
+#define VHOST_USER_SUPPORTED_PROTOCOL_F        (BIT_ULL(VHOST_USER_PROTOCOL_F_MQ) | \
+                                        BIT_ULL(VHOST_USER_PROTOCOL_F_REPLY_ACK) | \
                                         BIT_ULL(VHOST_USER_PROTOCOL_F_SLAVE_REQ) | \
                                         BIT_ULL(VHOST_USER_PROTOCOL_F_CONFIG) | \
                                         BIT_ULL(VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS))
index 0f9efee4c671a714291cda85e91ec3095a61fa91..cc3be48a9d6eb0037ed0086197fe21f663eea288 100644 (file)
@@ -56,6 +56,7 @@ struct virtio_uml_device {
        int sock, req_fd, irq;
        u64 features;
        u64 protocol_features;
+       u64 max_vqs;
        u8 status;
        u8 registered:1;
        u8 suspended:1;
@@ -341,6 +342,17 @@ static int vhost_user_set_protocol_features(struct virtio_uml_device *vu_dev,
                                   protocol_features);
 }
 
+static int vhost_user_get_queue_num(struct virtio_uml_device *vu_dev,
+                                   u64 *queue_num)
+{
+       int rc = vhost_user_send_no_payload(vu_dev, true,
+                       VHOST_USER_GET_QUEUE_NUM);
+
+       if (rc)
+               return rc;
+       return vhost_user_recv_u64(vu_dev, queue_num);
+}
+
 static void vhost_user_reply(struct virtio_uml_device *vu_dev,
                             struct vhost_user_msg *msg, int response)
 {
@@ -514,6 +526,15 @@ static int vhost_user_init(struct virtio_uml_device *vu_dev)
                        return rc;
        }
 
+       if (vu_dev->protocol_features &
+                       BIT_ULL(VHOST_USER_PROTOCOL_F_MQ)) {
+               rc = vhost_user_get_queue_num(vu_dev, &vu_dev->max_vqs);
+               if (rc)
+                       return rc;
+       } else {
+               vu_dev->max_vqs = U64_MAX;
+       }
+
        return 0;
 }
 
@@ -1018,7 +1039,9 @@ static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
        struct virtqueue *vq;
 
        /* not supported for now */
-       if (WARN_ON(nvqs > 64))
+       if (WARN(nvqs > 64 || nvqs > vu_dev->max_vqs,
+                "%d VQs requested, only up to 64 or %lld supported\n",
+                nvqs, vu_dev->max_vqs))
                return -EINVAL;
 
        rc = vhost_user_set_mem_table(vu_dev);