Add vhost-user support with RNG device implementation#527
Add vhost-user support with RNG device implementation#527dorindabassey wants to merge 5 commits intocontainers:mainfrom
Conversation
6600bb5 to
f9fe527
Compare
mtjhrc
left a comment
There was a problem hiding this comment.
I had a look at the tests, and honestly I don't see much value in them, we don't have any arbitrary coverage percent metric for merging stuff, so I would just remove most of them.
The rest of the code looks good, but I've only had a quick look so far, when this was still a draft, I'll try running this and have another look later.
Having vhost-user support in libkrun seems pretty cool, thanks!
f9fe527 to
7d18fa0
Compare
|
Not really a review, just a comment: @dorindabassey This is some great work and a huge addition to the project. @slp passt uses vhost-user to provide near-native network performance in user mode for QEMU. Perhaps we should consider doing the same here, especially as the main network driver for the v2 API. |
Right, that would be great to have! It's mostly about throughput and latency, but also, perhaps, one day, to implement live migration of TCP connections, as it's only available via vhost-user interface. I'm not sure how much effort networking support would take on top of this pull request, and whether it's beyond its scope or not, but let me share a couple of pointers just in case. The part of API that's implemented by passt is this: https://passt.top/passt/tree/vhost_user.c?id=af7b81b5408da8c56bb22dd11679f2b4024a45c8#n1128 And there's a bit of documentation about how it can be used with QEMU here: https://www.qemu.org/docs/master/system/devices/net.html#using-passt-as-the-user-mode-network-stack Let me know if you have any question! I'll also tag @vivier, the author of the vhost-user implementation in passt, for good measure. |
It's fine for this PR to stand as-is. This can be used as a base for another series adding the network implementation. |
Adding support for virtio-net over vhost doesn't require any changes to any of our networking code. Our All the user would have to do to enable it is:
|
9cfb1ea to
fe4e9ba
Compare
b3bfb2e to
3feb780
Compare
e5c413f to
5b0b670
Compare
5b0b670 to
731cc43
Compare
f8377a5 to
4ae6d50
Compare
|
Fixed! Thank you for the reviews @mtjhrc! |
4ae6d50 to
f218a2d
Compare
58f0fbf to
4ce3cb5
Compare
|
Hi @mtjhrc and @tylerfanelli PTAL |
4ce3cb5 to
bc2152c
Compare
tylerfanelli
left a comment
There was a problem hiding this comment.
LGTM. A few comments that are non-blockers. Great work!
e14fd13 to
8bcb47b
Compare
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request introduces support for vhost-user devices in libkrun, enabling the integration of external backends for virtio devices such as RNG, sound, and CAN. The implementation includes a new generic VhostUserDevice wrapper, an expanded C API, and modifications to the VMM builder to ensure guest memory is file-backed via memfd when vhost-user is active. Review feedback suggests using non-blocking eventfds for interrupt monitoring to prevent potential deadlocks and recommends using more descriptive names for memory file descriptors to improve debuggability.
| let fd = libc::memfd_create( | ||
| b"kernel\0".as_ptr() as *const libc::c_char, | ||
| libc::MFD_CLOEXEC, | ||
| ); |
| let fd = libc::memfd_create( | ||
| b"guest_mem\0".as_ptr() as *const libc::c_char, | ||
| libc::MFD_CLOEXEC, | ||
| ); |
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>
8bcb47b to
556f8bc
Compare
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). Backend interrupts (vring_call_event) are monitored by the EventManager and forwarded to the guest without spawning additional threads. 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. Devices are registered with the EventManager as subscribers to integrate with the VMM's event loop for interrupt handling. 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>
556f8bc to
8dad837
Compare
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>
8dad837 to
319d94e
Compare
This PR adds vhost-user frontend support to libkrun, enabling virtio devices to run in separate processes using rust-vmm's vhost-device backends for improved isolation and flexibility. The RNG frontend is implemented as the initial use case, and is designed to easily support additional devices (sound, GPU, can, etc).