Dear virtio-dev community, I would like to introduce you Virtio-loopback, Proof of Concept (PoC) that we have been working on at Virtual Open Systems in the context of the Automotive Grade Linux community (Virtualization & Containers expert group - EG-VIRT).
We consider this work as a PoC and we are not currently planning upstream. However, if the zero-copy or any other aspect of this work is interesting for other Virtio implementations, we would be glad to discuss more. Overview: --------- Virtio-loopback is a new hardware abstraction layer designed for non-Hypervisor environments based on virtio. The main objective is to enable applications communication with vhost-user devices in a non-hypervisor environment. More in details, Virtio-loopback's design consists of a new transport (Virtio-loopback), a user-space daemon (Adapter), and a vhost-user device. The data path has been implemented using the "zero-copy" principle, where vhost-user devices access virtqueues directly in the kernel space. This first implementation supports multi-queues, does not require virtio-protocol changes and applies minor modifications to the vhost-user library. Supported vhost-user devices are today vhost-user-rng (both rust and C version), vhost-user-input and vhost-user-blk. Motivation & requirements: ------------------------- 1. Enable the usage of the same user-space driver on both virtualized and non-virtualized environments. 2. Maximize performance with zero copy design principles 3. Applications using such drivers are unchanged and transparently running in both virtualized or non-virtualized environment. Design description: ------------------- a) Component's description: -------------------------- The Virtio-loopback architecture consists of three main components described below: 1) Driver: In order to route the VIRTIO communication in user-space virtio-loopback driver was implemented and consists of: - A new transport layer which is based on virtio-mmio and it is responsible of routing the read/write communication of the virtio device to the adapter binary. - A character device which works as an intermediate layer between the user-space components and the transport layer. The character device helps the adapter to provide all the required information and initialize the transport and at the same time, provides direct access to the vrings from user-space. The access to the vrings is based on a memory mapping mechanism which gives the ability to the vhost-user device to read and write data directly into kernel's memory without the need of any copy. 2) Adapter: Implements the role that QEMU had in the corresponding virtualized scenario. Specifically, combines the functionality of two main QEMU components, virtio-mmio transport emulation and vhost-user backend, in order to work as a bridge between the transport and the vhost-user device. The two main parts of the adapter are: - A vhost-user backend which is the main communication point with the vhost-user device. - A virtio-emulation which handles mostly the messages coming from the driver and translates them into vhost-user messages/actions. 3) Vhost-user device: This components required only minimal modifications to make the vrings directly accessible in kernel's memory. b) Communication between the virtio-loopback components: ------------------------------------------------------- After the describing the role of its component, a few details need to be given about how they interact with each other and the mechanisms used. 1) Transport & Adapter: - The two components share a communication data structure which describes the current read/write operation requested by the transport. - When this data structure has been filled with all the required information the transport triggers and EventFD and waits. The adapter wakes up, takes the corresponding actions and finally notifies and unlocks the transport by calling an IOCTL system call. - Compared to the virtualized environment scenario, the adapter calls an IOCTL system call to the driver in place of an interrupt. 2) Adapter & Vhost-user device: - The mechanisms used between these two component are the same as in the virtualized environment case. a) A UNIX socket is in place to exchange any VHOST-USER messages. b) EventFDs are being used in order to trigger VIRTIO kick/call requests. 3) Transport & Vhost-user device: - Since the Vrings are allocated into the Kernel's memory, vhost-user device needs to communicate and request access from the virtio-loopback driver. These requirement is served by implementing MMAP and IOCTL system calls in the driver. c) Vrings & Zero copy memory mapping mechanism: ---------------------------------------------- The vrings are allocated by the virtio driver into the kernel's memory space and in order to be accessible by the user-space, especially by the vhost-user device, a new memory mapping mechanism needed to be created into the virtio-loopback driver. The new memory mapping mechanism is based on a page-fault handler which maps the accessed pages on-demand. Known issues & room for improvement: ----------------------------------- Known limitation found in the current implementation: - The memory mapping mechanism needs improvements, in the current implementation the device can potentially access the whole kernel's memory. A more fine grained mmapping can be set by the kernel by narrowing down the memory block shared. Possible next development targets might be about: - Security checks for the memory shared with the user-space (vhost user-device) - Add parallel device handling for the virtio-loopback transport and adapter - Add support for more vhost-user devices More information: ---------------- The full description of the technology can be found in the links below: - Virtio-loopback design document <https://git.virtualopensystems.com/virtio-loopback/docs/-/blob/virtio-loopback-rfc/design_docs/EG-VIRT_VOSYS_virtio_loopback_design_v1.4_2023_04_03.pdf> - How to test the technology <https://git.virtualopensystems.com/virtio-loopback/docs/-/blob/virtio-loopback-rfc/README.md> Links for all the key components of the design can be found below: 1) Virtio-loopback-transport <https://git.virtualopensystems.com/virtio-loopback/loopback_driver/-/tree/virtio-loopback-rfc> 2) Adapter <https://git.virtualopensystems.com/virtio-loopback/adapter_app/-/tree/virtio-loopback-rfc> 3) Vhost-user devices in Qemu <https://git.virtualopensystems.com/virtio-loopback/qemu/-/tree/virtio-loopback-rfc> Virtio-loopback has been tested on RCAR-M3 board (AGL needlefish) and x86 systems (Fedora 37). The results have been found to be comparable with VDUSE technology in virtio-blk case: - Automotive Grade Linux All Member Meeting Spring (8-9/03/2023) - Presentation <https://static.sched.com/hosted_files/aglammspring2023/44/vosys_virtio-loopback-berlin_2023-03-08.pdf> + Activity done in the context of the AERO EU project (grant agreement No 101092850) Thank you for taking the time to review this PoC, I would appreciate your feedback and suggestions for improvements. Best regards, Timos Ampelikiotis