[PATCH vhost v6 3/6] virtio: find_vqs: pass struct instead of multi parameters
Xuan Zhuo
xuanzhuo at linux.alibaba.com
Wed Mar 27 23:34:45 PDT 2024
On Thu, 28 Mar 2024 12:26:46 +0800, Jason Wang <jasowang at redhat.com> wrote:
> 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.
YES.
Will fix in next version.
Thanks.
>
> Acked-by: Jason Wang <jasowang at redhat.com>
>
> Thanks
>
More information about the linux-um
mailing list