libkrun: Add vhost-user sound device support#605
libkrun: Add vhost-user sound device support#605dorindabassey wants to merge 6 commits intocontainers:mainfrom
Conversation
Implement vhost-user support for connecting to external virtio device backends running in separate processes. Add vhost-user feature flag, vhost dependency, and krun_add_vhost_user_device() generalized API for adding vhost-user devices. Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
Add memfd-backed memory region creation to enable memory sharing with vhost-user backends via FD passing. When vhost-user is enabled, all guest RAM regions are created with memfd backing instead of anonymous mmap. This lays the groundwork for vhost-user device support while maintaining backward compatibility such that the VM boots normally with standard memory when vhost-user is not configured. Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
Implement generic vhost-user device wrapper with connection, feature negotiation, and Guest physical address(GPA) to Virtual address(VA) translation. Supports protocol feature negotiation (CONFIG, MQ) and forwards backend interrupts to guest. Co-authored-by: Matej Hrica <mhrica@redhat.com> Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
Add support for attaching vhost-user devices to the VM. The VMM now automatically suppresses the implicit RNG device when a vhost-user RNG is configured via krun_add_vhost_user_device(), allowing seamless switching between the standard virtio-rng and external vhost-user-rng backend for better isolation and flexibility. Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
Adds --vhost-user-rng command line option to specify a vhost-user RNG backend socket path. When provided, the VM uses the external vhost-user RNG device instead of the built-in virtio-rng implementation. Example usage: ./examples/chroot_vm \ --vhost-user-rng=/tmp/vhost-rng.sock0 \ / /bin/sh -c "head -c 32 /dev/hwrng | xxd" Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
Add support for vhost-user sound devices following QEMU's vhost-user-snd implementation. This allows libkrun VMs to use external vhost-user sound backends (e.g., vhost-device-sound) for audio playback and capture. The virtio-snd configuration space is read-only and contains device capabilities (jacks, streams, chmaps, controls). The implementation uses 4 queues as per the virtio-snd specification: control, event, TX/playback, and RX/capture. Note: The ALSA default device in the guest may not work without additional configuration. Use explicit device specification (e.g., 'aplay -D hw:0,0 <file>') or create /etc/asound.conf in the guest to set the default device. Tested with vhost-device-sound backend using PipeWire. Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
There was a problem hiding this comment.
Please split the commit and improve the commit messages a bit, it's quite hard to follow. It goes unnecessarily into internals of the virtio-sound spec ("The virtio-snd configuration space is read-only and contains device capabilities (jacks, streams, chmaps, controls).", but doesn't mention actual implementation details (I am wondering why do we need config_cache? - or at least mention existence of it).
Maybe split it into like 3 commits:
- add config support for vhost user devices (this is mostly general, we need that for other vhost-user devices)
- add the vhost-sound #define constants (and possibly other sound specific things)
- add support in the chroot_vm example (you can mention how to get
aplayto work in that commit message or in a comment somewhere that is great!)
| const VIRTIO_ID_SOUND: u32 = 25; | ||
| let config_size = match device_type { | ||
| VIRTIO_ID_SOUND => 16, // sizeof(struct virtio_snd_config) | ||
| _ => 256, | ||
| }; |
There was a problem hiding this comment.
This is quite unfortunate, if we need to know the size of the config, I think it should be configured the same way as number and sizes of virtqueues are, preferably specified in the C API, with a constant for the known value.
But if we keep adding more parameters to krun_add_vhost_device(), maybe it makes sense for that function to accept a whole struct krun_vhost_config. (and provide entire configured values of the krun_vhost_config struct for each device type).
Add support for vhost-user sound devices following
QEMU's vhost-user-snd implementation. This allows
libkrun VMs to use external vhost-user sound backends
(e.g., vhost-device-sound) for audio playback and capture.
The virtio-snd configuration space is read-only and
contains device capabilities (jacks, streams, chmaps, controls).
The implementation uses 4 queues as per the virtio-snd
specification: control, event, TX/playback, and RX/capture.
Note: The ALSA default device in the guest may not work without
additional configuration. Use explicit device specification
(e.g., 'aplay -D hw:0,0 ') or create /etc/asound.conf
in the guest to set the default device.
Depends on #527 and containers/libkrunfw#114