在 2022/4/6 上午11:43, Xuan Zhuo 写道:
find_vqs() adds a new parameter sizes to specify the size of each vq
vring.

0 means use the maximum size supported by the backend.


Does this mean driver still need to prepare a array of 0 or it can simply pass NULL to find_vqs()?

Thanks



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 <xuanz...@linux.alibaba.com>
Acked-by: Hans de Goede <hdego...@redhat.com>
Reviewed-by: Mathieu Poirier <mathieu.poir...@linaro.org>
---
  arch/um/drivers/virtio_uml.c             |  2 +-
  drivers/platform/mellanox/mlxbf-tmfifo.c |  1 +
  drivers/remoteproc/remoteproc_virtio.c   |  1 +
  drivers/s390/virtio/virtio_ccw.c         |  1 +
  drivers/virtio/virtio_mmio.c             |  1 +
  drivers/virtio/virtio_pci_common.c       |  2 +-
  drivers/virtio/virtio_pci_common.h       |  2 +-
  drivers/virtio/virtio_pci_modern.c       |  7 +++++--
  drivers/virtio/virtio_vdpa.c             |  1 +
  include/linux/virtio_config.h            | 14 +++++++++-----
  10 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
index 904993d15a85..6af98d130840 100644
--- a/arch/um/drivers/virtio_uml.c
+++ b/arch/um/drivers/virtio_uml.c
@@ -998,7 +998,7 @@ static struct virtqueue *vu_setup_vq(struct virtio_device 
*vdev,
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);
diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c 
b/drivers/platform/mellanox/mlxbf-tmfifo.c
index 1ae3c56b66b0..8be13d416f48 100644
--- a/drivers/platform/mellanox/mlxbf-tmfifo.c
+++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
@@ -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)
  {
diff --git a/drivers/remoteproc/remoteproc_virtio.c 
b/drivers/remoteproc/remoteproc_virtio.c
index 7611755d0ae2..baad31c9da45 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -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)
  {
diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
index 468da60b56c5..f0c814a54e78 100644
--- a/drivers/s390/virtio/virtio_ccw.c
+++ b/drivers/s390/virtio/virtio_ccw.c
@@ -634,6 +634,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)
  {
diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
index a41abc8051b9..9d5a674bdeec 100644
--- a/drivers/virtio/virtio_mmio.c
+++ b/drivers/virtio/virtio_mmio.c
@@ -461,6 +461,7 @@ static int vm_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)
  {
diff --git a/drivers/virtio/virtio_pci_common.c 
b/drivers/virtio/virtio_pci_common.c
index 863d3a8a0956..826ea2e35d54 100644
--- a/drivers/virtio/virtio_pci_common.c
+++ b/drivers/virtio/virtio_pci_common.c
@@ -427,7 +427,7 @@ static int vp_find_vqs_intx(struct virtio_device *vdev, 
unsigned nvqs,
  /* the config->find_vqs() implementation */
  int vp_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)
  {
        int err;
diff --git a/drivers/virtio/virtio_pci_common.h 
b/drivers/virtio/virtio_pci_common.h
index 23f6c5c678d5..859eed559e10 100644
--- a/drivers/virtio/virtio_pci_common.h
+++ b/drivers/virtio/virtio_pci_common.h
@@ -113,7 +113,7 @@ void vp_del_vqs(struct virtio_device *vdev);
  /* the config->find_vqs() implementation */
  int vp_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);
  const char *vp_bus_name(struct virtio_device *vdev);
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
index cb5d38f1c9c8..3b35e5056165 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -343,12 +343,15 @@ static struct virtqueue *setup_vq(struct 
virtio_pci_device *vp_dev,
  static int vp_modern_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_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;
diff --git a/drivers/virtio/virtio_vdpa.c b/drivers/virtio/virtio_vdpa.c
index 39e4c08eb0f2..ac86d3a6633c 100644
--- a/drivers/virtio/virtio_vdpa.c
+++ b/drivers/virtio/virtio_vdpa.c
@@ -269,6 +269,7 @@ static int virtio_vdpa_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)
  {
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index d4adcd0e1c57..0f7def7ddfd2 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -57,6 +57,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().
   * @get_features: get the array of feature bits for this device.
@@ -98,7 +99,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 *);
        u64 (*get_features)(struct virtio_device *vdev);
@@ -206,7 +209,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;
@@ -218,7 +221,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
@@ -227,8 +231,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);
  }
/**


_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

Reply via email to