On Wed, Apr 19, 2023 at 12:56 AM <peili....@gmail.com> wrote: > > From: Pei Li <peili....@gmail.com> > > Currently, part of the vdpa initialization / startup process > needs to trigger many ioctls per vq, which is very inefficient > and causing unnecessary context switch between user mode and > kernel mode. > > This patch creates an additional ioctl() command, namely > VHOST_VDPA_GET_VRING_GROUP_BATCH, that will batching > commands of VHOST_VDPA_GET_VRING_GROUP into a single > ioctl() call. >
It seems to me you forgot to send the 0/2 cover letter :). Please include the time we save thanks to avoiding the repetitive ioctls in each patch. CCing Jason and Michael. > Signed-off-by: Pei Li <peili....@gmail.com> > --- > hw/virtio/vhost-vdpa.c | 31 +++++++++++++++----- > include/standard-headers/linux/vhost_types.h | 3 ++ > linux-headers/linux/vhost.h | 7 +++++ > 3 files changed, 33 insertions(+), 8 deletions(-) > > diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c > index bc6bad23d5..6d45ff8539 100644 > --- a/hw/virtio/vhost-vdpa.c > +++ b/hw/virtio/vhost-vdpa.c > @@ -679,7 +679,8 @@ static int vhost_vdpa_set_backend_cap(struct vhost_dev > *dev) > uint64_t f = 0x1ULL << VHOST_BACKEND_F_IOTLB_MSG_V2 | > 0x1ULL << VHOST_BACKEND_F_IOTLB_BATCH | > 0x1ULL << VHOST_BACKEND_F_IOTLB_ASID | > - 0x1ULL << VHOST_BACKEND_F_SUSPEND; > + 0x1ULL << VHOST_BACKEND_F_SUSPEND | > + 0x1ULL << VHOST_BACKEND_F_IOCTL_BATCH; > int r; > > if (vhost_vdpa_call(dev, VHOST_GET_BACKEND_FEATURES, &features)) { > @@ -731,14 +732,28 @@ static int vhost_vdpa_get_vq_index(struct vhost_dev > *dev, int idx) > > static int vhost_vdpa_set_vring_ready(struct vhost_dev *dev) > { > - int i; > + int i, nvqs = dev->nvqs; > + uint64_t backend_features = dev->backend_cap; > + > trace_vhost_vdpa_set_vring_ready(dev); > - for (i = 0; i < dev->nvqs; ++i) { > - struct vhost_vring_state state = { > - .index = dev->vq_index + i, > - .num = 1, > - }; > - vhost_vdpa_call(dev, VHOST_VDPA_SET_VRING_ENABLE, &state); > + > + if (!(backend_features & BIT_ULL(VHOST_BACKEND_F_IOCTL_BATCH))) { > + for (i = 0; i < nvqs; ++i) { > + struct vhost_vring_state state = { > + .index = dev->vq_index + i, > + .num = 1, > + }; > + vhost_vdpa_call(dev, VHOST_VDPA_SET_VRING_ENABLE, &state); > + } > + } else { > + struct vhost_vring_state states[nvqs + 1]; > + states[0].num = nvqs; > + for (i = 1; i <= nvqs; ++i) { > + states[i].index = dev->vq_index + i - 1; > + states[i].num = 1; > + } > + I think it's more clear to share the array of vhost_vring_state states[nvqs + 1], and then fill it either in one shot with VHOST_VDPA_SET_VRING_ENABLE_BATCH or individually with VHOST_VDPA_SET_VRING_ENABLE. The same feedback goes for VHOST_VDPA_GET_VRING_GROUP_BATCH in the next patch. > + vhost_vdpa_call(dev, VHOST_VDPA_SET_VRING_ENABLE_BATCH, &states[0]); > } > return 0; This comment is previous to your patch but I just realized we don't check the return value of vhost_vdpa_call. Maybe it is worth considering addressing that in this series too. > } > diff --git a/include/standard-headers/linux/vhost_types.h > b/include/standard-headers/linux/vhost_types.h > index c41a73fe36..068d0e1ceb 100644 > --- a/include/standard-headers/linux/vhost_types.h > +++ b/include/standard-headers/linux/vhost_types.h > @@ -164,4 +164,7 @@ struct vhost_vdpa_iova_range { > /* Device can be suspended */ > #define VHOST_BACKEND_F_SUSPEND 0x4 > > +/* IOCTL requests can be batched */ > +#define VHOST_BACKEND_F_IOCTL_BATCH 0x6 > + > #endif > diff --git a/linux-headers/linux/vhost.h b/linux-headers/linux/vhost.h > index f9f115a7c7..4c9ddd0a0e 100644 > --- a/linux-headers/linux/vhost.h > +++ b/linux-headers/linux/vhost.h > @@ -180,4 +180,11 @@ > */ > #define VHOST_VDPA_SUSPEND _IO(VHOST_VIRTIO, 0x7D) > > +/* Batch version of VHOST_VDPA_SET_VRING_ENABLE > + * > + * Enable/disable the ring while batching the commands. > + */ > +#define VHOST_VDPA_SET_VRING_ENABLE_BATCH _IOW(VHOST_VIRTIO, 0x7F, \ > + struct vhost_vring_state) > + These headers should be updated with update-linux-headers.sh. To be done that way we need the changes merged in the kernel before. We can signal that the series is not ready for inclusion with the subject [RFC. PATCH], like [1], and note it in the commit message. That way, you can keep updating the header manually for demonstration purposes. Thanks! [1] https://lore.kernel.org/qemu-devel/20220413163206.1958254-23-epere...@redhat.com/