Re: [PATCH RFC 00/15] vhost-user: isolated memory
Akihiko Odaki <[email protected]> Sat, 25 Jul 2026 12:45:08 +0900
| Newsgroups | dev.linux.lists.virtio-fs,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
On 2026/07/24 7:29, ConKite wrote: > This patch series implements a memory isolation mode in vhost-user. The > purpose of this mode is to provide the option of additional security by > eliminating direct access of guest memory by vhost-user devices. > At a high level this works by: > > 1. Adding qdev and qapi properties required to enable isolation mode for > various devices. > 2. Allocating an isolation memory region in an anonymous file and mapping it > to host memory. This isolation region will hold the bounce buffers and > vrings necessary to move data. > 3. Using a vhost-iova-tree to allocate and track the mapping between > guest regions and their corresponding bounce buffers in the isolation > memory. > 4. Creating shadow virtqueues to intercept request notifications. As > kick and call events are received by an svq, it copies buffer > contents and descriptors between isolation and guest memory before > notifying the backend or guest. > > Note: This project is currently in a partially functional state. For > example, in testing vhost-user-input and a keyboard, keystrokes may > register correctly or be double counted depending on the combination > of backend daemon and guest OS used. However, the desire is to make > this work public at this stage for comment on the overall > approach. I guess this intends to achieve something similar to IOMMU and also Linux's swiotlb for the VMM (please correct me if I'm wrong): > Other edge case scenarios arise for bounce buffers. For example, when > IOMMU mappings are set up for a DMA operation to/from a device that is > considered “untrusted”, the device should be given access only to the > memory containing the data being transferred. But if that memory > occupies only part of an IOMMU granule, other parts of the granule may > contain unrelated kernel data. Since IOMMU access control is > per-granule, the untrusted device can gain access to the unrelated > kernel data. This problem is solved by bounce buffering the DMA > operation and ensuring that unused portions of the bounce buffers do > not contain any unrelated kernel data. https://docs.kernel.org/next/core-api/swiotlb.html#usage-scenarios It would be nice if the security property this feature provides is explicitly stated, ideally as documentation. I also hope this could fix vhost-user for TCG: https://gitlab.com/qemu-project/qemu/-/work_items/2092 Perhaps the memory isolation should be enabled by default for TCG. Implementation-wise, there are rough edges as you stated. Some of them can be fixed by more closely following what vhost-user does for the non-isolated case and what vhost-vdpa does with shadow virtqueues. Regards, Akihiko Odaki > > Signed-off-by: Connor Kite <[email protected]> > --- > ConKite (2): > vhost-user: Consolidate chardev property definitions > vhost-user: Add memory-isolation qdev property to vhost-user devices > > Connor Kite (13): > backends/cryptodev-vhost-user: add memory isolation bool > net/vhost-user: add memory isolation > vhost-user: add memory_isolation to VhostUserState > util/iova-tree: g_tree_foreach wrapper > hw/virtio: iova_tree_foreach wrapper > hw/virtio/vhost-shadow-virtqueue: used handler > hw/virtio/vhost-shadow-virtqueue: specified vring placement > hw/virtio/vhost-shadow-virtqueue: range boundary in translation > hw/virtio/vhost-user: create isolation region > hw/virtio/vhost-user: send isolation regions to device > hw/virtio/vhost-user: add shadow virtqueues and eventfd intercepts > hw/virtio/vhost-user: handle data movement with shadow vqs > hw/virtio/vhost-user: shadow vq cleanup > > backends/cryptodev-vhost-user.c | 24 +- > backends/vhost-user.c | 4 +- > hw/block/vhost-user-blk.c | 4 +- > hw/display/vhost-user-gpu.c | 4 +- > hw/scsi/vhost-user-scsi.c | 4 +- > hw/virtio/vhost-iova-tree.c | 15 ++ > hw/virtio/vhost-iova-tree.h | 3 + > hw/virtio/vhost-shadow-virtqueue.c | 30 ++- > hw/virtio/vhost-shadow-virtqueue.h | 17 ++ > hw/virtio/vhost-stub.c | 3 +- > hw/virtio/vhost-user-base.c | 13 +- > hw/virtio/vhost-user-fs.c | 4 +- > hw/virtio/vhost-user-gpio.c | 4 - > hw/virtio/vhost-user-i2c.c | 5 - > hw/virtio/vhost-user-input.c | 5 - > hw/virtio/vhost-user-rng.c | 5 - > hw/virtio/vhost-user-rtc.c | 4 - > hw/virtio/vhost-user-scmi.c | 4 +- > hw/virtio/vhost-user-snd.c | 1 - > hw/virtio/vhost-user-spi.c | 5 - > hw/virtio/vhost-user-test-device.c | 1 - > hw/virtio/vhost-user-vsock.c | 4 +- > hw/virtio/vhost-user.c | 441 ++++++++++++++++++++++++++++++++++- > include/hw/virtio/vhost-user-base.h | 1 + > include/hw/virtio/vhost-user-blk.h | 1 + > include/hw/virtio/vhost-user-fs.h | 1 + > include/hw/virtio/vhost-user-scmi.h | 1 + > include/hw/virtio/vhost-user-vsock.h | 1 + > include/hw/virtio/vhost-user.h | 6 +- > include/hw/virtio/virtio-gpu.h | 1 + > include/hw/virtio/virtio-scsi.h | 1 + > include/qemu/iova-tree.h | 13 ++ > include/system/vhost-user-backend.h | 3 +- > net/passt.c | 16 +- > net/vhost-user.c | 11 +- > qapi/net.json | 15 +- > qapi/qom.json | 6 +- > util/iova-tree.c | 5 + > 38 files changed, 622 insertions(+), 64 deletions(-) > --- > base-commit: 006a22cb26998998385b104db1ff9466ef2f3153 > change-id: 20260604-vhost-user-isolated-memory-070ed4833ee7 > > Best regards,