virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max,min}
authorWu Zongyong <wuzongyong@linux.alibaba.com>
Fri, 29 Oct 2021 09:14:47 +0000 (17:14 +0800)
committerMichael S. Tsirkin <mst@redhat.com>
Mon, 1 Nov 2021 08:30:35 +0000 (04:30 -0400)
For the devices which implement the get_vq_num_min callback, the driver
should not negotiate with virtqueue size with the backend vdpa device if
the value returned by get_vq_num_min equals to the value returned by
get_vq_num_max.
This is useful for vdpa devices based on legacy virtio specfication.

Signed-off-by: Wu Zongyong <wuzongyong@linux.alibaba.com>
Link: https://lore.kernel.org/r/bc0551cec6c3f3dd9424b678b7c22d882aebab3a.1635493219.git.wuzongyong@linux.alibaba.com
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
drivers/virtio/virtio_vdpa.c

index 72eaef2caeb14e7e6e254b979ef37a5c71e03693..6b62aaf08cc53e07fba7e2b09f81b7340a60314b 100644 (file)
@@ -145,7 +145,8 @@ virtio_vdpa_setup_vq(struct virtio_device *vdev, unsigned int index,
        /* Assume split virtqueue, switch to packed if necessary */
        struct vdpa_vq_state state = {0};
        unsigned long flags;
-       u32 align, num;
+       u32 align, max_num, min_num = 1;
+       bool may_reduce_num = true;
        int err;
 
        if (!name)
@@ -163,16 +164,21 @@ virtio_vdpa_setup_vq(struct virtio_device *vdev, unsigned int index,
        if (!info)
                return ERR_PTR(-ENOMEM);
 
-       num = ops->get_vq_num_max(vdpa);
-       if (num == 0) {
+       max_num = ops->get_vq_num_max(vdpa);
+       if (max_num == 0) {
                err = -ENOENT;
                goto error_new_virtqueue;
        }
 
+       if (ops->get_vq_num_min)
+               min_num = ops->get_vq_num_min(vdpa);
+
+       may_reduce_num = (max_num == min_num) ? false : true;
+
        /* Create the vring */
        align = ops->get_vq_align(vdpa);
-       vq = vring_create_virtqueue(index, num, align, vdev,
-                                   true, true, ctx,
+       vq = vring_create_virtqueue(index, max_num, align, vdev,
+                                   true, may_reduce_num, ctx,
                                    virtio_vdpa_notify, callback, name);
        if (!vq) {
                err = -ENOMEM;