| .. _vhost_user: | 
 |  | 
 | vhost-user back ends | 
 | -------------------- | 
 |  | 
 | vhost-user back ends are way to service the request of VirtIO devices | 
 | outside of QEMU itself. To do this there are a number of things | 
 | required. | 
 |  | 
 | vhost-user device | 
 | ================= | 
 |  | 
 | These are simple stub devices that ensure the VirtIO device is visible | 
 | to the guest. The code is mostly boilerplate although each device has | 
 | a ``chardev`` option which specifies the ID of the ``--chardev`` | 
 | device that connects via a socket to the vhost-user *daemon*. | 
 |  | 
 | Each device will have an virtio-mmio and virtio-pci variant. See your | 
 | platform details for what sort of virtio bus to use. | 
 |  | 
 | .. list-table:: vhost-user devices | 
 |   :widths: 20 20 60 | 
 |   :header-rows: 1 | 
 |  | 
 |   * - Device | 
 |     - Type | 
 |     - Notes | 
 |   * - vhost-user-blk | 
 |     - Block storage | 
 |     - See contrib/vhost-user-blk | 
 |   * - vhost-user-fs | 
 |     - File based storage driver | 
 |     - See https://gitlab.com/virtio-fs/virtiofsd | 
 |   * - vhost-user-gpio | 
 |     - Proxy gpio pins to host | 
 |     - See https://github.com/rust-vmm/vhost-device | 
 |   * - vhost-user-gpu | 
 |     - GPU driver | 
 |     - See contrib/vhost-user-gpu | 
 |   * - vhost-user-i2c | 
 |     - Proxy i2c devices to host | 
 |     - See https://github.com/rust-vmm/vhost-device | 
 |   * - vhost-user-input | 
 |     - Generic input driver | 
 |     - :ref:`vhost_user_input` | 
 |   * - vhost-user-rng | 
 |     - Entropy driver | 
 |     - :ref:`vhost_user_rng` | 
 |   * - vhost-user-scmi | 
 |     - System Control and Management Interface | 
 |     - See https://github.com/rust-vmm/vhost-device | 
 |   * - vhost-user-snd | 
 |     - Audio device | 
 |     - See https://github.com/rust-vmm/vhost-device/staging | 
 |   * - vhost-user-scsi | 
 |     - SCSI based storage | 
 |     - See contrib/vhost-user-scsi | 
 |   * - vhost-user-vsock | 
 |     - Socket based communication | 
 |     - See https://github.com/rust-vmm/vhost-device | 
 |  | 
 | The referenced *daemons* are not exhaustive, any conforming backend | 
 | implementing the device and using the vhost-user protocol should work. | 
 |  | 
 | vhost-user-device | 
 | ^^^^^^^^^^^^^^^^^ | 
 |  | 
 | The vhost-user-device is a generic development device intended for | 
 | expert use while developing new backends. The user needs to specify | 
 | all the required parameters including: | 
 |  | 
 |   - Device ``virtio-id`` | 
 |   - The ``num_vqs`` it needs and their ``vq_size`` | 
 |   - The ``config_size`` if needed | 
 |  | 
 | .. note:: | 
 |   To prevent user confusion you cannot currently instantiate | 
 |   vhost-user-device without first patching out:: | 
 |  | 
 |     /* Reason: stop inexperienced users confusing themselves */ | 
 |     dc->user_creatable = false; | 
 |  | 
 |   in ``vhost-user-device.c`` and ``vhost-user-device-pci.c`` file and | 
 |   rebuilding. | 
 |  | 
 | vhost-user daemon | 
 | ================= | 
 |  | 
 | This is a separate process that is connected to by QEMU via a socket | 
 | following the :ref:`vhost_user_proto`. There are a number of daemons | 
 | that can be built when enabled by the project although any daemon that | 
 | meets the specification for a given device can be used. | 
 |  | 
 | .. _shared_memory_object: | 
 |  | 
 | Shared memory object | 
 | ==================== | 
 |  | 
 | In order for the daemon to access the VirtIO queues to process the | 
 | requests it needs access to the guest's address space. This is | 
 | achieved via the ``memory-backend-file`` or ``memory-backend-memfd`` | 
 | objects. A reference to a file-descriptor which can access this object | 
 | will be passed via the socket as part of the protocol negotiation. | 
 |  | 
 | Currently the shared memory object needs to match the size of the main | 
 | system memory as defined by the ``-m`` argument. | 
 |  | 
 | Example | 
 | ======= | 
 |  | 
 | First start your daemon. | 
 |  | 
 | .. parsed-literal:: | 
 |  | 
 |   $ virtio-foo --socket-path=/var/run/foo.sock $OTHER_ARGS | 
 |  | 
 | Then you start your QEMU instance specifying the device, chardev and | 
 | memory objects. | 
 |  | 
 | .. parsed-literal:: | 
 |  | 
 |   $ |qemu_system| \\ | 
 |       -m 4096 \\ | 
 |       -chardev socket,id=ba1,path=/var/run/foo.sock \\ | 
 |       -device vhost-user-foo,chardev=ba1,$OTHER_ARGS \\ | 
 |       -object memory-backend-memfd,id=mem,size=4G,share=on \\ | 
 |       -numa node,memdev=mem \\ | 
 |         ... | 
 |  |