https://blogs.oracle.com/linux/post/introduction-to-virtio
VirtIO: Virtual Input and Output
Virtio is an open standard that defines a protocol for communication between drivers and devices of different types… of the virtio spec. Originally developed as a standard for paravirtualized devices implemented by a hypervisor, it can be used to interface any compliant device (real or emulated) with a driver. https://docs.kernel.org/driver-api/virtio/virtio.html
Abstraction layer over host’s devices for VMs
For the VM to access the host’s NIC, and therefore access the internet, a VirtIO device called virtio-net can be created. In a nutshell, it’s main purpose is to send and receive network data to and from the host.

3 parts to VirtIO architecture:

Typical setup (no VHost, SR-IOV, etc.) Notifications are from VirtIO drivers and devices → routed to KVM interruptions
VirtQueues are a data structure that assist devices/drivers in performing VRing operations
…VRings are the main feature of VirtQueues, as VRings are the actual data structures that facilitate the transfer of data between a VirtIO device and driver.

QEMU’s VirtQueue and VRing data structures
…a VirtQueue’s organization is specific to the guest’s OS and whether we’re talking about userspace (e.g. Qemu) or kernel VirtIO framework. Also, the operations of VirtQueues are specific to the VirtIO configuration…

Linux kernel’s VirtQueue and VRing data structures
The takeaway here is to know that VirtQueues and VRings are two different data structures and that a VirtQueue’s organization will vary depending on the operating system and whether we’re talking about userland or kernel VirtIO framework.
VRing is the main feature of VirtQueues; holds the actual data being transferred
Unlike VirtIO drivers & devices, whose data plane exists in the Qemu process, VHost can offload the data plane to either another host user process (VHost-User) or to the host’s kernel (VHost, as a kernel module). The motivation behind doing this is performance.
In pure VirtIO solution (Figure 2), every driver→host request is a context switch (expensive)

VHost example with VHost-SCSI