xref: /openbmc/qemu/docs/interop/vhost-user.rst (revision a1e6a5c4)
1.. _vhost_user_proto:
2
3===================
4Vhost-user Protocol
5===================
6
7..
8  Copyright 2014 Virtual Open Systems Sarl.
9  Copyright 2019 Intel Corporation
10  Licence: This work is licensed under the terms of the GNU GPL,
11           version 2 or later. See the COPYING file in the top-level
12           directory.
13
14.. contents:: Table of Contents
15
16Introduction
17============
18
19This protocol is aiming to complement the ``ioctl`` interface used to
20control the vhost implementation in the Linux kernel. It implements
21the control plane needed to establish virtqueue sharing with a user
22space process on the same host. It uses communication over a Unix
23domain socket to share file descriptors in the ancillary data of the
24message.
25
26The protocol defines 2 sides of the communication, *front-end* and
27*back-end*. The *front-end* is the application that shares its virtqueues, in
28our case QEMU. The *back-end* is the consumer of the virtqueues.
29
30In the current implementation QEMU is the *front-end*, and the *back-end*
31is the external process consuming the virtio queues, for example a
32software Ethernet switch running in user space, such as Snabbswitch,
33or a block device back-end processing read & write to a virtual
34disk. In order to facilitate interoperability between various back-end
35implementations, it is recommended to follow the :ref:`Backend program
36conventions <backend_conventions>`.
37
38The *front-end* and *back-end* can be either a client (i.e. connecting) or
39server (listening) in the socket communication.
40
41Support for platforms other than Linux
42--------------------------------------
43
44While vhost-user was initially developed targeting Linux, nowadays it
45is supported on any platform that provides the following features:
46
47- A way for requesting shared memory represented by a file descriptor
48  so it can be passed over a UNIX domain socket and then mapped by the
49  other process.
50
51- AF_UNIX sockets with SCM_RIGHTS, so QEMU and the other process can
52  exchange messages through it, including ancillary data when needed.
53
54- Either eventfd or pipe/pipe2. On platforms where eventfd is not
55  available, QEMU will automatically fall back to pipe2 or, as a last
56  resort, pipe. Each file descriptor will be used for receiving or
57  sending events by reading or writing (respectively) an 8-byte value
58  to the corresponding it. The 8-value itself has no meaning and
59  should not be interpreted.
60
61Message Specification
62=====================
63
64.. Note:: All numbers are in the machine native byte order.
65
66A vhost-user message consists of 3 header fields and a payload.
67
68+---------+-------+------+---------+
69| request | flags | size | payload |
70+---------+-------+------+---------+
71
72Header
73------
74
75:request: 32-bit type of the request
76
77:flags: 32-bit bit field
78
79- Lower 2 bits are the version (currently 0x01)
80- Bit 2 is the reply flag - needs to be sent on each reply from the back-end
81- Bit 3 is the need_reply flag - see :ref:`REPLY_ACK <reply_ack>` for
82  details.
83
84:size: 32-bit size of the payload
85
86Payload
87-------
88
89Depending on the request type, **payload** can be:
90
91A single 64-bit integer
92^^^^^^^^^^^^^^^^^^^^^^^
93
94+-----+
95| u64 |
96+-----+
97
98:u64: a 64-bit unsigned integer
99
100A vring state description
101^^^^^^^^^^^^^^^^^^^^^^^^^
102
103+-------+-----+
104| index | num |
105+-------+-----+
106
107:index: a 32-bit index
108
109:num: a 32-bit number
110
111A vring address description
112^^^^^^^^^^^^^^^^^^^^^^^^^^^
113
114+-------+-------+------+------------+------+-----------+-----+
115| index | flags | size | descriptor | used | available | log |
116+-------+-------+------+------------+------+-----------+-----+
117
118:index: a 32-bit vring index
119
120:flags: a 32-bit vring flags
121
122:descriptor: a 64-bit ring address of the vring descriptor table
123
124:used: a 64-bit ring address of the vring used ring
125
126:available: a 64-bit ring address of the vring available ring
127
128:log: a 64-bit guest address for logging
129
130Note that a ring address is an IOVA if ``VIRTIO_F_IOMMU_PLATFORM`` has
131been negotiated. Otherwise it is a user address.
132
133Memory region description
134^^^^^^^^^^^^^^^^^^^^^^^^^
135
136+---------------+------+--------------+-------------+
137| guest address | size | user address | mmap offset |
138+---------------+------+--------------+-------------+
139
140:guest address: a 64-bit guest address of the region
141
142:size: a 64-bit size
143
144:user address: a 64-bit user address
145
146:mmap offset: 64-bit offset where region starts in the mapped memory
147
148When the ``VHOST_USER_PROTOCOL_F_XEN_MMAP`` protocol feature has been
149successfully negotiated, the memory region description contains two extra
150fields at the end.
151
152+---------------+------+--------------+-------------+----------------+-------+
153| guest address | size | user address | mmap offset | xen mmap flags | domid |
154+---------------+------+--------------+-------------+----------------+-------+
155
156:xen mmap flags: 32-bit bit field
157
158- Bit 0 is set for Xen foreign memory mapping.
159- Bit 1 is set for Xen grant memory mapping.
160- Bit 8 is set if the memory region can not be mapped in advance, and memory
161  areas within this region must be mapped / unmapped only when required by the
162  back-end. The back-end shouldn't try to map the entire region at once, as the
163  front-end may not allow it. The back-end should rather map only the required
164  amount of memory at once and unmap it after it is used.
165
166:domid: a 32-bit Xen hypervisor specific domain id.
167
168Single memory region description
169^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
170
171+---------+--------+
172| padding | region |
173+---------+--------+
174
175:padding: 64-bit
176
177A region is represented by Memory region description.
178
179Multiple Memory regions description
180^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
181
182+-------------+---------+---------+-----+---------+
183| num regions | padding | region0 | ... | region7 |
184+-------------+---------+---------+-----+---------+
185
186:num regions: a 32-bit number of regions
187
188:padding: 32-bit
189
190A region is represented by Memory region description.
191
192Log description
193^^^^^^^^^^^^^^^
194
195+----------+------------+
196| log size | log offset |
197+----------+------------+
198
199:log size: size of area used for logging
200
201:log offset: offset from start of supplied file descriptor where
202             logging starts (i.e. where guest address 0 would be
203             logged)
204
205An IOTLB message
206^^^^^^^^^^^^^^^^
207
208+------+------+--------------+-------------------+------+
209| iova | size | user address | permissions flags | type |
210+------+------+--------------+-------------------+------+
211
212:iova: a 64-bit I/O virtual address programmed by the guest
213
214:size: a 64-bit size
215
216:user address: a 64-bit user address
217
218:permissions flags: an 8-bit value:
219  - 0: No access
220  - 1: Read access
221  - 2: Write access
222  - 3: Read/Write access
223
224:type: an 8-bit IOTLB message type:
225  - 1: IOTLB miss
226  - 2: IOTLB update
227  - 3: IOTLB invalidate
228  - 4: IOTLB access fail
229
230Virtio device config space
231^^^^^^^^^^^^^^^^^^^^^^^^^^
232
233+--------+------+-------+---------+
234| offset | size | flags | payload |
235+--------+------+-------+---------+
236
237:offset: a 32-bit offset of virtio device's configuration space
238
239:size: a 32-bit configuration space access size in bytes
240
241:flags: a 32-bit value:
242  - 0: Vhost front-end messages used for writable fields
243  - 1: Vhost front-end messages used for live migration
244
245:payload: Size bytes array holding the contents of the virtio
246          device's configuration space
247
248Vring area description
249^^^^^^^^^^^^^^^^^^^^^^
250
251+-----+------+--------+
252| u64 | size | offset |
253+-----+------+--------+
254
255:u64: a 64-bit integer contains vring index and flags
256
257:size: a 64-bit size of this area
258
259:offset: a 64-bit offset of this area from the start of the
260         supplied file descriptor
261
262Inflight description
263^^^^^^^^^^^^^^^^^^^^
264
265+-----------+-------------+------------+------------+
266| mmap size | mmap offset | num queues | queue size |
267+-----------+-------------+------------+------------+
268
269:mmap size: a 64-bit size of area to track inflight I/O
270
271:mmap offset: a 64-bit offset of this area from the start
272              of the supplied file descriptor
273
274:num queues: a 16-bit number of virtqueues
275
276:queue size: a 16-bit size of virtqueues
277
278C structure
279-----------
280
281In QEMU the vhost-user message is implemented with the following struct:
282
283.. code:: c
284
285  typedef struct VhostUserMsg {
286      VhostUserRequest request;
287      uint32_t flags;
288      uint32_t size;
289      union {
290          uint64_t u64;
291          struct vhost_vring_state state;
292          struct vhost_vring_addr addr;
293          VhostUserMemory memory;
294          VhostUserLog log;
295          struct vhost_iotlb_msg iotlb;
296          VhostUserConfig config;
297          VhostUserVringArea area;
298          VhostUserInflight inflight;
299      };
300  } QEMU_PACKED VhostUserMsg;
301
302Communication
303=============
304
305The protocol for vhost-user is based on the existing implementation of
306vhost for the Linux Kernel. Most messages that can be sent via the
307Unix domain socket implementing vhost-user have an equivalent ioctl to
308the kernel implementation.
309
310The communication consists of the *front-end* sending message requests and
311the *back-end* sending message replies. Most of the requests don't require
312replies. Here is a list of the ones that do:
313
314* ``VHOST_USER_GET_FEATURES``
315* ``VHOST_USER_GET_PROTOCOL_FEATURES``
316* ``VHOST_USER_GET_VRING_BASE``
317* ``VHOST_USER_SET_LOG_BASE`` (if ``VHOST_USER_PROTOCOL_F_LOG_SHMFD``)
318* ``VHOST_USER_GET_INFLIGHT_FD`` (if ``VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD``)
319
320.. seealso::
321
322   :ref:`REPLY_ACK <reply_ack>`
323       The section on ``REPLY_ACK`` protocol extension.
324
325There are several messages that the front-end sends with file descriptors passed
326in the ancillary data:
327
328* ``VHOST_USER_ADD_MEM_REG``
329* ``VHOST_USER_SET_MEM_TABLE``
330* ``VHOST_USER_SET_LOG_BASE`` (if ``VHOST_USER_PROTOCOL_F_LOG_SHMFD``)
331* ``VHOST_USER_SET_LOG_FD``
332* ``VHOST_USER_SET_VRING_KICK``
333* ``VHOST_USER_SET_VRING_CALL``
334* ``VHOST_USER_SET_VRING_ERR``
335* ``VHOST_USER_SET_BACKEND_REQ_FD`` (previous name ``VHOST_USER_SET_SLAVE_REQ_FD``)
336* ``VHOST_USER_SET_INFLIGHT_FD`` (if ``VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD``)
337
338If *front-end* is unable to send the full message or receives a wrong
339reply it will close the connection. An optional reconnection mechanism
340can be implemented.
341
342If *back-end* detects some error such as incompatible features, it may also
343close the connection. This should only happen in exceptional circumstances.
344
345Any protocol extensions are gated by protocol feature bits, which
346allows full backwards compatibility on both front-end and back-end.  As
347older back-ends don't support negotiating protocol features, a feature
348bit was dedicated for this purpose::
349
350  #define VHOST_USER_F_PROTOCOL_FEATURES 30
351
352Note that VHOST_USER_F_PROTOCOL_FEATURES is the UNUSED (30) feature
353bit defined in `VIRTIO 1.1 6.3 Legacy Interface: Reserved Feature Bits
354<https://docs.oasis-open.org/virtio/virtio/v1.1/cs01/virtio-v1.1-cs01.html#x1-4130003>`_.
355VIRTIO devices do not advertise this feature bit and therefore VIRTIO
356drivers cannot negotiate it.
357
358This reserved feature bit was reused by the vhost-user protocol to add
359vhost-user protocol feature negotiation in a backwards compatible
360fashion. Old vhost-user front-end and back-end implementations continue to
361work even though they are not aware of vhost-user protocol feature
362negotiation.
363
364Ring states
365-----------
366
367Rings can be in one of three states:
368
369* stopped: the back-end must not process the ring at all.
370
371* started but disabled: the back-end must process the ring without
372  causing any side effects.  For example, for a networking device,
373  in the disabled state the back-end must not supply any new RX packets,
374  but must process and discard any TX packets.
375
376* started and enabled.
377
378Each ring is initialized in a stopped state.  The back-end must start
379ring upon receiving a kick (that is, detecting that file descriptor is
380readable) on the descriptor specified by ``VHOST_USER_SET_VRING_KICK``
381or receiving the in-band message ``VHOST_USER_VRING_KICK`` if negotiated,
382and stop ring upon receiving ``VHOST_USER_GET_VRING_BASE``.
383
384Rings can be enabled or disabled by ``VHOST_USER_SET_VRING_ENABLE``.
385
386If ``VHOST_USER_F_PROTOCOL_FEATURES`` has not been negotiated, the
387ring starts directly in the enabled state.
388
389If ``VHOST_USER_F_PROTOCOL_FEATURES`` has been negotiated, the ring is
390initialized in a disabled state and is enabled by
391``VHOST_USER_SET_VRING_ENABLE`` with parameter 1.
392
393While processing the rings (whether they are enabled or not), the back-end
394must support changing some configuration aspects on the fly.
395
396Multiple queue support
397----------------------
398
399Many devices have a fixed number of virtqueues.  In this case the front-end
400already knows the number of available virtqueues without communicating with the
401back-end.
402
403Some devices do not have a fixed number of virtqueues.  Instead the maximum
404number of virtqueues is chosen by the back-end.  The number can depend on host
405resource availability or back-end implementation details.  Such devices are called
406multiple queue devices.
407
408Multiple queue support allows the back-end to advertise the maximum number of
409queues.  This is treated as a protocol extension, hence the back-end has to
410implement protocol features first. The multiple queues feature is supported
411only when the protocol feature ``VHOST_USER_PROTOCOL_F_MQ`` (bit 0) is set.
412
413The max number of queues the back-end supports can be queried with message
414``VHOST_USER_GET_QUEUE_NUM``. Front-end should stop when the number of requested
415queues is bigger than that.
416
417As all queues share one connection, the front-end uses a unique index for each
418queue in the sent message to identify a specified queue.
419
420The front-end enables queues by sending message ``VHOST_USER_SET_VRING_ENABLE``.
421vhost-user-net has historically automatically enabled the first queue pair.
422
423Back-ends should always implement the ``VHOST_USER_PROTOCOL_F_MQ`` protocol
424feature, even for devices with a fixed number of virtqueues, since it is simple
425to implement and offers a degree of introspection.
426
427Front-ends must not rely on the ``VHOST_USER_PROTOCOL_F_MQ`` protocol feature for
428devices with a fixed number of virtqueues.  Only true multiqueue devices
429require this protocol feature.
430
431Migration
432---------
433
434During live migration, the front-end may need to track the modifications
435the back-end makes to the memory mapped regions. The front-end should mark
436the dirty pages in a log. Once it complies to this logging, it may
437declare the ``VHOST_F_LOG_ALL`` vhost feature.
438
439To start/stop logging of data/used ring writes, the front-end may send
440messages ``VHOST_USER_SET_FEATURES`` with ``VHOST_F_LOG_ALL`` and
441``VHOST_USER_SET_VRING_ADDR`` with ``VHOST_VRING_F_LOG`` in ring's
442flags set to 1/0, respectively.
443
444All the modifications to memory pointed by vring "descriptor" should
445be marked. Modifications to "used" vring should be marked if
446``VHOST_VRING_F_LOG`` is part of ring's flags.
447
448Dirty pages are of size::
449
450  #define VHOST_LOG_PAGE 0x1000
451
452The log memory fd is provided in the ancillary data of
453``VHOST_USER_SET_LOG_BASE`` message when the back-end has
454``VHOST_USER_PROTOCOL_F_LOG_SHMFD`` protocol feature.
455
456The size of the log is supplied as part of ``VhostUserMsg`` which
457should be large enough to cover all known guest addresses. Log starts
458at the supplied offset in the supplied file descriptor.  The log
459covers from address 0 to the maximum of guest regions. In pseudo-code,
460to mark page at ``addr`` as dirty::
461
462  page = addr / VHOST_LOG_PAGE
463  log[page / 8] |= 1 << page % 8
464
465Where ``addr`` is the guest physical address.
466
467Use atomic operations, as the log may be concurrently manipulated.
468
469Note that when logging modifications to the used ring (when
470``VHOST_VRING_F_LOG`` is set for this ring), ``log_guest_addr`` should
471be used to calculate the log offset: the write to first byte of the
472used ring is logged at this offset from log start. Also note that this
473value might be outside the legal guest physical address range
474(i.e. does not have to be covered by the ``VhostUserMemory`` table), but
475the bit offset of the last byte of the ring must fall within the size
476supplied by ``VhostUserLog``.
477
478``VHOST_USER_SET_LOG_FD`` is an optional message with an eventfd in
479ancillary data, it may be used to inform the front-end that the log has
480been modified.
481
482Once the source has finished migration, rings will be stopped by the
483source. No further update must be done before rings are restarted.
484
485In postcopy migration the back-end is started before all the memory has
486been received from the source host, and care must be taken to avoid
487accessing pages that have yet to be received.  The back-end opens a
488'userfault'-fd and registers the memory with it; this fd is then
489passed back over to the front-end.  The front-end services requests on the
490userfaultfd for pages that are accessed and when the page is available
491it performs WAKE ioctl's on the userfaultfd to wake the stalled
492back-end.  The front-end indicates support for this via the
493``VHOST_USER_PROTOCOL_F_PAGEFAULT`` feature.
494
495Memory access
496-------------
497
498The front-end sends a list of vhost memory regions to the back-end using the
499``VHOST_USER_SET_MEM_TABLE`` message.  Each region has two base
500addresses: a guest address and a user address.
501
502Messages contain guest addresses and/or user addresses to reference locations
503within the shared memory.  The mapping of these addresses works as follows.
504
505User addresses map to the vhost memory region containing that user address.
506
507When the ``VIRTIO_F_IOMMU_PLATFORM`` feature has not been negotiated:
508
509* Guest addresses map to the vhost memory region containing that guest
510  address.
511
512When the ``VIRTIO_F_IOMMU_PLATFORM`` feature has been negotiated:
513
514* Guest addresses are also called I/O virtual addresses (IOVAs).  They are
515  translated to user addresses via the IOTLB.
516
517* The vhost memory region guest address is not used.
518
519IOMMU support
520-------------
521
522When the ``VIRTIO_F_IOMMU_PLATFORM`` feature has been negotiated, the
523front-end sends IOTLB entries update & invalidation by sending
524``VHOST_USER_IOTLB_MSG`` requests to the back-end with a ``struct
525vhost_iotlb_msg`` as payload. For update events, the ``iotlb`` payload
526has to be filled with the update message type (2), the I/O virtual
527address, the size, the user virtual address, and the permissions
528flags. Addresses and size must be within vhost memory regions set via
529the ``VHOST_USER_SET_MEM_TABLE`` request. For invalidation events, the
530``iotlb`` payload has to be filled with the invalidation message type
531(3), the I/O virtual address and the size. On success, the back-end is
532expected to reply with a zero payload, non-zero otherwise.
533
534The back-end relies on the back-end communication channel (see :ref:`Back-end
535communication <backend_communication>` section below) to send IOTLB miss
536and access failure events, by sending ``VHOST_USER_BACKEND_IOTLB_MSG``
537requests to the front-end with a ``struct vhost_iotlb_msg`` as
538payload. For miss events, the iotlb payload has to be filled with the
539miss message type (1), the I/O virtual address and the permissions
540flags. For access failure event, the iotlb payload has to be filled
541with the access failure message type (4), the I/O virtual address and
542the permissions flags.  For synchronization purpose, the back-end may
543rely on the reply-ack feature, so the front-end may send a reply when
544operation is completed if the reply-ack feature is negotiated and
545back-ends requests a reply. For miss events, completed operation means
546either front-end sent an update message containing the IOTLB entry
547containing requested address and permission, or front-end sent nothing if
548the IOTLB miss message is invalid (invalid IOVA or permission).
549
550The front-end isn't expected to take the initiative to send IOTLB update
551messages, as the back-end sends IOTLB miss messages for the guest virtual
552memory areas it needs to access.
553
554.. _backend_communication:
555
556Back-end communication
557----------------------
558
559An optional communication channel is provided if the back-end declares
560``VHOST_USER_PROTOCOL_F_BACKEND_REQ`` protocol feature, to allow the
561back-end to make requests to the front-end.
562
563The fd is provided via ``VHOST_USER_SET_BACKEND_REQ_FD`` ancillary data.
564
565A back-end may then send ``VHOST_USER_BACKEND_*`` messages to the front-end
566using this fd communication channel.
567
568If ``VHOST_USER_PROTOCOL_F_BACKEND_SEND_FD`` protocol feature is
569negotiated, back-end can send file descriptors (at most 8 descriptors in
570each message) to front-end via ancillary data using this fd communication
571channel.
572
573Inflight I/O tracking
574---------------------
575
576To support reconnecting after restart or crash, back-end may need to
577resubmit inflight I/Os. If virtqueue is processed in order, we can
578easily achieve that by getting the inflight descriptors from
579descriptor table (split virtqueue) or descriptor ring (packed
580virtqueue). However, it can't work when we process descriptors
581out-of-order because some entries which store the information of
582inflight descriptors in available ring (split virtqueue) or descriptor
583ring (packed virtqueue) might be overridden by new entries. To solve
584this problem, the back-end need to allocate an extra buffer to store this
585information of inflight descriptors and share it with front-end for
586persistent. ``VHOST_USER_GET_INFLIGHT_FD`` and
587``VHOST_USER_SET_INFLIGHT_FD`` are used to transfer this buffer
588between front-end and back-end. And the format of this buffer is described
589below:
590
591+---------------+---------------+-----+---------------+
592| queue0 region | queue1 region | ... | queueN region |
593+---------------+---------------+-----+---------------+
594
595N is the number of available virtqueues. The back-end could get it from num
596queues field of ``VhostUserInflight``.
597
598For split virtqueue, queue region can be implemented as:
599
600.. code:: c
601
602  typedef struct DescStateSplit {
603      /* Indicate whether this descriptor is inflight or not.
604       * Only available for head-descriptor. */
605      uint8_t inflight;
606
607      /* Padding */
608      uint8_t padding[5];
609
610      /* Maintain a list for the last batch of used descriptors.
611       * Only available when batching is used for submitting */
612      uint16_t next;
613
614      /* Used to preserve the order of fetching available descriptors.
615       * Only available for head-descriptor. */
616      uint64_t counter;
617  } DescStateSplit;
618
619  typedef struct QueueRegionSplit {
620      /* The feature flags of this region. Now it's initialized to 0. */
621      uint64_t features;
622
623      /* The version of this region. It's 1 currently.
624       * Zero value indicates an uninitialized buffer */
625      uint16_t version;
626
627      /* The size of DescStateSplit array. It's equal to the virtqueue size.
628       * The back-end could get it from queue size field of VhostUserInflight. */
629      uint16_t desc_num;
630
631      /* The head of list that track the last batch of used descriptors. */
632      uint16_t last_batch_head;
633
634      /* Store the idx value of used ring */
635      uint16_t used_idx;
636
637      /* Used to track the state of each descriptor in descriptor table */
638      DescStateSplit desc[];
639  } QueueRegionSplit;
640
641To track inflight I/O, the queue region should be processed as follows:
642
643When receiving available buffers from the driver:
644
645#. Get the next available head-descriptor index from available ring, ``i``
646
647#. Set ``desc[i].counter`` to the value of global counter
648
649#. Increase global counter by 1
650
651#. Set ``desc[i].inflight`` to 1
652
653When supplying used buffers to the driver:
654
6551. Get corresponding used head-descriptor index, i
656
6572. Set ``desc[i].next`` to ``last_batch_head``
658
6593. Set ``last_batch_head`` to ``i``
660
661#. Steps 1,2,3 may be performed repeatedly if batching is possible
662
663#. Increase the ``idx`` value of used ring by the size of the batch
664
665#. Set the ``inflight`` field of each ``DescStateSplit`` entry in the batch to 0
666
667#. Set ``used_idx`` to the ``idx`` value of used ring
668
669When reconnecting:
670
671#. If the value of ``used_idx`` does not match the ``idx`` value of
672   used ring (means the inflight field of ``DescStateSplit`` entries in
673   last batch may be incorrect),
674
675   a. Subtract the value of ``used_idx`` from the ``idx`` value of
676      used ring to get last batch size of ``DescStateSplit`` entries
677
678   #. Set the ``inflight`` field of each ``DescStateSplit`` entry to 0 in last batch
679      list which starts from ``last_batch_head``
680
681   #. Set ``used_idx`` to the ``idx`` value of used ring
682
683#. Resubmit inflight ``DescStateSplit`` entries in order of their
684   counter value
685
686For packed virtqueue, queue region can be implemented as:
687
688.. code:: c
689
690  typedef struct DescStatePacked {
691      /* Indicate whether this descriptor is inflight or not.
692       * Only available for head-descriptor. */
693      uint8_t inflight;
694
695      /* Padding */
696      uint8_t padding;
697
698      /* Link to the next free entry */
699      uint16_t next;
700
701      /* Link to the last entry of descriptor list.
702       * Only available for head-descriptor. */
703      uint16_t last;
704
705      /* The length of descriptor list.
706       * Only available for head-descriptor. */
707      uint16_t num;
708
709      /* Used to preserve the order of fetching available descriptors.
710       * Only available for head-descriptor. */
711      uint64_t counter;
712
713      /* The buffer id */
714      uint16_t id;
715
716      /* The descriptor flags */
717      uint16_t flags;
718
719      /* The buffer length */
720      uint32_t len;
721
722      /* The buffer address */
723      uint64_t addr;
724  } DescStatePacked;
725
726  typedef struct QueueRegionPacked {
727      /* The feature flags of this region. Now it's initialized to 0. */
728      uint64_t features;
729
730      /* The version of this region. It's 1 currently.
731       * Zero value indicates an uninitialized buffer */
732      uint16_t version;
733
734      /* The size of DescStatePacked array. It's equal to the virtqueue size.
735       * The back-end could get it from queue size field of VhostUserInflight. */
736      uint16_t desc_num;
737
738      /* The head of free DescStatePacked entry list */
739      uint16_t free_head;
740
741      /* The old head of free DescStatePacked entry list */
742      uint16_t old_free_head;
743
744      /* The used index of descriptor ring */
745      uint16_t used_idx;
746
747      /* The old used index of descriptor ring */
748      uint16_t old_used_idx;
749
750      /* Device ring wrap counter */
751      uint8_t used_wrap_counter;
752
753      /* The old device ring wrap counter */
754      uint8_t old_used_wrap_counter;
755
756      /* Padding */
757      uint8_t padding[7];
758
759      /* Used to track the state of each descriptor fetched from descriptor ring */
760      DescStatePacked desc[];
761  } QueueRegionPacked;
762
763To track inflight I/O, the queue region should be processed as follows:
764
765When receiving available buffers from the driver:
766
767#. Get the next available descriptor entry from descriptor ring, ``d``
768
769#. If ``d`` is head descriptor,
770
771   a. Set ``desc[old_free_head].num`` to 0
772
773   #. Set ``desc[old_free_head].counter`` to the value of global counter
774
775   #. Increase global counter by 1
776
777   #. Set ``desc[old_free_head].inflight`` to 1
778
779#. If ``d`` is last descriptor, set ``desc[old_free_head].last`` to
780   ``free_head``
781
782#. Increase ``desc[old_free_head].num`` by 1
783
784#. Set ``desc[free_head].addr``, ``desc[free_head].len``,
785   ``desc[free_head].flags``, ``desc[free_head].id`` to ``d.addr``,
786   ``d.len``, ``d.flags``, ``d.id``
787
788#. Set ``free_head`` to ``desc[free_head].next``
789
790#. If ``d`` is last descriptor, set ``old_free_head`` to ``free_head``
791
792When supplying used buffers to the driver:
793
7941. Get corresponding used head-descriptor entry from descriptor ring,
795   ``d``
796
7972. Get corresponding ``DescStatePacked`` entry, ``e``
798
7993. Set ``desc[e.last].next`` to ``free_head``
800
8014. Set ``free_head`` to the index of ``e``
802
803#. Steps 1,2,3,4 may be performed repeatedly if batching is possible
804
805#. Increase ``used_idx`` by the size of the batch and update
806   ``used_wrap_counter`` if needed
807
808#. Update ``d.flags``
809
810#. Set the ``inflight`` field of each head ``DescStatePacked`` entry
811   in the batch to 0
812
813#. Set ``old_free_head``,  ``old_used_idx``, ``old_used_wrap_counter``
814   to ``free_head``, ``used_idx``, ``used_wrap_counter``
815
816When reconnecting:
817
818#. If ``used_idx`` does not match ``old_used_idx`` (means the
819   ``inflight`` field of ``DescStatePacked`` entries in last batch may
820   be incorrect),
821
822   a. Get the next descriptor ring entry through ``old_used_idx``, ``d``
823
824   #. Use ``old_used_wrap_counter`` to calculate the available flags
825
826   #. If ``d.flags`` is not equal to the calculated flags value (means
827      back-end has submitted the buffer to guest driver before crash, so
828      it has to commit the in-progres update), set ``old_free_head``,
829      ``old_used_idx``, ``old_used_wrap_counter`` to ``free_head``,
830      ``used_idx``, ``used_wrap_counter``
831
832#. Set ``free_head``, ``used_idx``, ``used_wrap_counter`` to
833   ``old_free_head``, ``old_used_idx``, ``old_used_wrap_counter``
834   (roll back any in-progress update)
835
836#. Set the ``inflight`` field of each ``DescStatePacked`` entry in
837   free list to 0
838
839#. Resubmit inflight ``DescStatePacked`` entries in order of their
840   counter value
841
842In-band notifications
843---------------------
844
845In some limited situations (e.g. for simulation) it is desirable to
846have the kick, call and error (if used) signals done via in-band
847messages instead of asynchronous eventfd notifications. This can be
848done by negotiating the ``VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS``
849protocol feature.
850
851Note that due to the fact that too many messages on the sockets can
852cause the sending application(s) to block, it is not advised to use
853this feature unless absolutely necessary. It is also considered an
854error to negotiate this feature without also negotiating
855``VHOST_USER_PROTOCOL_F_BACKEND_REQ`` and ``VHOST_USER_PROTOCOL_F_REPLY_ACK``,
856the former is necessary for getting a message channel from the back-end
857to the front-end, while the latter needs to be used with the in-band
858notification messages to block until they are processed, both to avoid
859blocking later and for proper processing (at least in the simulation
860use case.) As it has no other way of signalling this error, the back-end
861should close the connection as a response to a
862``VHOST_USER_SET_PROTOCOL_FEATURES`` message that sets the in-band
863notifications feature flag without the other two.
864
865Protocol features
866-----------------
867
868.. code:: c
869
870  #define VHOST_USER_PROTOCOL_F_MQ                    0
871  #define VHOST_USER_PROTOCOL_F_LOG_SHMFD             1
872  #define VHOST_USER_PROTOCOL_F_RARP                  2
873  #define VHOST_USER_PROTOCOL_F_REPLY_ACK             3
874  #define VHOST_USER_PROTOCOL_F_MTU                   4
875  #define VHOST_USER_PROTOCOL_F_BACKEND_REQ           5
876  #define VHOST_USER_PROTOCOL_F_CROSS_ENDIAN          6
877  #define VHOST_USER_PROTOCOL_F_CRYPTO_SESSION        7
878  #define VHOST_USER_PROTOCOL_F_PAGEFAULT             8
879  #define VHOST_USER_PROTOCOL_F_CONFIG                9
880  #define VHOST_USER_PROTOCOL_F_BACKEND_SEND_FD      10
881  #define VHOST_USER_PROTOCOL_F_HOST_NOTIFIER        11
882  #define VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD       12
883  #define VHOST_USER_PROTOCOL_F_RESET_DEVICE         13
884  #define VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS 14
885  #define VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS  15
886  #define VHOST_USER_PROTOCOL_F_STATUS               16
887  #define VHOST_USER_PROTOCOL_F_XEN_MMAP             17
888
889Front-end message types
890-----------------------
891
892``VHOST_USER_GET_FEATURES``
893  :id: 1
894  :equivalent ioctl: ``VHOST_GET_FEATURES``
895  :request payload: N/A
896  :reply payload: ``u64``
897
898  Get from the underlying vhost implementation the features bitmask.
899  Feature bit ``VHOST_USER_F_PROTOCOL_FEATURES`` signals back-end support
900  for ``VHOST_USER_GET_PROTOCOL_FEATURES`` and
901  ``VHOST_USER_SET_PROTOCOL_FEATURES``.
902
903``VHOST_USER_SET_FEATURES``
904  :id: 2
905  :equivalent ioctl: ``VHOST_SET_FEATURES``
906  :request payload: ``u64``
907  :reply payload: N/A
908
909  Enable features in the underlying vhost implementation using a
910  bitmask.  Feature bit ``VHOST_USER_F_PROTOCOL_FEATURES`` signals
911  back-end support for ``VHOST_USER_GET_PROTOCOL_FEATURES`` and
912  ``VHOST_USER_SET_PROTOCOL_FEATURES``.
913
914``VHOST_USER_GET_PROTOCOL_FEATURES``
915  :id: 15
916  :equivalent ioctl: ``VHOST_GET_FEATURES``
917  :request payload: N/A
918  :reply payload: ``u64``
919
920  Get the protocol feature bitmask from the underlying vhost
921  implementation.  Only legal if feature bit
922  ``VHOST_USER_F_PROTOCOL_FEATURES`` is present in
923  ``VHOST_USER_GET_FEATURES``.  It does not need to be acknowledged by
924  ``VHOST_USER_SET_FEATURES``.
925
926.. Note::
927   Back-ends that report ``VHOST_USER_F_PROTOCOL_FEATURES`` must
928   support this message even before ``VHOST_USER_SET_FEATURES`` was
929   called.
930
931``VHOST_USER_SET_PROTOCOL_FEATURES``
932  :id: 16
933  :equivalent ioctl: ``VHOST_SET_FEATURES``
934  :request payload: ``u64``
935  :reply payload: N/A
936
937  Enable protocol features in the underlying vhost implementation.
938
939  Only legal if feature bit ``VHOST_USER_F_PROTOCOL_FEATURES`` is present in
940  ``VHOST_USER_GET_FEATURES``.  It does not need to be acknowledged by
941  ``VHOST_USER_SET_FEATURES``.
942
943.. Note::
944   Back-ends that report ``VHOST_USER_F_PROTOCOL_FEATURES`` must support
945   this message even before ``VHOST_USER_SET_FEATURES`` was called.
946
947``VHOST_USER_SET_OWNER``
948  :id: 3
949  :equivalent ioctl: ``VHOST_SET_OWNER``
950  :request payload: N/A
951  :reply payload: N/A
952
953  Issued when a new connection is established. It marks the sender
954  as the front-end that owns of the session. This can be used on the *back-end*
955  as a "session start" flag.
956
957``VHOST_USER_RESET_OWNER``
958  :id: 4
959  :request payload: N/A
960  :reply payload: N/A
961
962.. admonition:: Deprecated
963
964   This is no longer used. Used to be sent to request disabling all
965   rings, but some back-ends interpreted it to also discard connection
966   state (this interpretation would lead to bugs).  It is recommended
967   that back-ends either ignore this message, or use it to disable all
968   rings.
969
970``VHOST_USER_SET_MEM_TABLE``
971  :id: 5
972  :equivalent ioctl: ``VHOST_SET_MEM_TABLE``
973  :request payload: multiple memory regions description
974  :reply payload: (postcopy only) multiple memory regions description
975
976  Sets the memory map regions on the back-end so it can translate the
977  vring addresses. In the ancillary data there is an array of file
978  descriptors for each memory mapped region. The size and ordering of
979  the fds matches the number and ordering of memory regions.
980
981  When ``VHOST_USER_POSTCOPY_LISTEN`` has been received,
982  ``SET_MEM_TABLE`` replies with the bases of the memory mapped
983  regions to the front-end.  The back-end must have mmap'd the regions but
984  not yet accessed them and should not yet generate a userfault
985  event.
986
987.. Note::
988   ``NEED_REPLY_MASK`` is not set in this case.  QEMU will then
989   reply back to the list of mappings with an empty
990   ``VHOST_USER_SET_MEM_TABLE`` as an acknowledgement; only upon
991   reception of this message may the guest start accessing the memory
992   and generating faults.
993
994``VHOST_USER_SET_LOG_BASE``
995  :id: 6
996  :equivalent ioctl: ``VHOST_SET_LOG_BASE``
997  :request payload: u64
998  :reply payload: N/A
999
1000  Sets logging shared memory space.
1001
1002  When the back-end has ``VHOST_USER_PROTOCOL_F_LOG_SHMFD`` protocol feature,
1003  the log memory fd is provided in the ancillary data of
1004  ``VHOST_USER_SET_LOG_BASE`` message, the size and offset of shared
1005  memory area provided in the message.
1006
1007``VHOST_USER_SET_LOG_FD``
1008  :id: 7
1009  :equivalent ioctl: ``VHOST_SET_LOG_FD``
1010  :request payload: N/A
1011  :reply payload: N/A
1012
1013  Sets the logging file descriptor, which is passed as ancillary data.
1014
1015``VHOST_USER_SET_VRING_NUM``
1016  :id: 8
1017  :equivalent ioctl: ``VHOST_SET_VRING_NUM``
1018  :request payload: vring state description
1019  :reply payload: N/A
1020
1021  Set the size of the queue.
1022
1023``VHOST_USER_SET_VRING_ADDR``
1024  :id: 9
1025  :equivalent ioctl: ``VHOST_SET_VRING_ADDR``
1026  :request payload: vring address description
1027  :reply payload: N/A
1028
1029  Sets the addresses of the different aspects of the vring.
1030
1031``VHOST_USER_SET_VRING_BASE``
1032  :id: 10
1033  :equivalent ioctl: ``VHOST_SET_VRING_BASE``
1034  :request payload: vring state description
1035  :reply payload: N/A
1036
1037  Sets the base offset in the available vring.
1038
1039``VHOST_USER_GET_VRING_BASE``
1040  :id: 11
1041  :equivalent ioctl: ``VHOST_USER_GET_VRING_BASE``
1042  :request payload: vring state description
1043  :reply payload: vring state description
1044
1045  Get the available vring base offset.
1046
1047``VHOST_USER_SET_VRING_KICK``
1048  :id: 12
1049  :equivalent ioctl: ``VHOST_SET_VRING_KICK``
1050  :request payload: ``u64``
1051  :reply payload: N/A
1052
1053  Set the event file descriptor for adding buffers to the vring. It is
1054  passed in the ancillary data.
1055
1056  Bits (0-7) of the payload contain the vring index. Bit 8 is the
1057  invalid FD flag. This flag is set when there is no file descriptor
1058  in the ancillary data. This signals that polling should be used
1059  instead of waiting for the kick. Note that if the protocol feature
1060  ``VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS`` has been negotiated
1061  this message isn't necessary as the ring is also started on the
1062  ``VHOST_USER_VRING_KICK`` message, it may however still be used to
1063  set an event file descriptor (which will be preferred over the
1064  message) or to enable polling.
1065
1066``VHOST_USER_SET_VRING_CALL``
1067  :id: 13
1068  :equivalent ioctl: ``VHOST_SET_VRING_CALL``
1069  :request payload: ``u64``
1070  :reply payload: N/A
1071
1072  Set the event file descriptor to signal when buffers are used. It is
1073  passed in the ancillary data.
1074
1075  Bits (0-7) of the payload contain the vring index. Bit 8 is the
1076  invalid FD flag. This flag is set when there is no file descriptor
1077  in the ancillary data. This signals that polling will be used
1078  instead of waiting for the call. Note that if the protocol features
1079  ``VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS`` and
1080  ``VHOST_USER_PROTOCOL_F_BACKEND_REQ`` have been negotiated this message
1081  isn't necessary as the ``VHOST_USER_BACKEND_VRING_CALL`` message can be
1082  used, it may however still be used to set an event file descriptor
1083  or to enable polling.
1084
1085``VHOST_USER_SET_VRING_ERR``
1086  :id: 14
1087  :equivalent ioctl: ``VHOST_SET_VRING_ERR``
1088  :request payload: ``u64``
1089  :reply payload: N/A
1090
1091  Set the event file descriptor to signal when error occurs. It is
1092  passed in the ancillary data.
1093
1094  Bits (0-7) of the payload contain the vring index. Bit 8 is the
1095  invalid FD flag. This flag is set when there is no file descriptor
1096  in the ancillary data. Note that if the protocol features
1097  ``VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS`` and
1098  ``VHOST_USER_PROTOCOL_F_BACKEND_REQ`` have been negotiated this message
1099  isn't necessary as the ``VHOST_USER_BACKEND_VRING_ERR`` message can be
1100  used, it may however still be used to set an event file descriptor
1101  (which will be preferred over the message).
1102
1103``VHOST_USER_GET_QUEUE_NUM``
1104  :id: 17
1105  :equivalent ioctl: N/A
1106  :request payload: N/A
1107  :reply payload: u64
1108
1109  Query how many queues the back-end supports.
1110
1111  This request should be sent only when ``VHOST_USER_PROTOCOL_F_MQ``
1112  is set in queried protocol features by
1113  ``VHOST_USER_GET_PROTOCOL_FEATURES``.
1114
1115``VHOST_USER_SET_VRING_ENABLE``
1116  :id: 18
1117  :equivalent ioctl: N/A
1118  :request payload: vring state description
1119  :reply payload: N/A
1120
1121  Signal the back-end to enable or disable corresponding vring.
1122
1123  This request should be sent only when
1124  ``VHOST_USER_F_PROTOCOL_FEATURES`` has been negotiated.
1125
1126``VHOST_USER_SEND_RARP``
1127  :id: 19
1128  :equivalent ioctl: N/A
1129  :request payload: ``u64``
1130  :reply payload: N/A
1131
1132  Ask vhost user back-end to broadcast a fake RARP to notify the migration
1133  is terminated for guest that does not support GUEST_ANNOUNCE.
1134
1135  Only legal if feature bit ``VHOST_USER_F_PROTOCOL_FEATURES`` is
1136  present in ``VHOST_USER_GET_FEATURES`` and protocol feature bit
1137  ``VHOST_USER_PROTOCOL_F_RARP`` is present in
1138  ``VHOST_USER_GET_PROTOCOL_FEATURES``.  The first 6 bytes of the
1139  payload contain the mac address of the guest to allow the vhost user
1140  back-end to construct and broadcast the fake RARP.
1141
1142``VHOST_USER_NET_SET_MTU``
1143  :id: 20
1144  :equivalent ioctl: N/A
1145  :request payload: ``u64``
1146  :reply payload: N/A
1147
1148  Set host MTU value exposed to the guest.
1149
1150  This request should be sent only when ``VIRTIO_NET_F_MTU`` feature
1151  has been successfully negotiated, ``VHOST_USER_F_PROTOCOL_FEATURES``
1152  is present in ``VHOST_USER_GET_FEATURES`` and protocol feature bit
1153  ``VHOST_USER_PROTOCOL_F_NET_MTU`` is present in
1154  ``VHOST_USER_GET_PROTOCOL_FEATURES``.
1155
1156  If ``VHOST_USER_PROTOCOL_F_REPLY_ACK`` is negotiated, the back-end must
1157  respond with zero in case the specified MTU is valid, or non-zero
1158  otherwise.
1159
1160``VHOST_USER_SET_BACKEND_REQ_FD`` (previous name ``VHOST_USER_SET_SLAVE_REQ_FD``)
1161  :id: 21
1162  :equivalent ioctl: N/A
1163  :request payload: N/A
1164  :reply payload: N/A
1165
1166  Set the socket file descriptor for back-end initiated requests. It is passed
1167  in the ancillary data.
1168
1169  This request should be sent only when
1170  ``VHOST_USER_F_PROTOCOL_FEATURES`` has been negotiated, and protocol
1171  feature bit ``VHOST_USER_PROTOCOL_F_BACKEND_REQ`` bit is present in
1172  ``VHOST_USER_GET_PROTOCOL_FEATURES``.  If
1173  ``VHOST_USER_PROTOCOL_F_REPLY_ACK`` is negotiated, the back-end must
1174  respond with zero for success, non-zero otherwise.
1175
1176``VHOST_USER_IOTLB_MSG``
1177  :id: 22
1178  :equivalent ioctl: N/A (equivalent to ``VHOST_IOTLB_MSG`` message type)
1179  :request payload: ``struct vhost_iotlb_msg``
1180  :reply payload: ``u64``
1181
1182  Send IOTLB messages with ``struct vhost_iotlb_msg`` as payload.
1183
1184  The front-end sends such requests to update and invalidate entries in the
1185  device IOTLB. The back-end has to acknowledge the request with sending
1186  zero as ``u64`` payload for success, non-zero otherwise.
1187
1188  This request should be send only when ``VIRTIO_F_IOMMU_PLATFORM``
1189  feature has been successfully negotiated.
1190
1191``VHOST_USER_SET_VRING_ENDIAN``
1192  :id: 23
1193  :equivalent ioctl: ``VHOST_SET_VRING_ENDIAN``
1194  :request payload: vring state description
1195  :reply payload: N/A
1196
1197  Set the endianness of a VQ for legacy devices. Little-endian is
1198  indicated with state.num set to 0 and big-endian is indicated with
1199  state.num set to 1. Other values are invalid.
1200
1201  This request should be sent only when
1202  ``VHOST_USER_PROTOCOL_F_CROSS_ENDIAN`` has been negotiated.
1203  Backends that negotiated this feature should handle both
1204  endiannesses and expect this message once (per VQ) during device
1205  configuration (ie. before the front-end starts the VQ).
1206
1207``VHOST_USER_GET_CONFIG``
1208  :id: 24
1209  :equivalent ioctl: N/A
1210  :request payload: virtio device config space
1211  :reply payload: virtio device config space
1212
1213  When ``VHOST_USER_PROTOCOL_F_CONFIG`` is negotiated, this message is
1214  submitted by the vhost-user front-end to fetch the contents of the
1215  virtio device configuration space, vhost-user back-end's payload size
1216  MUST match the front-end's request, vhost-user back-end uses zero length of
1217  payload to indicate an error to the vhost-user front-end. The vhost-user
1218  front-end may cache the contents to avoid repeated
1219  ``VHOST_USER_GET_CONFIG`` calls.
1220
1221``VHOST_USER_SET_CONFIG``
1222  :id: 25
1223  :equivalent ioctl: N/A
1224  :request payload: virtio device config space
1225  :reply payload: N/A
1226
1227  When ``VHOST_USER_PROTOCOL_F_CONFIG`` is negotiated, this message is
1228  submitted by the vhost-user front-end when the Guest changes the virtio
1229  device configuration space and also can be used for live migration
1230  on the destination host. The vhost-user back-end must check the flags
1231  field, and back-ends MUST NOT accept SET_CONFIG for read-only
1232  configuration space fields unless the live migration bit is set.
1233
1234``VHOST_USER_CREATE_CRYPTO_SESSION``
1235  :id: 26
1236  :equivalent ioctl: N/A
1237  :request payload: crypto session description
1238  :reply payload: crypto session description
1239
1240  Create a session for crypto operation. The back-end must return
1241  the session id, 0 or positive for success, negative for failure.
1242  This request should be sent only when
1243  ``VHOST_USER_PROTOCOL_F_CRYPTO_SESSION`` feature has been
1244  successfully negotiated.  It's a required feature for crypto
1245  devices.
1246
1247``VHOST_USER_CLOSE_CRYPTO_SESSION``
1248  :id: 27
1249  :equivalent ioctl: N/A
1250  :request payload: ``u64``
1251  :reply payload: N/A
1252
1253  Close a session for crypto operation which was previously
1254  created by ``VHOST_USER_CREATE_CRYPTO_SESSION``.
1255
1256  This request should be sent only when
1257  ``VHOST_USER_PROTOCOL_F_CRYPTO_SESSION`` feature has been
1258  successfully negotiated.  It's a required feature for crypto
1259  devices.
1260
1261``VHOST_USER_POSTCOPY_ADVISE``
1262  :id: 28
1263  :request payload: N/A
1264  :reply payload: userfault fd
1265
1266  When ``VHOST_USER_PROTOCOL_F_PAGEFAULT`` is supported, the front-end
1267  advises back-end that a migration with postcopy enabled is underway,
1268  the back-end must open a userfaultfd for later use.  Note that at this
1269  stage the migration is still in precopy mode.
1270
1271``VHOST_USER_POSTCOPY_LISTEN``
1272  :id: 29
1273  :request payload: N/A
1274  :reply payload: N/A
1275
1276  The front-end advises back-end that a transition to postcopy mode has
1277  happened.  The back-end must ensure that shared memory is registered
1278  with userfaultfd to cause faulting of non-present pages.
1279
1280  This is always sent sometime after a ``VHOST_USER_POSTCOPY_ADVISE``,
1281  and thus only when ``VHOST_USER_PROTOCOL_F_PAGEFAULT`` is supported.
1282
1283``VHOST_USER_POSTCOPY_END``
1284  :id: 30
1285  :request payload: N/A
1286  :reply payload: ``u64``
1287
1288  The front-end advises that postcopy migration has now completed.  The back-end
1289  must disable the userfaultfd. The reply is an acknowledgement
1290  only.
1291
1292  When ``VHOST_USER_PROTOCOL_F_PAGEFAULT`` is supported, this message
1293  is sent at the end of the migration, after
1294  ``VHOST_USER_POSTCOPY_LISTEN`` was previously sent.
1295
1296  The value returned is an error indication; 0 is success.
1297
1298``VHOST_USER_GET_INFLIGHT_FD``
1299  :id: 31
1300  :equivalent ioctl: N/A
1301  :request payload: inflight description
1302  :reply payload: N/A
1303
1304  When ``VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD`` protocol feature has
1305  been successfully negotiated, this message is submitted by the front-end to
1306  get a shared buffer from back-end. The shared buffer will be used to
1307  track inflight I/O by back-end. QEMU should retrieve a new one when vm
1308  reset.
1309
1310``VHOST_USER_SET_INFLIGHT_FD``
1311  :id: 32
1312  :equivalent ioctl: N/A
1313  :request payload: inflight description
1314  :reply payload: N/A
1315
1316  When ``VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD`` protocol feature has
1317  been successfully negotiated, this message is submitted by the front-end to
1318  send the shared inflight buffer back to the back-end so that the back-end
1319  could get inflight I/O after a crash or restart.
1320
1321``VHOST_USER_GPU_SET_SOCKET``
1322  :id: 33
1323  :equivalent ioctl: N/A
1324  :request payload: N/A
1325  :reply payload: N/A
1326
1327  Sets the GPU protocol socket file descriptor, which is passed as
1328  ancillary data. The GPU protocol is used to inform the front-end of
1329  rendering state and updates. See vhost-user-gpu.rst for details.
1330
1331``VHOST_USER_RESET_DEVICE``
1332  :id: 34
1333  :equivalent ioctl: N/A
1334  :request payload: N/A
1335  :reply payload: N/A
1336
1337  Ask the vhost user back-end to disable all rings and reset all
1338  internal device state to the initial state, ready to be
1339  reinitialized. The back-end retains ownership of the device
1340  throughout the reset operation.
1341
1342  Only valid if the ``VHOST_USER_PROTOCOL_F_RESET_DEVICE`` protocol
1343  feature is set by the back-end.
1344
1345``VHOST_USER_VRING_KICK``
1346  :id: 35
1347  :equivalent ioctl: N/A
1348  :request payload: vring state description
1349  :reply payload: N/A
1350
1351  When the ``VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS`` protocol
1352  feature has been successfully negotiated, this message may be
1353  submitted by the front-end to indicate that a buffer was added to
1354  the vring instead of signalling it using the vring's kick file
1355  descriptor or having the back-end rely on polling.
1356
1357  The state.num field is currently reserved and must be set to 0.
1358
1359``VHOST_USER_GET_MAX_MEM_SLOTS``
1360  :id: 36
1361  :equivalent ioctl: N/A
1362  :request payload: N/A
1363  :reply payload: u64
1364
1365  When the ``VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS`` protocol
1366  feature has been successfully negotiated, this message is submitted
1367  by the front-end to the back-end. The back-end should return the message with a
1368  u64 payload containing the maximum number of memory slots for
1369  QEMU to expose to the guest. The value returned by the back-end
1370  will be capped at the maximum number of ram slots which can be
1371  supported by the target platform.
1372
1373``VHOST_USER_ADD_MEM_REG``
1374  :id: 37
1375  :equivalent ioctl: N/A
1376  :request payload: N/A
1377  :reply payload: single memory region description
1378
1379  When the ``VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS`` protocol
1380  feature has been successfully negotiated, this message is submitted
1381  by the front-end to the back-end. The message payload contains a memory
1382  region descriptor struct, describing a region of guest memory which
1383  the back-end device must map in. When the
1384  ``VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS`` protocol feature has
1385  been successfully negotiated, along with the
1386  ``VHOST_USER_REM_MEM_REG`` message, this message is used to set and
1387  update the memory tables of the back-end device.
1388
1389  Exactly one file descriptor from which the memory is mapped is
1390  passed in the ancillary data.
1391
1392  In postcopy mode (see ``VHOST_USER_POSTCOPY_LISTEN``), the back-end
1393  replies with the bases of the memory mapped region to the front-end.
1394  For further details on postcopy, see ``VHOST_USER_SET_MEM_TABLE``.
1395  They apply to ``VHOST_USER_ADD_MEM_REG`` accordingly.
1396
1397``VHOST_USER_REM_MEM_REG``
1398  :id: 38
1399  :equivalent ioctl: N/A
1400  :request payload: N/A
1401  :reply payload: single memory region description
1402
1403  When the ``VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS`` protocol
1404  feature has been successfully negotiated, this message is submitted
1405  by the front-end to the back-end. The message payload contains a memory
1406  region descriptor struct, describing a region of guest memory which
1407  the back-end device must unmap. When the
1408  ``VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS`` protocol feature has
1409  been successfully negotiated, along with the
1410  ``VHOST_USER_ADD_MEM_REG`` message, this message is used to set and
1411  update the memory tables of the back-end device.
1412
1413  The memory region to be removed is identified by its guest address,
1414  user address and size. The mmap offset is ignored.
1415
1416  No file descriptors SHOULD be passed in the ancillary data. For
1417  compatibility with existing incorrect implementations, the back-end MAY
1418  accept messages with one file descriptor. If a file descriptor is
1419  passed, the back-end MUST close it without using it otherwise.
1420
1421``VHOST_USER_SET_STATUS``
1422  :id: 39
1423  :equivalent ioctl: VHOST_VDPA_SET_STATUS
1424  :request payload: ``u64``
1425  :reply payload: N/A
1426
1427  When the ``VHOST_USER_PROTOCOL_F_STATUS`` protocol feature has been
1428  successfully negotiated, this message is submitted by the front-end to
1429  notify the back-end with updated device status as defined in the Virtio
1430  specification.
1431
1432``VHOST_USER_GET_STATUS``
1433  :id: 40
1434  :equivalent ioctl: VHOST_VDPA_GET_STATUS
1435  :request payload: N/A
1436  :reply payload: ``u64``
1437
1438  When the ``VHOST_USER_PROTOCOL_F_STATUS`` protocol feature has been
1439  successfully negotiated, this message is submitted by the front-end to
1440  query the back-end for its device status as defined in the Virtio
1441  specification.
1442
1443``VHOST_USER_GET_SHARED_OBJECT``
1444  :id: 41
1445  :equivalent ioctl: N/A
1446  :request payload: ``struct VhostUserShared``
1447  :reply payload: dmabuf fd
1448
1449  When the ``VHOST_USER_PROTOCOL_F_SHARED_OBJECT`` protocol
1450  feature has been successfully negotiated, and the UUID is found
1451  in the exporters cache, this message is submitted by the front-end
1452  to retrieve a given dma-buf fd from a given back-end, determined by
1453  the requested UUID. Back-end will reply passing the fd when the operation
1454  is successful, or no fd otherwise.
1455
1456Back-end message types
1457----------------------
1458
1459For this type of message, the request is sent by the back-end and the reply
1460is sent by the front-end.
1461
1462``VHOST_USER_BACKEND_IOTLB_MSG`` (previous name ``VHOST_USER_SLAVE_IOTLB_MSG``)
1463  :id: 1
1464  :equivalent ioctl: N/A (equivalent to ``VHOST_IOTLB_MSG`` message type)
1465  :request payload: ``struct vhost_iotlb_msg``
1466  :reply payload: N/A
1467
1468  Send IOTLB messages with ``struct vhost_iotlb_msg`` as payload.
1469  The back-end sends such requests to notify of an IOTLB miss, or an IOTLB
1470  access failure. If ``VHOST_USER_PROTOCOL_F_REPLY_ACK`` is
1471  negotiated, and back-end set the ``VHOST_USER_NEED_REPLY`` flag, the front-end
1472  must respond with zero when operation is successfully completed, or
1473  non-zero otherwise.  This request should be send only when
1474  ``VIRTIO_F_IOMMU_PLATFORM`` feature has been successfully
1475  negotiated.
1476
1477``VHOST_USER_BACKEND_CONFIG_CHANGE_MSG`` (previous name ``VHOST_USER_SLAVE_CONFIG_CHANGE_MSG``)
1478  :id: 2
1479  :equivalent ioctl: N/A
1480  :request payload: N/A
1481  :reply payload: N/A
1482
1483  When ``VHOST_USER_PROTOCOL_F_CONFIG`` is negotiated, vhost-user
1484  back-end sends such messages to notify that the virtio device's
1485  configuration space has changed, for those host devices which can
1486  support such feature, host driver can send ``VHOST_USER_GET_CONFIG``
1487  message to the back-end to get the latest content. If
1488  ``VHOST_USER_PROTOCOL_F_REPLY_ACK`` is negotiated, and the back-end sets the
1489  ``VHOST_USER_NEED_REPLY`` flag, the front-end must respond with zero when
1490  operation is successfully completed, or non-zero otherwise.
1491
1492``VHOST_USER_BACKEND_VRING_HOST_NOTIFIER_MSG`` (previous name ``VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG``)
1493  :id: 3
1494  :equivalent ioctl: N/A
1495  :request payload: vring area description
1496  :reply payload: N/A
1497
1498  Sets host notifier for a specified queue. The queue index is
1499  contained in the ``u64`` field of the vring area description. The
1500  host notifier is described by the file descriptor (typically it's a
1501  VFIO device fd) which is passed as ancillary data and the size
1502  (which is mmap size and should be the same as host page size) and
1503  offset (which is mmap offset) carried in the vring area
1504  description. QEMU can mmap the file descriptor based on the size and
1505  offset to get a memory range. Registering a host notifier means
1506  mapping this memory range to the VM as the specified queue's notify
1507  MMIO region. The back-end sends this request to tell QEMU to de-register
1508  the existing notifier if any and register the new notifier if the
1509  request is sent with a file descriptor.
1510
1511  This request should be sent only when
1512  ``VHOST_USER_PROTOCOL_F_HOST_NOTIFIER`` protocol feature has been
1513  successfully negotiated.
1514
1515``VHOST_USER_BACKEND_VRING_CALL`` (previous name ``VHOST_USER_SLAVE_VRING_CALL``)
1516  :id: 4
1517  :equivalent ioctl: N/A
1518  :request payload: vring state description
1519  :reply payload: N/A
1520
1521  When the ``VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS`` protocol
1522  feature has been successfully negotiated, this message may be
1523  submitted by the back-end to indicate that a buffer was used from
1524  the vring instead of signalling this using the vring's call file
1525  descriptor or having the front-end relying on polling.
1526
1527  The state.num field is currently reserved and must be set to 0.
1528
1529``VHOST_USER_BACKEND_VRING_ERR`` (previous name ``VHOST_USER_SLAVE_VRING_ERR``)
1530  :id: 5
1531  :equivalent ioctl: N/A
1532  :request payload: vring state description
1533  :reply payload: N/A
1534
1535  When the ``VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS`` protocol
1536  feature has been successfully negotiated, this message may be
1537  submitted by the back-end to indicate that an error occurred on the
1538  specific vring, instead of signalling the error file descriptor
1539  set by the front-end via ``VHOST_USER_SET_VRING_ERR``.
1540
1541  The state.num field is currently reserved and must be set to 0.
1542
1543``VHOST_USER_BACKEND_SHARED_OBJECT_ADD``
1544  :id: 6
1545  :equivalent ioctl: N/A
1546  :request payload: ``struct VhostUserShared``
1547  :reply payload: N/A
1548
1549  When the ``VHOST_USER_PROTOCOL_F_SHARED_OBJECT`` protocol
1550  feature has been successfully negotiated, this message can be submitted
1551  by the backends to add themselves as exporters to the virtio shared lookup
1552  table. The back-end device gets associated with a UUID in the shared table.
1553  The back-end is responsible of keeping its own table with exported dma-buf fds.
1554  When another back-end tries to import the resource associated with the UUID,
1555  it will send a message to the front-end, which will act as a proxy to the
1556  exporter back-end. If ``VHOST_USER_PROTOCOL_F_REPLY_ACK`` is negotiated, and
1557  the back-end sets the ``VHOST_USER_NEED_REPLY`` flag, the front-end must
1558  respond with zero when operation is successfully completed, or non-zero
1559  otherwise.
1560
1561``VHOST_USER_BACKEND_SHARED_OBJECT_REMOVE``
1562  :id: 7
1563  :equivalent ioctl: N/A
1564  :request payload: ``struct VhostUserShared``
1565  :reply payload: N/A
1566
1567  When the ``VHOST_USER_PROTOCOL_F_SHARED_OBJECT`` protocol
1568  feature has been successfully negotiated, this message can be submitted
1569  by the backend to remove themselves from to the virtio-dmabuf shared
1570  table API. The shared table will remove the back-end device associated with
1571  the UUID. If ``VHOST_USER_PROTOCOL_F_REPLY_ACK`` is negotiated, and the
1572  back-end sets the ``VHOST_USER_NEED_REPLY`` flag, the front-end must respond
1573  with zero when operation is successfully completed, or non-zero otherwise.
1574
1575``VHOST_USER_BACKEND_SHARED_OBJECT_LOOKUP``
1576  :id: 8
1577  :equivalent ioctl: N/A
1578  :request payload: ``struct VhostUserShared``
1579  :reply payload: dmabuf fd and ``u64``
1580
1581  When the ``VHOST_USER_PROTOCOL_F_SHARED_OBJECT`` protocol
1582  feature has been successfully negotiated, this message can be submitted
1583  by the backends to retrieve a given dma-buf fd from the virtio-dmabuf
1584  shared table given a UUID. Frontend will reply passing the fd and a zero
1585  when the operation is successful, or non-zero otherwise. Note that if the
1586  operation fails, no fd is sent to the backend.
1587
1588.. _reply_ack:
1589
1590VHOST_USER_PROTOCOL_F_REPLY_ACK
1591-------------------------------
1592
1593The original vhost-user specification only demands replies for certain
1594commands. This differs from the vhost protocol implementation where
1595commands are sent over an ``ioctl()`` call and block until the back-end
1596has completed.
1597
1598With this protocol extension negotiated, the sender (QEMU) can set the
1599``need_reply`` [Bit 3] flag to any command. This indicates that the
1600back-end MUST respond with a Payload ``VhostUserMsg`` indicating success
1601or failure. The payload should be set to zero on success or non-zero
1602on failure, unless the message already has an explicit reply body.
1603
1604The reply payload gives QEMU a deterministic indication of the result
1605of the command. Today, QEMU is expected to terminate the main vhost-user
1606loop upon receiving such errors. In future, qemu could be taught to be more
1607resilient for selective requests.
1608
1609For the message types that already solicit a reply from the back-end,
1610the presence of ``VHOST_USER_PROTOCOL_F_REPLY_ACK`` or need_reply bit
1611being set brings no behavioural change. (See the Communication_
1612section for details.)
1613
1614.. _backend_conventions:
1615
1616Backend program conventions
1617===========================
1618
1619vhost-user back-ends can provide various devices & services and may
1620need to be configured manually depending on the use case. However, it
1621is a good idea to follow the conventions listed here when
1622possible. Users, QEMU or libvirt, can then rely on some common
1623behaviour to avoid heterogeneous configuration and management of the
1624back-end programs and facilitate interoperability.
1625
1626Each back-end installed on a host system should come with at least one
1627JSON file that conforms to the vhost-user.json schema. Each file
1628informs the management applications about the back-end type, and binary
1629location. In addition, it defines rules for management apps for
1630picking the highest priority back-end when multiple match the search
1631criteria (see ``@VhostUserBackend`` documentation in the schema file).
1632
1633If the back-end is not capable of enabling a requested feature on the
1634host (such as 3D acceleration with virgl), or the initialization
1635failed, the back-end should fail to start early and exit with a status
1636!= 0. It may also print a message to stderr for further details.
1637
1638The back-end program must not daemonize itself, but it may be
1639daemonized by the management layer. It may also have a restricted
1640access to the system.
1641
1642File descriptors 0, 1 and 2 will exist, and have regular
1643stdin/stdout/stderr usage (they may have been redirected to /dev/null
1644by the management layer, or to a log handler).
1645
1646The back-end program must end (as quickly and cleanly as possible) when
1647the SIGTERM signal is received. Eventually, it may receive SIGKILL by
1648the management layer after a few seconds.
1649
1650The following command line options have an expected behaviour. They
1651are mandatory, unless explicitly said differently:
1652
1653--socket-path=PATH
1654
1655  This option specify the location of the vhost-user Unix domain socket.
1656  It is incompatible with --fd.
1657
1658--fd=FDNUM
1659
1660  When this argument is given, the back-end program is started with the
1661  vhost-user socket as file descriptor FDNUM. It is incompatible with
1662  --socket-path.
1663
1664--print-capabilities
1665
1666  Output to stdout the back-end capabilities in JSON format, and then
1667  exit successfully. Other options and arguments should be ignored, and
1668  the back-end program should not perform its normal function.  The
1669  capabilities can be reported dynamically depending on the host
1670  capabilities.
1671
1672The JSON output is described in the ``vhost-user.json`` schema, by
1673```@VHostUserBackendCapabilities``.  Example:
1674
1675.. code:: json
1676
1677  {
1678    "type": "foo",
1679    "features": [
1680      "feature-a",
1681      "feature-b"
1682    ]
1683  }
1684
1685vhost-user-input
1686----------------
1687
1688Command line options:
1689
1690--evdev-path=PATH
1691
1692  Specify the linux input device.
1693
1694  (optional)
1695
1696--no-grab
1697
1698  Do no request exclusive access to the input device.
1699
1700  (optional)
1701
1702vhost-user-gpu
1703--------------
1704
1705Command line options:
1706
1707--render-node=PATH
1708
1709  Specify the GPU DRM render node.
1710
1711  (optional)
1712
1713--virgl
1714
1715  Enable virgl rendering support.
1716
1717  (optional)
1718
1719vhost-user-blk
1720--------------
1721
1722Command line options:
1723
1724--blk-file=PATH
1725
1726  Specify block device or file path.
1727
1728  (optional)
1729
1730--read-only
1731
1732  Enable read-only.
1733
1734  (optional)
1735