From: Stefan Hajnoczi <stefanha@redhat.com>
To: Connor Kite <connorkite@gmail.com>
Cc: qemu-devel@nongnu.org, "Michael S. Tsirkin" <mst@redhat.com>,
"Stefano Garzarella" <sgarzare@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Viresh Kumar" <viresh.kumar@linaro.org>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Mathieu Poirier" <mathieu.poirier@linaro.org>,
"Manos Pitsidianakis" <manos.pitsidianakis@linaro.org>,
"Haixu Cui" <quic_haixcui@quicinc.com>,
"Raphael Norwitz" <rnorwitz@nvidia.com>,
"Kevin Wolf" <kwolf@redhat.com>,
"Hanna Reitz" <hreitz@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Fam Zheng" <fam@euphon.net>,
"Milan Zamazal" <mzamazal@redhat.com>,
"Akihiko Odaki" <odaki@rsg.ci.i.u-tokyo.ac.jp>,
"Dmitry Osipenko" <dmitry.osipenko@collabora.com>,
qemu-block@nongnu.org, virtio-fs@lists.linux.dev,
"Gonglei (Arei)" <arei.gonglei@huawei.com>,
"zhenwei pi" <zhenwei.pi@linux.dev>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Eric Blake" <eblake@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Jason Wang" <jasowangio@gmail.com>,
"Peter Xu" <peterx@redhat.com>,
"Eugenio Pérez" <eperezma@redhat.com>,
"Alyssa Ross" <hi@alyssa.is>,
"Demi Marie Obenour" <demiobenour@gmail.com>
Subject: Re: [PATCH RFC 13/15] hw/virtio/vhost-user: add shadow virtqueues and eventfd intercepts
Date: Tue, 28 Jul 2026 15:41:46 -0400 [thread overview]
Message-ID: <20260728194145.GK371693@fedora> (raw)
In-Reply-To: <20260723-vhost-user-isolated-memory-v1-13-6b97c439eb28@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 4762 bytes --]
On Thu, Jul 23, 2026 at 03:30:12PM -0700, Connor Kite wrote:
> Adds shadow virtqueues that will eventually be used to transfer data
> between device and host via bounce buffers when isolation mode is
> active. The svqs are initalized, and eventfd assignments are
> intercepted so that notifications come to svqs first before
> the guest or backend receive them.
>
> Signed-off-by: Connor Kite <connorkite@gmail.com>
> ---
> hw/virtio/vhost-user.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 54 insertions(+)
>
> diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
> index acabfb7f1c..75858289a2 100644
> --- a/hw/virtio/vhost-user.c
> +++ b/hw/virtio/vhost-user.c
> @@ -18,6 +18,7 @@
> #include "hw/virtio/vhost-backend.h"
> #include "hw/virtio/virtio.h"
> #include "hw/virtio/virtio-net.h"
> +#include "hw/virtio/vhost-shadow-virtqueue.h"
> #include "hw/virtio/vhost-iova-tree.h"
> #include "chardev/char-fe.h"
> #include "io/channel-socket.h"
> @@ -365,7 +366,9 @@ struct vhost_user {
>
> /* Isolated memory data*/
> struct IsolationRegion iso_memory;
> + GPtrArray *shadow_vqs;
> VhostIOVATree *iso_iova_tree;
> + bool svqs_allocated;
> };
>
> struct scrub_regions {
> @@ -1693,6 +1696,24 @@ static int vhost_set_vring_file(struct vhost_dev *dev,
> static int vhost_user_set_vring_kick(struct vhost_dev *dev,
> struct vhost_vring_file *file)
> {
> + struct vhost_user *u = dev->opaque;
> + int svq_idx = file->index - dev->vq_index;
> + if (u->user->memory_isolation) {
> + VhostShadowVirtqueue *svq = g_ptr_array_index(u->shadow_vqs,
> + svq_idx);
> + vhost_svq_set_svq_kick_fd(svq, file->fd);
> +
> + if (svq->hdev_kick.initialized == false) {
> + int r = event_notifier_init(&svq->hdev_kick, 0);
Where is event_notifier_cleanup() called?
> + if (r) {
> + error_report("Failed to create kick event notifier");
> + return r;
> + }
> + }
> +
> + file->fd = event_notifier_get_fd(&svq->hdev_kick);
Modifying the function argument is probably not expected but
vhost_virtqueue_start() doesn't use it after this call, so there is no
immediate problem. It would be safer to have a local struct
vhost_vring_file that can be modified without affecting the caller's
copy.
> + }
> +
> int ret = vhost_set_vring_file(dev, VHOST_USER_SET_VRING_KICK, file);
> if (ret < 0) {
> return ret;
> @@ -1721,6 +1742,24 @@ static int vhost_user_set_vring_kick(struct vhost_dev *dev,
> static int vhost_user_set_vring_call(struct vhost_dev *dev,
> struct vhost_vring_file *file)
> {
> + struct vhost_user *u = dev->opaque;
> + int svq_idx = file->index - dev->vq_index;
> + if (u->user->memory_isolation) {
> + VhostShadowVirtqueue *svq = g_ptr_array_index(u->shadow_vqs,
> + svq_idx);
> + vhost_svq_set_svq_call_fd(svq, file->fd);
> +
> + if (svq->hdev_call.initialized == false) {
> + int r = event_notifier_init(&svq->hdev_call, 0);
Where is event_notifier_cleanup() called?
> + if (r) {
> + error_report("Failed to create call event notifier");
> + return r;
> + }
> + }
> +
> + file->fd = event_notifier_get_fd(&svq->hdev_call);
Same as above.
> + }
> +
> return vhost_set_vring_file(dev, VHOST_USER_SET_VRING_CALL, file);
> }
>
> @@ -2715,6 +2754,17 @@ static int vhost_user_postcopy_notifier(NotifierWithReturn *notifier,
> return 0;
> }
>
> +static void vhost_user_init_svq(struct vhost_dev *dev, struct vhost_user *u)
> +{
> + /*Modified from vhost-vdpa*/
> + u->shadow_vqs = g_ptr_array_new_full(dev->nvqs, vhost_svq_free);
> + for (int i = 0; i < dev->nvqs; i++) {
> + VhostShadowVirtqueue *svq;
> + svq = vhost_svq_new(NULL, NULL);
> + g_ptr_array_add(u->shadow_vqs, svq);
> + }
> +}
> +
> static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque,
> Error **errp)
> {
> @@ -2859,6 +2909,10 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque,
> u->postcopy_notifier.notify = vhost_user_postcopy_notifier;
> postcopy_add_notifier(&u->postcopy_notifier);
>
> + if (vus->memory_isolation) {
> + vhost_user_init_svq(dev, u);
> + }
> +
> return 0;
> }
>
>
> --
> 2.43.0
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2026-07-28 19:42 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-23 22:29 [PATCH RFC 00/15] vhost-user: isolated memory ConKite
2026-07-23 22:30 ` [PATCH RFC 01/15] vhost-user: Consolidate chardev property definitions ConKite
2026-07-24 6:09 ` Markus Armbruster
2026-07-23 22:30 ` [PATCH RFC 02/15] vhost-user: Add memory-isolation qdev property to vhost-user devices ConKite
2026-07-24 10:56 ` Akihiko Odaki
2026-07-28 18:30 ` Connor Kite
2026-07-23 22:30 ` [PATCH RFC 03/15] backends/cryptodev-vhost-user: add memory isolation bool Connor Kite
2026-07-24 6:06 ` Markus Armbruster
2026-07-27 18:43 ` Stefan Hajnoczi
2026-07-24 11:03 ` Akihiko Odaki
2026-07-23 22:30 ` [PATCH RFC 04/15] net/vhost-user: add memory isolation Connor Kite
2026-07-27 18:48 ` Stefan Hajnoczi
2026-07-23 22:30 ` [PATCH RFC 05/15] vhost-user: add memory_isolation to VhostUserState Connor Kite
2026-07-24 11:09 ` Akihiko Odaki
2026-07-27 19:06 ` Stefan Hajnoczi
2026-07-23 22:30 ` [PATCH RFC 06/15] util/iova-tree: g_tree_foreach wrapper Connor Kite
2026-07-27 19:07 ` Stefan Hajnoczi
2026-07-28 18:24 ` Connor Kite
2026-07-23 22:30 ` [PATCH RFC 07/15] hw/virtio: iova_tree_foreach wrapper Connor Kite
2026-07-24 11:14 ` Akihiko Odaki
2026-07-23 22:30 ` [PATCH RFC 08/15] hw/virtio/vhost-shadow-virtqueue: used handler Connor Kite
2026-07-24 11:29 ` Akihiko Odaki
2026-07-28 15:06 ` Stefan Hajnoczi
2026-07-23 22:30 ` [PATCH RFC 09/15] hw/virtio/vhost-shadow-virtqueue: specified vring placement Connor Kite
2026-07-24 12:19 ` Akihiko Odaki
2026-07-28 15:23 ` Stefan Hajnoczi
2026-07-23 22:30 ` [PATCH RFC 10/15] hw/virtio/vhost-shadow-virtqueue: range boundary in translation Connor Kite
2026-07-24 12:31 ` Akihiko Odaki
2026-07-28 15:34 ` Stefan Hajnoczi
2026-07-23 22:30 ` [PATCH RFC 11/15] hw/virtio/vhost-user: create isolation region Connor Kite
2026-07-24 12:53 ` Akihiko Odaki
2026-07-28 17:59 ` Stefan Hajnoczi
2026-07-23 22:30 ` [PATCH RFC 12/15] hw/virtio/vhost-user: send isolation regions to device Connor Kite
2026-07-24 13:33 ` Akihiko Odaki
2026-07-28 19:16 ` Stefan Hajnoczi
2026-07-23 22:30 ` [PATCH RFC 13/15] hw/virtio/vhost-user: add shadow virtqueues and eventfd intercepts Connor Kite
2026-07-24 13:45 ` Akihiko Odaki
2026-07-28 19:41 ` Stefan Hajnoczi [this message]
2026-07-23 22:30 ` [PATCH RFC 14/15] hw/virtio/vhost-user: handle data movement with shadow vqs Connor Kite
2026-07-24 15:20 ` Akihiko Odaki
2026-07-28 20:57 ` Stefan Hajnoczi
2026-07-23 22:30 ` [PATCH RFC 15/15] hw/virtio/vhost-user: shadow vq cleanup Connor Kite
2026-07-24 15:22 ` Akihiko Odaki
2026-07-25 0:15 ` [PATCH RFC 00/15] vhost-user: isolated memory Demi Marie Obenour
2026-07-25 3:45 ` Akihiko Odaki
2026-07-27 18:23 ` Stefan Hajnoczi
2026-07-28 7:07 ` Demi Marie Obenour
2026-07-28 14:50 ` Connor Kite
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260728194145.GK371693@fedora \
--to=stefanha@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=arei.gonglei@huawei.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=connorkite@gmail.com \
--cc=demiobenour@gmail.com \
--cc=dmitry.osipenko@collabora.com \
--cc=eblake@redhat.com \
--cc=eperezma@redhat.com \
--cc=fam@euphon.net \
--cc=hi@alyssa.is \
--cc=hreitz@redhat.com \
--cc=jasowangio@gmail.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=manos.pitsidianakis@linaro.org \
--cc=marcandre.lureau@redhat.com \
--cc=mathieu.poirier@linaro.org \
--cc=mst@redhat.com \
--cc=mzamazal@redhat.com \
--cc=odaki@rsg.ci.i.u-tokyo.ac.jp \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=quic_haixcui@quicinc.com \
--cc=rnorwitz@nvidia.com \
--cc=sgarzare@redhat.com \
--cc=viresh.kumar@linaro.org \
--cc=virtio-fs@lists.linux.dev \
--cc=zhenwei.pi@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox