xref: /openbmc/qemu/docs/system/devices/vhost-user.rst (revision 1406b7fc4bbaab42133b1ef03270179746e91723)
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