Skip to content

libkrun: Add vhost-user sound device support#605

Open
dorindabassey wants to merge 6 commits intocontainers:mainfrom
dorindabassey:vhost-user-snd
Open

libkrun: Add vhost-user sound device support#605
dorindabassey wants to merge 6 commits intocontainers:mainfrom
dorindabassey:vhost-user-snd

Conversation

@dorindabassey
Copy link
Collaborator

@dorindabassey dorindabassey commented Mar 24, 2026

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

Dorinda Bassey and others added 6 commits March 24, 2026 19:33
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>
Copy link
Collaborator

@mtjhrc mtjhrc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:

  1. add config support for vhost user devices (this is mostly general, we need that for other vhost-user devices)
  2. add the vhost-sound #define constants (and possibly other sound specific things)
  3. add support in the chroot_vm example (you can mention how to get aplay to work in that commit message or in a comment somewhere that is great!)

Comment on lines +156 to +160
const VIRTIO_ID_SOUND: u32 = 25;
let config_size = match device_type {
VIRTIO_ID_SOUND => 16, // sizeof(struct virtio_snd_config)
_ => 256,
};
Copy link
Collaborator

@mtjhrc mtjhrc Mar 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants