virtio: record the maximum queue num supported by the device.
authorXuan Zhuo <xuanzhuo@linux.alibaba.com>
Mon, 1 Aug 2022 06:38:21 +0000 (14:38 +0800)
committerMichael S. Tsirkin <mst@redhat.com>
Thu, 11 Aug 2022 08:06:38 +0000 (04:06 -0400)
virtio-net can display the maximum (supported by hardware) ring size in
ethtool -g eth0.

When the subsequent patch implements vring reset, it can judge whether
the ring size passed by the driver is legal based on this.

Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Message-Id: <20220801063902.129329-2-xuanzhuo@linux.alibaba.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
arch/um/drivers/virtio_uml.c
drivers/platform/mellanox/mlxbf-tmfifo.c
drivers/remoteproc/remoteproc_virtio.c
drivers/s390/virtio/virtio_ccw.c
drivers/virtio/virtio_mmio.c
drivers/virtio/virtio_pci_legacy.c
drivers/virtio/virtio_pci_modern.c
drivers/virtio/virtio_vdpa.c
include/linux/virtio.h

index 82ff3785bf69f96394d5fb9aad1588f14450cba3..e719af8bdf56d3e9b6f98e0cf685f1ef0a78715d 100644 (file)
@@ -958,6 +958,7 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
                goto error_create;
        }
        vq->priv = info;
+       vq->num_max = num;
        num = virtqueue_get_vring_size(vq);
 
        if (vu_dev->protocol_features &
index 38800e86ed8ad47371abe6f4459b259137a85c0f..1ae3c56b66b097797f69b5af07c2e5993e597bdd 100644 (file)
@@ -959,6 +959,8 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
                        goto error;
                }
 
+               vq->num_max = vring->num;
+
                vqs[i] = vq;
                vring->vq = vq;
                vq->priv = vring;
index d43d74733f0a6bce845e9e6017f80066470bd2a1..0f7706e23eb91f8a578c2db0bea9f56e93351c64 100644 (file)
@@ -125,6 +125,8 @@ static struct virtqueue *rp_find_vq(struct virtio_device *vdev,
                return ERR_PTR(-ENOMEM);
        }
 
+       vq->num_max = num;
+
        rvring->vq = vq;
        vq->priv = rvring;
 
index 161d3b141f0d353db30a43583e1cc544ee994a0d..6b86d0280d6b185856d25ebfdf4e07643e21eae4 100644 (file)
@@ -530,6 +530,9 @@ static struct virtqueue *virtio_ccw_setup_vq(struct virtio_device *vdev,
                err = -ENOMEM;
                goto out_err;
        }
+
+       vq->num_max = info->num;
+
        /* it may have been reduced */
        info->num = virtqueue_get_vring_size(vq);
 
index 945cb8fb60b68a0e90f1080086cd4a830a386063..3ff746e3f24aa0306b4ce715acbd3980d6e59908 100644 (file)
@@ -403,6 +403,8 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
                goto error_new_virtqueue;
        }
 
+       vq->num_max = num;
+
        /* Activate the queue */
        writel(virtqueue_get_vring_size(vq), vm_dev->base + VIRTIO_MMIO_QUEUE_NUM);
        if (vm_dev->version == 1) {
index a5e5721145c72db600e8bee0aff4d14d4dbff3e2..2257f1b3d8ae1b5561b154955ce860d17c176944 100644 (file)
@@ -135,6 +135,8 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
        if (!vq)
                return ERR_PTR(-ENOMEM);
 
+       vq->num_max = num;
+
        q_pfn = virtqueue_get_desc_addr(vq) >> VIRTIO_PCI_QUEUE_ADDR_SHIFT;
        if (q_pfn >> 32) {
                dev_err(&vp_dev->pci_dev->dev,
index 623906b4996c767586c0a25411665d332a071988..e7e0b8c850f6aa898ceb15e58b0bd202ae041f1c 100644 (file)
@@ -218,6 +218,8 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
        if (!vq)
                return ERR_PTR(-ENOMEM);
 
+       vq->num_max = num;
+
        /* activate the queue */
        vp_modern_set_queue_size(mdev, index, virtqueue_get_vring_size(vq));
        vp_modern_queue_address(mdev, index, virtqueue_get_desc_addr(vq),
index c40f7deb6b5ac1750756a9fefb22ee37ea27a191..9670cc79371d870c724d560ce2494584ad017883 100644 (file)
@@ -183,6 +183,8 @@ virtio_vdpa_setup_vq(struct virtio_device *vdev, unsigned int index,
                goto error_new_virtqueue;
        }
 
+       vq->num_max = max_num;
+
        /* Setup virtqueue callback */
        cb.callback = callback ? virtio_vdpa_virtqueue_cb : NULL;
        cb.private = info;
index d8fdf170637c9a11b317e7795fff7fe0b8c12ee8..129bde7521e301324dcf6cd4dabe72d306ee7af4 100644 (file)
@@ -19,6 +19,7 @@
  * @priv: a pointer for the virtqueue implementation to use.
  * @index: the zero-based ordinal number for this queue.
  * @num_free: number of elements we expect to be able to fit.
+ * @num_max: the maximum number of elements supported by the device.
  *
  * A note on @num_free: with indirect buffers, each buffer needs one
  * element in the queue, otherwise a buffer will need one element per
@@ -31,6 +32,7 @@ struct virtqueue {
        struct virtio_device *vdev;
        unsigned int index;
        unsigned int num_free;
+       unsigned int num_max;
        void *priv;
 };