v1: https://patchew.org/QEMU/20240228114759.44758-1-sgarzare@redhat.com/
v2: https://patchew.org/QEMU/20240326133936.125332-1-sgarzare@redhat.com/
v3: https://patchew.org/QEMU/20240404122330.92710-1-sgarzare@redhat.com/
v4: https://patchew.org/QEMU/20240508074457.12367-1-sgarzare@redhat.com/
v5:
- rebased on 7e1c0047015ffbd408e1aa4a5ec1abe4751dbf7e
- added some R-b/A-b/T-b tags [Daniel, Phil, Thomas, Stefan thanks!]
- added new patch to move O_DSYNC and O_DIRECT defines in osdep [Phil]
- fixed memory-backend-shm documentation in qapi/qom.json and qemu-options.hx
[Markus]
- fixed typos in some commits description [Phil]
The vhost-user protocol is not really Linux-specific, so let's try support
QEMU's frontends and backends (including libvhost-user) in any POSIX system
with this series. The main use case is to be able to use virtio devices that
we don't have built-in in QEMU (e.g. virtiofsd, vhost-user-vsock, etc.) even
in non-Linux systems.
The first 5 patches are more like fixes discovered at runtime on macOS or
FreeBSD that could go even independently of this series.
Patches 6, 7, 8, 9, and 10 enable building of frontends and backends (including
libvhost-user) with associated code changes to succeed in compilation.
Patch 11 adds `memory-backend-shm` that uses the POSIX shm_open() API to
create shared memory which is identified by an fd that can be shared with
vhost-user backends. This is useful on those systems (like macOS) where
we don't have memfd_create() or special filesystems like "/dev/shm".
Patches 12 and 13 use `memory-backend-shm` in some vhost-user tests.
Maybe the first 5 patches can go separately, but I only discovered those
problems after testing patches 6 - 10, so I have included them in this series
for now. Please let me know if you prefer that I send them separately.
I tested this series using vhost-user-blk and QSD on macOS Sonoma 14.4
(aarch64), FreeBSD 14 (x86_64), OpenBSD 7.4 (x86_64), and Fedora 40 (x86_64)
in this way:
- Start vhost-user-blk or QSD (same commands for all systems)
vhost-user-blk -s /tmp/vhost.socket \
-b Fedora-Cloud-Base-39-1.5.x86_64.raw
qemu-storage-daemon \
--blockdev file,filename=Fedora-Cloud-Base-39-1.5.x86_64.qcow2,node-name=file \
--blockdev qcow2,file=file,node-name=qcow2 \
--export vhost-user-blk,addr.type=unix,addr.path=/tmp/vhost.socket,id=vub,num-queues=1,node-name=qcow2,writable=on
- macOS (aarch64): start QEMU (using hvf accelerator)
qemu-system-aarch64 -smp 2 -cpu host -M virt,accel=hvf,memory-backend=mem \
-drive file=./build/pc-bios/edk2-aarch64-code.fd,if=pflash,format=raw,readonly=on \
-device virtio-net-device,netdev=net0 -netdev user,id=net0 \
-device ramfb -device usb-ehci -device usb-kbd \
-object memory-backend-shm,id=mem,size=512M \
-device vhost-user-blk-pci,num-queues=1,disable-legacy=on,chardev=char0 \
-chardev socket,id=char0,path=/tmp/vhost.socket
- FreeBSD/OpenBSD (x86_64): start QEMU (no accelerators available)
qemu-system-x86_64 -smp 2 -M q35,memory-backend=mem \
-object memory-backend-shm,id=mem,size="512M" \
-device vhost-user-blk-pci,num-queues=1,chardev=char0 \
-chardev socket,id=char0,path=/tmp/vhost.socket
- Fedora (x86_64): start QEMU (using kvm accelerator)
qemu-system-x86_64 -smp 2 -M q35,accel=kvm,memory-backend=mem \
-object memory-backend-shm,size="512M" \
-device vhost-user-blk-pci,num-queues=1,chardev=char0 \
-chardev socket,id=char0,path=/tmp/vhost.socket
Branch pushed (and CI started) at https://gitlab.com/sgarzarella/qemu/-/tree/macos-vhost-user?ref_type=heads
Thanks,
Stefano
Stefano Garzarella (13):
libvhost-user: set msg.msg_control to NULL when it is empty
libvhost-user: fail vu_message_write() if sendmsg() is failing
libvhost-user: mask F_INFLIGHT_SHMFD if memfd is not supported
vhost-user-server: do not set memory fd non-blocking
contrib/vhost-user-blk: fix bind() using the right size of the address
contrib/vhost-user-*: use QEMU bswap helper functions
vhost-user: enable frontends on any POSIX system
libvhost-user: enable it on any POSIX system
osdep: move O_DSYNC and O_DIRECT defines from file-posix
contrib/vhost-user-blk: enable it on any POSIX system
hostmem: add a new memory backend based on POSIX shm_open()
tests/qtest/vhost-user-blk-test: use memory-backend-shm
tests/qtest/vhost-user-test: add a test case for memory-backend-shm
docs/system/devices/vhost-user.rst | 5 +-
meson.build | 5 +-
qapi/qom.json | 19 ++++
include/qemu/osdep.h | 14 +++
subprojects/libvhost-user/libvhost-user.h | 2 +-
backends/hostmem-shm.c | 123 ++++++++++++++++++++++
block/file-posix.c | 14 ---
contrib/vhost-user-blk/vhost-user-blk.c | 13 ++-
contrib/vhost-user-input/main.c | 16 +--
hw/net/vhost_net.c | 5 +
subprojects/libvhost-user/libvhost-user.c | 77 +++++++++++++-
tests/qtest/vhost-user-blk-test.c | 2 +-
tests/qtest/vhost-user-test.c | 23 ++++
util/vhost-user-server.c | 12 +++
backends/meson.build | 1 +
hw/block/Kconfig | 2 +-
qemu-options.hx | 16 +++
util/meson.build | 4 +-
18 files changed, 311 insertions(+), 42 deletions(-)
create mode 100644 backends/hostmem-shm.c
--
2.45.1