[PATCH vhost v6 3/6] virtio: find_vqs: pass struct instead of multi parameters

Jason Wang jasowang at redhat.com
Wed Mar 27 21:26:46 PDT 2024


On Wed, Mar 27, 2024 at 5:57 PM Xuan Zhuo <xuanzhuo at linux.alibaba.com> wrote:
>
> Now, we pass multi parameters to find_vqs. These parameters
> may work for transport or work for vring.
>
> And find_vqs has multi implements in many places:
>
>  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
>
> Every time, we try to add a new parameter, that is difficult.
> We must change every find_vqs implement.
>
> One the other side, if we want to pass a parameter to vring,
> we must change the call path from transport to vring.
> Too many functions need to be changed.
>
> So it is time to refactor the find_vqs. We pass a structure
> cfg to find_vqs(), that will be passed to vring by transport.
>
> Because the vp_modern_create_avq() use the "const char *names[]",
> and the virtio_uml.c changes the name in the subsequent commit, so
> change the "names" inside the virtio_vq_config from "const char *const
> *names" to "const char **names".
>
> Signed-off-by: Xuan Zhuo <xuanzhuo at linux.alibaba.com>
> Acked-by: Johannes Berg <johannes at sipsolutions.net>
> Reviewed-by: Ilpo Järvinen <ilpo.jarvinen at linux.intel.com>
> ---
>  arch/um/drivers/virtio_uml.c             | 22 +++----
>  drivers/platform/mellanox/mlxbf-tmfifo.c | 13 ++--
>  drivers/remoteproc/remoteproc_virtio.c   | 25 ++++----
>  drivers/s390/virtio/virtio_ccw.c         | 28 ++++-----
>  drivers/virtio/virtio_mmio.c             | 26 ++++----
>  drivers/virtio/virtio_pci_common.c       | 57 ++++++++----------
>  drivers/virtio/virtio_pci_common.h       |  9 +--
>  drivers/virtio/virtio_pci_legacy.c       | 11 ++--
>  drivers/virtio/virtio_pci_modern.c       | 32 ++++++----
>  drivers/virtio/virtio_vdpa.c             | 33 +++++-----
>  include/linux/virtio_config.h            | 76 ++++++++++++++++++------
>  11 files changed, 175 insertions(+), 157 deletions(-)
>
> diff --git a/arch/um/drivers/virtio_uml.c b/arch/um/drivers/virtio_uml.c
> index 773f9fc4d582..adc619362cc0 100644
> --- a/arch/um/drivers/virtio_uml.c
> +++ b/arch/um/drivers/virtio_uml.c
> @@ -937,8 +937,8 @@ static int vu_setup_vq_call_fd(struct virtio_uml_device *vu_dev,
>  }
>
>  static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
> -                                    unsigned index, vq_callback_t *callback,
> -                                    const char *name, bool ctx)
> +                                    unsigned index,
> +                                    struct virtio_vq_config *cfg)
>  {
>         struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
>         struct platform_device *pdev = vu_dev->pdev;
> @@ -953,10 +953,12 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
>                 goto error_kzalloc;
>         }
>         snprintf(info->name, sizeof(info->name), "%s.%d-%s", pdev->name,
> -                pdev->id, name);
> +                pdev->id, cfg->names[index]);
>
>         vq = vring_create_virtqueue(index, num, PAGE_SIZE, vdev, true, true,
> -                                   ctx, vu_notify, callback, info->name);
> +                                   cfg->ctx ? cfg->ctx[index] : false,
> +                                   vu_notify,
> +                                   cfg->callbacks[index], info->name);
>         if (!vq) {
>                 rc = -ENOMEM;
>                 goto error_create;
> @@ -1013,12 +1015,11 @@ static struct virtqueue *vu_setup_vq(struct virtio_device *vdev,
>         return ERR_PTR(rc);
>  }
>
> -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,
> -                      struct irq_affinity *desc)
> +static int vu_find_vqs(struct virtio_device *vdev, struct virtio_vq_config *cfg)
>  {
>         struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev);
> +       struct virtqueue **vqs = cfg->vqs;
> +       unsigned int nvqs = cfg->nvqs;
>         struct virtqueue *vq;
>         int i, rc;
>
> @@ -1031,13 +1032,12 @@ static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs,
>                 return rc;
>
>         for (i = 0; i < nvqs; ++i) {
> -               if (!names[i]) {
> +               if (!cfg->names[i]) {
>                         rc = -EINVAL;
>                         goto error_setup;
>                 }
>
> -               vqs[i] = vu_setup_vq(vdev, i, callbacks[i], names[i],
> -                                    ctx ? ctx[i] : false);
> +               vqs[i] = vu_setup_vq(vdev, i, cfg);
>                 if (IS_ERR(vqs[i])) {
>                         rc = PTR_ERR(vqs[i]);
>                         goto error_setup;
> diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c
> index b8d1e32e97eb..4252388f52a2 100644
> --- a/drivers/platform/mellanox/mlxbf-tmfifo.c
> +++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
> @@ -1056,15 +1056,12 @@ static void mlxbf_tmfifo_virtio_del_vqs(struct virtio_device *vdev)
>
>  /* Create and initialize the virtual queues. */
>  static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
> -                                       unsigned int nvqs,
> -                                       struct virtqueue *vqs[],
> -                                       vq_callback_t *callbacks[],
> -                                       const char * const names[],
> -                                       const bool *ctx,
> -                                       struct irq_affinity *desc)
> +                                       struct virtio_vq_config *cfg)
>  {
>         struct mlxbf_tmfifo_vdev *tm_vdev = mlxbf_vdev_to_tmfifo(vdev);
> +       struct virtqueue **vqs = cfg->vqs;
>         struct mlxbf_tmfifo_vring *vring;
> +       unsigned int nvqs = cfg->nvqs;
>         struct virtqueue *vq;
>         int i, ret, size;
>
> @@ -1072,7 +1069,7 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
>                 return -EINVAL;
>
>         for (i = 0; i < nvqs; ++i) {
> -               if (!names[i]) {
> +               if (!cfg->names[i]) {
>                         ret = -EINVAL;
>                         goto error;
>                 }
> @@ -1084,7 +1081,7 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev,
>                 vq = vring_new_virtqueue(i, vring->num, vring->align, vdev,
>                                          false, false, vring->va,
>                                          mlxbf_tmfifo_virtio_notify,
> -                                        callbacks[i], names[i]);
> +                                        cfg->callbacks[i], cfg->names[i]);
>                 if (!vq) {
>                         dev_err(&vdev->dev, "vring_new_virtqueue failed\n");
>                         ret = -ENOMEM;
> diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
> index 8fb5118b6953..489fea1d41c0 100644
> --- a/drivers/remoteproc/remoteproc_virtio.c
> +++ b/drivers/remoteproc/remoteproc_virtio.c
> @@ -102,8 +102,7 @@ EXPORT_SYMBOL(rproc_vq_interrupt);
>
>  static struct virtqueue *rp_find_vq(struct virtio_device *vdev,
>                                     unsigned int id,
> -                                   void (*callback)(struct virtqueue *vq),
> -                                   const char *name, bool ctx)
> +                                   struct virtio_vq_config *cfg)
>  {
>         struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
>         struct rproc *rproc = vdev_to_rproc(vdev);
> @@ -140,10 +139,12 @@ static struct virtqueue *rp_find_vq(struct virtio_device *vdev,
>          * Create the new vq, and tell virtio we're not interested in
>          * the 'weak' smp barriers, since we're talking with a real device.
>          */
> -       vq = vring_new_virtqueue(id, num, rvring->align, vdev, false, ctx,
> -                                addr, rproc_virtio_notify, callback, name);
> +       vq = vring_new_virtqueue(id, num, rvring->align, vdev, false,
> +                                cfg->ctx ? cfg->ctx[id] : false,
> +                                addr, rproc_virtio_notify, cfg->callbacks[id],
> +                                cfg->names[id]);
>         if (!vq) {
> -               dev_err(dev, "vring_new_virtqueue %s failed\n", name);
> +               dev_err(dev, "vring_new_virtqueue %s failed\n", cfg->names[id]);
>                 rproc_free_vring(rvring);
>                 return ERR_PTR(-ENOMEM);
>         }
> @@ -177,23 +178,19 @@ static void rproc_virtio_del_vqs(struct virtio_device *vdev)
>         __rproc_virtio_del_vqs(vdev);
>  }
>
> -static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned int nvqs,
> -                                struct virtqueue *vqs[],
> -                                vq_callback_t *callbacks[],
> -                                const char * const names[],
> -                                const bool * ctx,
> -                                struct irq_affinity *desc)
> +static int rproc_virtio_find_vqs(struct virtio_device *vdev, struct virtio_vq_config *cfg)
>  {
> +       struct virtqueue **vqs = cfg->vqs;
> +       unsigned int nvqs = cfg->nvqs;
>         int i, ret;
>
>         for (i = 0; i < nvqs; ++i) {
> -               if (!names[i]) {
> +               if (!cfg->names[i]) {
>                         ret = -EINVAL;
>                         goto error;
>                 }
>
> -               vqs[i] = rp_find_vq(vdev, i, callbacks[i], names[i],
> -                                   ctx ? ctx[i] : false);
> +               vqs[i] = rp_find_vq(vdev, i, cfg);
>                 if (IS_ERR(vqs[i])) {
>                         ret = PTR_ERR(vqs[i]);
>                         goto error;
> diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
> index 508154705554..3c78122f00f5 100644
> --- a/drivers/s390/virtio/virtio_ccw.c
> +++ b/drivers/s390/virtio/virtio_ccw.c
> @@ -499,9 +499,8 @@ static void virtio_ccw_del_vqs(struct virtio_device *vdev)
>  }
>
>  static struct virtqueue *virtio_ccw_setup_vq(struct virtio_device *vdev,
> -                                            int i, vq_callback_t *callback,
> -                                            const char *name, bool ctx,
> -                                            struct ccw1 *ccw)
> +                                            int i, struct ccw1 *ccw,
> +                                            struct virtio_vq_config *cfg)
>  {
>         struct virtio_ccw_device *vcdev = to_vc_device(vdev);
>         bool (*notify)(struct virtqueue *vq);
> @@ -538,8 +537,11 @@ static struct virtqueue *virtio_ccw_setup_vq(struct virtio_device *vdev,
>         }
>         may_reduce = vcdev->revision > 0;
>         vq = vring_create_virtqueue(i, info->num, KVM_VIRTIO_CCW_RING_ALIGN,
> -                                   vdev, true, may_reduce, ctx,
> -                                   notify, callback, name);
> +                                   vdev, true, may_reduce,
> +                                   cfg->ctx ? cfg->ctx[i] : false,
> +                                   notify,
> +                                   cfg->callbacks[i],
> +                                   cfg->names[i]);
>
>         if (!vq) {
>                 /* For now, we fail if we can't get the requested size. */
> @@ -650,15 +652,13 @@ static int virtio_ccw_register_adapter_ind(struct virtio_ccw_device *vcdev,
>         return ret;
>  }
>
> -static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
> -                              struct virtqueue *vqs[],
> -                              vq_callback_t *callbacks[],
> -                              const char * const names[],
> -                              const bool *ctx,
> -                              struct irq_affinity *desc)
> +static int virtio_ccw_find_vqs(struct virtio_device *vdev,
> +                              struct virtio_vq_config *cfg)
>  {
>         struct virtio_ccw_device *vcdev = to_vc_device(vdev);
> +       struct virtqueue **vqs = cfg->vqs;
>         unsigned long *indicatorp = NULL;
> +       unsigned int nvqs = cfg->nvqs;
>         int ret, i;
>         struct ccw1 *ccw;
>
> @@ -667,14 +667,12 @@ static int virtio_ccw_find_vqs(struct virtio_device *vdev, unsigned nvqs,
>                 return -ENOMEM;
>
>         for (i = 0; i < nvqs; ++i) {
> -               if (!names[i]) {
> +               if (!cfg->names[i]) {
>                         ret = -EINVAL;
>                         goto out;
>                 }
>
> -               vqs[i] = virtio_ccw_setup_vq(vdev, i, callbacks[i],
> -                                            names[i], ctx ? ctx[i] : false,
> -                                            ccw);
> +               vqs[i] = virtio_ccw_setup_vq(vdev, i, ccw, cfg);
>                 if (IS_ERR(vqs[i])) {
>                         ret = PTR_ERR(vqs[i]);
>                         vqs[i] = NULL;
> diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
> index 82ee4a288728..7f0fdc3f51cb 100644
> --- a/drivers/virtio/virtio_mmio.c
> +++ b/drivers/virtio/virtio_mmio.c
> @@ -370,8 +370,7 @@ static void vm_synchronize_cbs(struct virtio_device *vdev)
>  }
>
>  static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int index,
> -                                 void (*callback)(struct virtqueue *vq),
> -                                 const char *name, bool ctx)
> +                                    struct virtio_vq_config *cfg)
>  {
>         struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
>         bool (*notify)(struct virtqueue *vq);
> @@ -386,9 +385,6 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
>         else
>                 notify = vm_notify;
>
> -       if (!name)
> -               return NULL;

Nit: This seems to belong to patch 2.

Acked-by: Jason Wang <jasowang at redhat.com>

Thanks




More information about the linux-um mailing list