115d9c3ceSAlex Bennée.. _vhost_user: 215d9c3ceSAlex Bennée 315d9c3ceSAlex Bennéevhost-user back ends 415d9c3ceSAlex Bennée-------------------- 515d9c3ceSAlex Bennée 615d9c3ceSAlex Bennéevhost-user back ends are way to service the request of VirtIO devices 715d9c3ceSAlex Bennéeoutside of QEMU itself. To do this there are a number of things 815d9c3ceSAlex Bennéerequired. 915d9c3ceSAlex Bennée 1015d9c3ceSAlex Bennéevhost-user device 11e7fe9122SAlex Bennée================= 1215d9c3ceSAlex Bennée 1315d9c3ceSAlex BennéeThese are simple stub devices that ensure the VirtIO device is visible 1415d9c3ceSAlex Bennéeto the guest. The code is mostly boilerplate although each device has 1515d9c3ceSAlex Bennéea ``chardev`` option which specifies the ID of the ``--chardev`` 1615d9c3ceSAlex Bennéedevice that connects via a socket to the vhost-user *daemon*. 1715d9c3ceSAlex Bennée 18e7fe9122SAlex BennéeEach device will have an virtio-mmio and virtio-pci variant. See your 19e7fe9122SAlex Bennéeplatform details for what sort of virtio bus to use. 20e7fe9122SAlex Bennée 21e7fe9122SAlex Bennée.. list-table:: vhost-user devices 22e7fe9122SAlex Bennée :widths: 20 20 60 23e7fe9122SAlex Bennée :header-rows: 1 24e7fe9122SAlex Bennée 25e7fe9122SAlex Bennée * - Device 26e7fe9122SAlex Bennée - Type 27e7fe9122SAlex Bennée - Notes 28e7fe9122SAlex Bennée * - vhost-user-blk 29e7fe9122SAlex Bennée - Block storage 30e7fe9122SAlex Bennée - See contrib/vhost-user-blk 31e7fe9122SAlex Bennée * - vhost-user-fs 32e7fe9122SAlex Bennée - File based storage driver 33e7fe9122SAlex Bennée - See https://gitlab.com/virtio-fs/virtiofsd 34e7fe9122SAlex Bennée * - vhost-user-gpio 35e7fe9122SAlex Bennée - Proxy gpio pins to host 36e7fe9122SAlex Bennée - See https://github.com/rust-vmm/vhost-device 37e7fe9122SAlex Bennée * - vhost-user-gpu 38e7fe9122SAlex Bennée - GPU driver 39e7fe9122SAlex Bennée - See contrib/vhost-user-gpu 40e7fe9122SAlex Bennée * - vhost-user-i2c 41e7fe9122SAlex Bennée - Proxy i2c devices to host 42e7fe9122SAlex Bennée - See https://github.com/rust-vmm/vhost-device 43e7fe9122SAlex Bennée * - vhost-user-input 44e7fe9122SAlex Bennée - Generic input driver 45887d5775SLeo Yan - :ref:`vhost_user_input` 46e7fe9122SAlex Bennée * - vhost-user-rng 47e7fe9122SAlex Bennée - Entropy driver 48e7fe9122SAlex Bennée - :ref:`vhost_user_rng` 49e7fe9122SAlex Bennée * - vhost-user-scmi 50e7fe9122SAlex Bennée - System Control and Management Interface 51e7fe9122SAlex Bennée - See https://github.com/rust-vmm/vhost-device 52e7fe9122SAlex Bennée * - vhost-user-snd 53e7fe9122SAlex Bennée - Audio device 54e7fe9122SAlex Bennée - See https://github.com/rust-vmm/vhost-device/staging 55e7fe9122SAlex Bennée * - vhost-user-scsi 56e7fe9122SAlex Bennée - SCSI based storage 57e7fe9122SAlex Bennée - See contrib/vhost-user-scsi 58e7fe9122SAlex Bennée * - vhost-user-vsock 59e7fe9122SAlex Bennée - Socket based communication 60e7fe9122SAlex Bennée - See https://github.com/rust-vmm/vhost-device 61e7fe9122SAlex Bennée 62e7fe9122SAlex BennéeThe referenced *daemons* are not exhaustive, any conforming backend 63e7fe9122SAlex Bennéeimplementing the device and using the vhost-user protocol should work. 64e7fe9122SAlex Bennée 65e7fe9122SAlex Bennéevhost-user-device 66e7fe9122SAlex Bennée^^^^^^^^^^^^^^^^^ 67e7fe9122SAlex Bennée 68e7fe9122SAlex BennéeThe vhost-user-device is a generic development device intended for 69e7fe9122SAlex Bennéeexpert use while developing new backends. The user needs to specify 70e7fe9122SAlex Bennéeall the required parameters including: 71e7fe9122SAlex Bennée 72e7fe9122SAlex Bennée - Device ``virtio-id`` 73e7fe9122SAlex Bennée - The ``num_vqs`` it needs and their ``vq_size`` 74e7fe9122SAlex Bennée - The ``config_size`` if needed 75e7fe9122SAlex Bennée 76e7fe9122SAlex Bennée.. note:: 77e7fe9122SAlex Bennée To prevent user confusion you cannot currently instantiate 78e7fe9122SAlex Bennée vhost-user-device without first patching out:: 79e7fe9122SAlex Bennée 80e7fe9122SAlex Bennée /* Reason: stop inexperienced users confusing themselves */ 81e7fe9122SAlex Bennée dc->user_creatable = false; 82e7fe9122SAlex Bennée 83e7fe9122SAlex Bennée in ``vhost-user-device.c`` and ``vhost-user-device-pci.c`` file and 84e7fe9122SAlex Bennée rebuilding. 85e7fe9122SAlex Bennée 8615d9c3ceSAlex Bennéevhost-user daemon 8715d9c3ceSAlex Bennée================= 8815d9c3ceSAlex Bennée 8915d9c3ceSAlex BennéeThis is a separate process that is connected to by QEMU via a socket 9015d9c3ceSAlex Bennéefollowing the :ref:`vhost_user_proto`. There are a number of daemons 9115d9c3ceSAlex Bennéethat can be built when enabled by the project although any daemon that 9215d9c3ceSAlex Bennéemeets the specification for a given device can be used. 9315d9c3ceSAlex Bennée 94887d5775SLeo Yan.. _shared_memory_object: 95887d5775SLeo Yan 9615d9c3ceSAlex BennéeShared memory object 9715d9c3ceSAlex Bennée==================== 9815d9c3ceSAlex Bennée 9915d9c3ceSAlex BennéeIn order for the daemon to access the VirtIO queues to process the 10015d9c3ceSAlex Bennéerequests it needs access to the guest's address space. This is 101*4e647fa0SStefano Garzarellaachieved via the ``memory-backend-file``, ``memory-backend-memfd``, or 102*4e647fa0SStefano Garzarella``memory-backend-shm`` objects. 103*4e647fa0SStefano GarzarellaA reference to a file-descriptor which can access this object 10415d9c3ceSAlex Bennéewill be passed via the socket as part of the protocol negotiation. 10515d9c3ceSAlex Bennée 10615d9c3ceSAlex BennéeCurrently the shared memory object needs to match the size of the main 10715d9c3ceSAlex Bennéesystem memory as defined by the ``-m`` argument. 10815d9c3ceSAlex Bennée 10915d9c3ceSAlex BennéeExample 11015d9c3ceSAlex Bennée======= 11115d9c3ceSAlex Bennée 1129c36407aSMilan ZamazalFirst start your daemon. 11315d9c3ceSAlex Bennée 11415d9c3ceSAlex Bennée.. parsed-literal:: 11515d9c3ceSAlex Bennée 11615d9c3ceSAlex Bennée $ virtio-foo --socket-path=/var/run/foo.sock $OTHER_ARGS 11715d9c3ceSAlex Bennée 1189c36407aSMilan ZamazalThen you start your QEMU instance specifying the device, chardev and 11915d9c3ceSAlex Bennéememory objects. 12015d9c3ceSAlex Bennée 12115d9c3ceSAlex Bennée.. parsed-literal:: 12215d9c3ceSAlex Bennée 12315d9c3ceSAlex Bennée $ |qemu_system| \\ 12415d9c3ceSAlex Bennée -m 4096 \\ 12515d9c3ceSAlex Bennée -chardev socket,id=ba1,path=/var/run/foo.sock \\ 12615d9c3ceSAlex Bennée -device vhost-user-foo,chardev=ba1,$OTHER_ARGS \\ 12715d9c3ceSAlex Bennée -object memory-backend-memfd,id=mem,size=4G,share=on \\ 12815d9c3ceSAlex Bennée -numa node,memdev=mem \\ 12915d9c3ceSAlex Bennée ... 13015d9c3ceSAlex Bennée 131