Re: [PATCH RFC 09/15] hw/virtio/vhost-shadow-virtqueue: specified vring placement
Stefan Hajnoczi <[email protected]> Tue, 28 Jul 2026 11:23:08 -0400
| Newsgroups | dev.linux.lists.virtio-fs,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <20260728152308.GG371693@fedora> |
--Dl4fy5/Nk4W7j/qR Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Jul 23, 2026 at 03:30:08PM -0700, Connor Kite wrote: > By default svq vrings are placed in an anonymous memory map. As svqs > will be leveraged to enable memory isolation in vhost-user, it is useful > to be able to place the vrings in a shared isolation memory region. >=20 > Adds the option to specify vring placement by providing a vring base > address before starting the svq. >=20 > Signed-off-by: Connor Kite <[email protected]> > --- > hw/virtio/vhost-shadow-virtqueue.c | 22 +++++++++++++++------- > hw/virtio/vhost-shadow-virtqueue.h | 3 +++ > 2 files changed, 18 insertions(+), 7 deletions(-) >=20 > diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-= virtqueue.c > index eb86c1ee37..9e3c359f50 100644 > --- a/hw/virtio/vhost-shadow-virtqueue.c > +++ b/hw/virtio/vhost-shadow-virtqueue.c > @@ -857,14 +857,21 @@ void vhost_svq_start(VhostShadowVirtqueue *svq, Vir= tIODevice *vdev, > =20 > svq->vring.num =3D virtio_queue_get_num(vdev, virtio_get_queue_index= (vq)); > svq->num_free =3D svq->vring.num; > - svq->vring.desc =3D mmap(NULL, vhost_svq_driver_area_size(svq), > - PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON= YMOUS, > - -1, 0); > desc_size =3D sizeof(vring_desc_t) * svq->vring.num; > - svq->vring.avail =3D (void *)((char *)svq->vring.desc + desc_size); > - svq->vring.used =3D mmap(NULL, vhost_svq_device_area_size(svq), > - PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON= YMOUS, > - -1, 0); > + if (svq->base_addr =3D=3D NULL) { > + svq->vring.desc =3D mmap(NULL, vhost_svq_driver_area_size(svq), > + PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANO= NYMOUS, > + -1, 0); > + svq->vring.avail =3D (void *)((char *)svq->vring.desc + desc_siz= e); > + svq->vring.used =3D mmap(NULL, vhost_svq_device_area_size(svq), > + PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANO= NYMOUS, > + -1, 0); > + } else { > + svq->vring.desc =3D (void *) svq->base_addr; > + svq->vring.avail =3D (void *)((char *)svq->vring.desc + desc_siz= e); > + svq->vring.used =3D (void *)((char *)svq->base_addr + > + vhost_svq_driver_area_size(svq)); > + } > svq->desc_state =3D g_new0(SVQDescState, svq->vring.num); > if (virtio_vdev_has_feature(svq->vdev, VIRTIO_F_IN_ORDER)) { > svq->batch_last.id =3D VIRTIO_RING_NOT_IN_BATCH; > @@ -929,6 +936,7 @@ VhostShadowVirtqueue *vhost_svq_new(const VhostShadow= VirtqueueOps *ops, > event_notifier_init_fd(&svq->svq_kick, VHOST_FILE_UNBIND); > svq->ops =3D ops; > svq->ops_opaque =3D ops_opaque; > + svq->base_addr =3D NULL; > return svq; > } > =20 > diff --git a/hw/virtio/vhost-shadow-virtqueue.h b/hw/virtio/vhost-shadow-= virtqueue.h > index ccfeee36d7..39f69e6455 100644 > --- a/hw/virtio/vhost-shadow-virtqueue.h > +++ b/hw/virtio/vhost-shadow-virtqueue.h > @@ -148,6 +148,9 @@ typedef struct VhostShadowVirtqueue { > =20 > /* Size of SVQ vring free descriptors */ > uint16_t num_free; > + > + /* Location assigned to vrings if not in default anon memory map*/ > + hwaddr *base_addr; Why is base_addr a hwaddr? This is QEMU memory, not guest RAM. I expected this to be void *. A size needs to be at least documented here to reduce the chance of memory bugs. Even better would be an interface like vhost_svq_vring_total_size() so the caller can fetch the number of bytes before allocating the memory. --Dl4fy5/Nk4W7j/qR Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEhpWov9P5fNqsNXdanKSrs4Grc8gFAmpoyVwACgkQnKSrs4Gr c8jUuwgAvMc/G3tOhj0RTFEXylyhHMcyDAfcvVg+19MNnwq8RSuEjpwK7ongL+Do s3rzWOVKWxQS8RMFhq0E1zXoLWZ0+nt3Ziqi2XBOj28SEiO3eZyfXMQ6lC1UYo1i ZiN0+qHov/H69XAb8cKJgt4xKyiLhVEZfC/DKBzNzVOiFHApRfzdPQapfqTXA4PJ 5z0v+rRysNK9dCaLDf6hqlXki1xWm3M877IeDEztVtof0FolUwLgy4DM9r8lwEdi efKoa9g6Jb083QGMMCKEzXR5wkxvrIVsbIc/OonhN8XDNjJNPpiaZeLlDj0WddGb BECKOD1lZ+YB9/soytLlda2bjV2M8g== =jc6J -----END PGP SIGNATURE----- --Dl4fy5/Nk4W7j/qR--