virtio: find_vqs() add arg sizes
authorXuan Zhuo <xuanzhuo@linux.alibaba.com>
Mon, 1 Aug 2022 06:38:53 +0000 (14:38 +0800)
committerMichael S. Tsirkin <mst@redhat.com>
Thu, 11 Aug 2022 08:06:40 +0000 (04:06 -0400)
find_vqs() adds a new parameter sizes to specify the size of each vq
vring.

NULL as sizes means that all queues in find_vqs() use the maximum size.
A value in the array is 0, which means that the corresponding queue uses
the maximum size.

In the split scenario, the meaning of size is the largest size, because
it may be limited by memory, the virtio core will try a smaller size.
And the size is power of 2.

Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Acked-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Acked-by: Jason Wang <jasowang@redhat.com>
Message-Id: <20220801063902.129329-34-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_common.c
drivers/virtio/virtio_pci_common.h
drivers/virtio/virtio_pci_modern.c
drivers/virtio/virtio_vdpa.c
include/linux/virtio_config.h

index e719af8bdf56d3e9b6f98e0cf685f1ef0a78715d..79e38afd4b91efced1baeb0b9c16f0693d26474a 100644 (file)
@@ -1011,7 +1011,7 @@ error_kzalloc:
 
 static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
                       struct virtqueue *vqs[], vq_callback_t *callbacks[],
-                      const char * const names[], const bool *ctx,
+                      const char * const names[], u32 sizes[], const bool *ctx,
                       struct irq_affinity *desc)
 {
        struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
index 1ae3c56b66b097797f69b5af07c2e5993e597bdd..8be13d416f485d4a9dd17afcf486626591ee690c 100644 (file)
@@ -928,6 +928,7 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
                                        struct virtqueue *vqs[],
                                        vq_callback_t *callbacks[],
                                        const char * const names[],
+                                       u32 sizes[],
                                        const bool *ctx,
                                        struct irq_affinity *desc)
 {
index 0f7706e23eb91f8a578c2db0bea9f56e93351c64..81c4f57761092f8a53aeff941b40df873c6bed5f 100644 (file)
@@ -158,6 +158,7 @@ static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
                                 struct virtqueue *vqs[],
                                 vq_callback_t *callbacks[],
                                 const char * const names[],
+                                u32 sizes[],
                                 const bool * ctx,
                                 struct irq_affinity *desc)
 {
index 6b86d0280d6b185856d25ebfdf4e07643e21eae4..72500cd2dbf51702f971059a7fa6a56f89409633 100644 (file)
@@ -635,6 +635,7 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
                               struct virtqueue *vqs[],
                               vq_callback_t *callbacks[],
                               const char * const names[],
+                              u32 sizes[],
                               const bool *ctx,
                               struct irq_affinity *desc)
 {
index 3ff746e3f24aa0306b4ce715acbd3980d6e59908..dfcecfd7aba113e709fb634036a41c8d41f9bc41 100644 (file)
@@ -474,6 +474,7 @@ static int vm_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
                       struct virtqueue *vqs[],
                       vq_callback_t *callbacks[],
                       const char * const names[],
+                      u32 sizes[],
                       const bool *ctx,
                       struct irq_affinity *desc)
 {
index ad258a9d3b9f453862e454741e099b6ae750a8a3..7ad734584823bc3c9a88df40f20f4d451837567f 100644 (file)
@@ -396,7 +396,7 @@ out_del_vqs:
 /* the config->find_vqs() implementation */
 int vp_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
                struct virtqueue *vqs[], vq_callback_t *callbacks[],
-               const char * const names[], const bool *ctx,
+               const char * const names[], u32 sizes[], const bool *ctx,
                struct irq_affinity *desc)
 {
        int err;
index 23112d84218fbd4f283c69319a1a0039fadcc9a8..a5ff838b85a5c86576071508ce9c0fbaa92afe5e 100644 (file)
@@ -110,7 +110,7 @@ void vp_del_vqs(struct virtio_device *vdev);
 /* the config->find_vqs() implementation */
 int vp_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
                struct virtqueue *vqs[], vq_callback_t *callbacks[],
-               const char * const names[], const bool *ctx,
+               const char * const names[], u32 sizes[], const bool *ctx,
                struct irq_affinity *desc);
 const char *vp_bus_name(struct virtio_device *vdev);
 
index c3b9f27618497a54a13b367445542ae163961918..be51ec84925266560fe6c3a411fbbf63c9653432 100644 (file)
@@ -347,12 +347,15 @@ err:
 static int vp_modern_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
                              struct virtqueue *vqs[],
                              vq_callback_t *callbacks[],
-                             const char * const names[], const bool *ctx,
+                             const char * const names[],
+                             u32 sizes[],
+                             const bool *ctx,
                              struct irq_affinity *desc)
 {
        struct virtio_pci_device *vp_dev = to_vp_device(vdev);
        struct virtqueue *vq;
-       int rc = vp_find_vqs(vdev, nvqs, vqs, callbacks, names, ctx, desc);
+       int rc = vp_find_vqs(vdev, nvqs, vqs, callbacks, names, sizes, ctx,
+                            desc);
 
        if (rc)
                return rc;
index 9670cc79371d870c724d560ce2494584ad017883..832d2c5b1b19ac4925f44a8e2111f45b77f5b118 100644 (file)
@@ -269,6 +269,7 @@ static int virtio_vdpa_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
                                struct virtqueue *vqs[],
                                vq_callback_t *callbacks[],
                                const char * const names[],
+                               u32 sizes[],
                                const bool *ctx,
                                struct irq_affinity *desc)
 {
index 36ec7be1f480c749b388e0ed6aa96755af4d741f..888f7e96f0c728e077a51bc59a01c905c76c35f8 100644 (file)
@@ -55,6 +55,7 @@ struct virtio_shm_region {
  *             include a NULL entry for vqs that do not need a callback
  *     names: array of virtqueue names (mainly for debugging)
  *             include a NULL entry for vqs unused by driver
+ *     sizes: array of virtqueue sizes
  *     Returns 0 on success or error status
  * @del_vqs: free virtqueues found by find_vqs().
  * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
@@ -103,7 +104,9 @@ struct virtio_config_ops {
        void (*reset)(struct virtio_device *vdev);
        int (*find_vqs)(struct virtio_device *, unsigned nvqs,
                        struct virtqueue *vqs[], vq_callback_t *callbacks[],
-                       const char * const names[], const bool *ctx,
+                       const char * const names[],
+                       u32 sizes[],
+                       const bool *ctx,
                        struct irq_affinity *desc);
        void (*del_vqs)(struct virtio_device *);
        void (*synchronize_cbs)(struct virtio_device *);
@@ -212,7 +215,7 @@ struct virtqueue *virtio_find_single_vq(struct virtio_device *vdev,
        const char *names[] = { n };
        struct virtqueue *vq;
        int err = vdev->config->find_vqs(vdev, 1, &vq, callbacks, names, NULL,
-                                        NULL);
+                                        NULL, NULL);
        if (err < 0)
                return ERR_PTR(err);
        return vq;
@@ -224,7 +227,8 @@ int virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
                        const char * const names[],
                        struct irq_affinity *desc)
 {
-       return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, NULL, desc);
+       return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, NULL,
+                                     NULL, desc);
 }
 
 static inline
@@ -233,8 +237,8 @@ int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
                        const char * const names[], const bool *ctx,
                        struct irq_affinity *desc)
 {
-       return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, ctx,
-                                     desc);
+       return vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names, NULL,
+                                     ctx, desc);
 }
 
 /**