virtio spec 0.9
diff --git a/virtio.lyx b/virtio.lyx
index 37404b6..448af76 100644
--- a/virtio.lyx
+++ b/virtio.lyx
@@ -1,21 +1,29 @@
-#LyX 1.6.5 created this file. For more info see http://www.lyx.org/
-\lyxformat 345
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
 \begin_document
 \begin_header
 \textclass report
 \use_default_options false
+\maintain_unincluded_children false
 \language english
+\language_package default
 \inputencoding auto
+\fontencoding global
 \font_roman default
 \font_sans default
 \font_typewriter default
 \font_default_family default
+\use_non_tex_fonts false
 \font_sc false
 \font_osf false
 \font_sf_scale 100
 \font_tt_scale 100
 
 \graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
 \paperfontsize default
 \spacing single
 \use_hyperref false
@@ -23,9 +31,18 @@
 \use_geometry false
 \use_amsmath 1
 \use_esint 1
+\use_mhchem 1
+\use_mathdots 1
 \cite_engine basic
 \use_bibtopic false
+\use_indices false
 \paperorientation portrait
+\suppress_date false
+\use_refstyle 0
+\index Index
+\shortcut idx
+\color #008000
+\end_index
 \secnumdepth 3
 \tocdepth 3
 \paragraph_separation skip
@@ -36,8 +53,11 @@
 \paperpagestyle default
 \tracking_changes true
 \output_changes true
-\author "Rusty Russell,,," 
-\author "" 
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\author -608949062 "Rusty Russell,,," 
+\author 1 "Michael S. Tsirkin" 
 \end_header
 
 \begin_body
@@ -47,7 +67,13 @@
 \begin_inset Newline newline
 \end_inset
 
-v0.8.9 DRAFT
+v0.
+\change_deleted -608949062 1306978879
+8.10
+\change_inserted -608949062 1306978879
+9
+\change_unchanged
+ DRAFT
 \begin_inset Newline newline
 \end_inset
 
@@ -56,14 +82,28 @@
 
 \begin_layout Author
 Rusty Russell <rusty@rustcorp.com.au>
+\change_deleted -608949062 1306978916
+
 \begin_inset Newline newline
 \end_inset
 
+
+\change_unchanged
 IBM Corporation
+\change_inserted -608949062 1306978920
+ (Editor)
+\change_unchanged
+
 \end_layout
 
 \begin_layout Date
-2010 September 27.
+
+\change_deleted -608949062 1306978900
+2010 October 6.
+\change_inserted -608949062 1306978909
+2011 June 1.
+\change_unchanged
+
 \end_layout
 
 \begin_layout Chapter
@@ -193,7 +233,7 @@
 \begin_layout Standard
 \begin_inset Tabular
 <lyxtabular version="3" rows="1" columns="4">
-<features>
+<features tabularvalignment="middle">
 <column alignment="center" valignment="top" width="0">
 <column alignment="center" valignment="top" width="0">
 <column alignment="center" valignment="top" width="0">
@@ -308,7 +348,7 @@
 \begin_layout Standard
 \begin_inset Tabular
 <lyxtabular version="3" rows="8" columns="3">
-<features>
+<features tabularvalignment="middle">
 <column alignment="center" valignment="top" width="0">
 <column alignment="center" valignment="top" width="0">
 <column alignment="center" valignment="bottom" width="0">
@@ -661,7 +701,7 @@
 \begin_layout Standard
 \begin_inset Tabular
 <lyxtabular version="3" rows="4" columns="9">
-<features>
+<features tabularvalignment="middle">
 <column alignment="left" valignment="top" width="0">
 <column alignment="left" valignment="top" width="0">
 <column alignment="left" valignment="top" width="0">
@@ -953,6 +993,10 @@
 
 \size footnotesize
 Features
+\change_inserted 1 1304329091
+ bits 0:31
+\change_unchanged
+
 \end_layout
 
 \end_inset
@@ -964,6 +1008,10 @@
 
 \size footnotesize
 Features
+\change_inserted 1 1304329086
+ bits 0:31
+\change_unchanged
+
 \end_layout
 
 \end_inset
@@ -1050,7 +1098,7 @@
 \begin_layout Standard
 \begin_inset Tabular
 <lyxtabular version="3" rows="4" columns="3">
-<features>
+<features tabularvalignment="middle">
 <column alignment="left" valignment="top" width="0">
 <column alignment="left" valignment="top" width="0">
 <column alignment="left" valignment="top" width="0">
@@ -1186,6 +1234,177 @@
 \end_layout
 
 \begin_layout Standard
+
+\change_inserted 1 1304328924
+Finally, if feature bits (VIRTIO_F_FEATURES_HI) this is immediately followed
+ by two additional fields:
+\end_layout
+
+\begin_layout Standard
+
+\change_inserted 1 1304328925
+\begin_inset Tabular
+<lyxtabular version="3" rows="4" columns="3">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="0">
+<column alignment="left" valignment="top" width="0">
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304328925
+Bits
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304328925
+32
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304328925
+32
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304328925
+Read/Write
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304328925
+R
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304328925
+R+W
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304328925
+Purpose
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304328925
+
+\size footnotesize
+Device
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304328925
+
+\size footnotesize
+Guest
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304328925
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304329099
+
+\size footnotesize
+Features bits 32:63
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304329102
+
+\size footnotesize
+Features bits 32:63
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
 Immediately following these general headers, there may be device-specific
  headers:
 \end_layout
@@ -1193,7 +1412,7 @@
 \begin_layout Standard
 \begin_inset Tabular
 <lyxtabular version="3" rows="4" columns="2">
-<features>
+<features tabularvalignment="middle">
 <column alignment="left" valignment="top" width="0">
 <column alignment="left" valignment="top" width="0">
 <row>
@@ -1348,7 +1567,20 @@
 The least significant 31 bits of the first configuration field indicates
  the features that the device supports (the high bit is reserved, and will
  be used to indicate the presence of future feature bits elsewhere).
- The bits are allocated as follows:
+ 
+\change_inserted 1 1304331636
+If more than 31 feature bits are supported, the device indicates so by setting
+ feature bit 31 (see 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Reserved-Feature-Bits"
+
+\end_inset
+
+).
+ 
+\change_unchanged
+The bits are allocated as follows:
 \end_layout
 
 \begin_layout Description
@@ -1372,7 +1604,33 @@
 \begin_inset space ~
 \end_inset
 
-30 Feature bits reserved for extensions to the queue mechanism
+
+\change_inserted 1 1304329326
+4
+\change_deleted 1 1304329325
+3
+\change_unchanged
+0 Feature bits reserved for extensions to the queue 
+\change_inserted 1 1304540448
+and feature negotiation 
+\change_unchanged
+mechanism
+\change_inserted 1 1304540449
+s
+\end_layout
+
+\begin_layout Description
+
+\change_inserted 1 1304329398
+41
+\begin_inset space ~
+\end_inset
+
+to
+\begin_inset space ~
+\end_inset
+
+63 Feature bits reserved for future extensions
 \end_layout
 
 \begin_layout Standard
@@ -1407,6 +1665,19 @@
  support, it will not see that feature bit in the Device Features field
  and can go into backwards compatibility mode (or, for poor implementations,
  set the FAILED Device Status bit).
+\change_inserted 1 1304329423
+
+\end_layout
+
+\begin_layout Standard
+
+\change_inserted 1 1304331742
+Access to feature bits 32 to 63 is enabled by Guest by setting feature bit
+ 31.
+ If this bit is unset, Device must assume that all feature bits > 31 are
+ unset.
+\change_unchanged
+
 \end_layout
 
 \begin_layout Subsubsection
@@ -1784,6 +2055,9 @@
 \begin_layout Standard
 The number of descriptors in the table is specified by the Queue Size field
  for this virtqueue.
+\end_layout
+
+\begin_layout Subsection
 \begin_inset CommandInset label
 LatexCommand label
 name "sub:Indirect-Descriptors"
@@ -1888,7 +2162,38 @@
 
  field is currently 0 or 1: 1 indicating that we do not need an interrupt
  when the device consumes a descriptor from the available ring.
- This interrupt suppression is merely an optimization; it may not suppress
+ 
+\change_inserted 1 1306923367
+Alternatively, the guest can ask the device to delay interrupts until an
+ entry with an index specified by the 
+\begin_inset Quotes eld
+\end_inset
+
+used_event
+\begin_inset Quotes erd
+\end_inset
+
+ field is written in the used ring (equivalently, until the 
+\emph on
+idx
+\emph default
+ field in the used ring will reach the value 
+\emph on
+used_event + 1
+\emph default
+).
+ The method employed by the device is controlled by the VIRTIO_RING_F_EVENT_IDX
+ feature bit (see 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Reserved-Feature-Bits"
+
+\end_inset
+
+).
+ 
+\change_unchanged
+This interrupt suppression is merely an optimization; it may not suppress
  interrupts entirely.
 \end_layout
 
@@ -1937,6 +2242,17 @@
 \begin_layout Plain Layout
 
    u16 ring[qsz]; /* qsz is the Queue Size field read from device */
+\change_inserted 1 1304329945
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304329957
+
+   u16 used_event;
+\change_unchanged
+
 \end_layout
 
 \begin_layout Plain Layout
@@ -1960,8 +2276,71 @@
 \emph on
 available
 \emph default
- ring (the flag is kept here because this is the only part of the virtqueue
- written by the device).
+ ring
+\change_inserted 1 1304540575
+.
+ Alternatively, the 
+\begin_inset Quotes eld
+\end_inset
+
+avail_event
+\begin_inset Quotes erd
+\end_inset
+
+ field can be used by the device to hint that no notification is necessary
+ until an entry with an index specified by the 
+\begin_inset Quotes eld
+\end_inset
+
+avail_event
+\begin_inset Quotes erd
+\end_inset
+
+ is written in the available ring (equivalently, until the 
+\emph on
+idx
+\emph default
+ field in the available ring will reach the value 
+\emph on
+avail_event + 1
+\emph default
+).
+
+\change_unchanged
+ 
+\change_inserted 1 1304540614
+The method employed by the device is controlled by the guest through the
+ VIRTIO_RING_F_EVENT_IDX feature bit (see 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "cha:Reserved-Feature-Bits"
+
+\end_inset
+
+).
+ 
+\change_deleted 1 1304331235
+(the flag is kept here because this is the only part of the virtqueue written
+ by the device)
+\change_inserted 1 1304540560
+
+\begin_inset Foot
+status open
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304331235
+These fields are kept here because this is the only part of the virtqueue
+ written by the device
+\change_unchanged
+
+\end_layout
+
+\end_inset
+
+
+\change_unchanged
+.
 \end_layout
 
 \begin_layout Standard
@@ -2043,6 +2422,17 @@
 \begin_layout Plain Layout
 
     struct vring_used_elem ring[qsz];
+\change_inserted 1 1304330369
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304330380
+
+    u16 avail_event;
+\change_unchanged
+
 \end_layout
 
 \begin_layout Plain Layout
@@ -2062,9 +2452,13 @@
 \begin_layout Standard
 The Linux Kernel Source code contains the definitions above and helper routines
  in a more usable form, in include/linux/virtio_ring.h.
- This was explicitly licensed by IBM under the (3-clause) BSD license so
- that it can be freely used by all other projects, and is reproduced (with
- slight variation to remove Linux assumptions) in Appendix A.
+ This was explicitly licensed by IBM 
+\change_inserted 1 1304342159
+and Red Hat 
+\change_unchanged
+under the (3-clause) BSD license so that it can be freely used by all other
+ projects, and is reproduced (with slight variation to remove Linux assumptions)
+ in Appendix A.
 \end_layout
 
 \begin_layout Section
@@ -2076,8 +2470,8 @@
  and processing used buffers from the device.
  As an example, the virtio network device has two virtqueues: the transmit
  virtqueue and the receive virtqueue.
- The driver adds outgoing (read-only) packets are added to the transmit
- virtqueue, and then frees them after they are used.
+ The driver adds outgoing (read-only) packets to the transmit virtqueue,
+ and then frees them after they are used.
  Similarly, incoming (write-only) buffers are added to the receive virtqueue,
  and processed after they are used.
 \end_layout
@@ -2371,12 +2765,61 @@
 \emph default
  checking the suppression flag: it's OK to notify gratuitously, but not
  to omit a required notification.
- So again, we use a memory barrier here before reading the flags.
+ So again, we use a memory barrier here before reading the flags
+\change_inserted 1 1304336099
+ or the avail_event field
+\change_unchanged
+.
 \end_layout
 
 \begin_layout Standard
-If the VRING_USED_F_NOTIFY flag is not set, we go ahead and write to the
- PCI configuration space.
+If 
+\change_inserted 1 1304336234
+the VIRTIO_F_RING_EVENT_IDX feature is not negotiated, and if 
+\change_unchanged
+the VRING_USED_F_NOTIFY flag is not set, we go ahead and write to the PCI
+ configuration space.
+\change_inserted 1 1304336255
+
+\end_layout
+
+\begin_layout Standard
+
+\change_inserted 1 1304336617
+If the VIRTIO_F_RING_EVENT_IDX feature is negotiated, we read the avail_event
+ field in the available ring structure.
+ If the available index crossed_the 
+\emph on
+avail_event
+\emph default
+ field value since the last notification, we go ahead and write to the PCI
+ configuration space.
+ The 
+\emph on
+avail_event
+\emph default
+ field wraps naturally at 65536 as well:
+\end_layout
+
+\begin_layout Standard
+
+\change_inserted 1 1304336524
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304336569
+
+(u16)(new_idx - avail_event - 1) < (u16)(new_idx - old_idx)
+\end_layout
+
+\end_inset
+
+
+\change_unchanged
+
 \end_layout
 
 \begin_layout Subsection
@@ -2405,7 +2848,66 @@
 \end_layout
 
 \begin_layout Enumerate
-If the VRING_AVAIL_F_NO_INTERRUPT flag is not set in avail->flags:
+
+\change_inserted 1 1304336736
+Determine whether an interrupt is necessary:
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+
+\change_inserted 1 1306923440
+If the VIRTIO_F_RING_EVENT_IDX feature is not negotiated: check if 
+\change_deleted 1 1304336781
+I
+\change_unchanged
+f the VRING_AVAIL_F_NO_INTERRUPT flag is not set in avail\SpecialChar \nobreakdash-
+>flags
+\change_inserted 1 1304336788
+
+\end_layout
+
+\begin_layout Enumerate
+
+\change_deleted 1 1304336785
+:
+\change_inserted 1 1306923443
+If the VIRTIO_F_RING_EVENT_IDX feature is negotiated: check whether the
+ used index crossed the 
+\emph on
+used_event
+\emph default
+ field value since the last update.
+ The 
+\emph on
+used_event
+\emph default
+ field wraps naturally at 65536 as well:
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304336902
+
+(u16)(new_idx - used_event - 1) < (u16)(new_idx - old_idx)
+\end_layout
+
+\end_inset
+
+
+\change_unchanged
+
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+
+\change_inserted 1 1304336714
+If an interrupt is necessary:
+\change_unchanged
+
 \end_layout
 
 \begin_deeper
@@ -2460,13 +2962,87 @@
 \end_layout
 
 \begin_layout Standard
+
+\change_inserted 1 1306923408
+For each ring, guest should then disable interrupts by writing VRING_AVAIL_F_NO_
+INTERRUPT flag in avail structure, if required.
+ It can then process used ring entries finally enabling interrupts by clearing
+ the VRING_AVAIL_F_NO_INTERRUPT flag or updating the EVENT_IDX field in
+ the available structure, Guest should then execute a memory barrier, and
+ then recheck the ring empty condition.
+ This is necessary to handle the case where, after the last check and before
+ enabling interrupts, an interrupt has been suppressed by the device:
+\end_layout
+
+\begin_layout Standard
 \begin_inset listings
 inline false
 status open
 
 \begin_layout Plain Layout
 
-while (vq->last_seen_used != vring->used.idx) {
+\change_inserted 1 1304342051
+
+vring_disable_interrupts(vq);
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304341878
+
+for (;;) {
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304341880
+
+    if 
+\change_deleted 1 1304341882
+while 
+\change_unchanged
+(vq->last_seen_used != vring->used.idx) {
+\change_inserted 1 1304341888
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304342047
+
+		vring_enable_interrupts(vq);
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304341986
+
+		mb();
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304341964
+
+		if (vq->last_seen_used != vring->used.idx)
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304341974
+
+			break;
+\change_unchanged
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304341887
+
+    }
+\change_unchanged
+
 \end_layout
 
 \begin_layout Plain Layout
@@ -2639,7 +3215,7 @@
 
 \begin_layout Standard
 Any change to configuration space, or new virtqueues, or behavioural changes,
- should be indicated be negotiation of a new feature bit.
+ should be indicated by negotiation of a new feature bit.
  This establishes clarity
 \begin_inset Foot
 status open
@@ -2664,6 +3240,7 @@
 \begin_layout Standard
 \begin_inset CommandInset nomencl_print
 LatexCommand printnomenclature
+set_width "none"
 
 \end_inset
 
@@ -2717,6 +3294,15 @@
 \begin_layout Plain Layout
 
  * Copyright 2007, 2009, IBM Corporation
+\change_inserted 1 1304341032
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304341075
+
+ * Copyright 2011, Red Hat, Inc
 \end_layout
 
 \begin_layout Plain Layout
@@ -3015,6 +3601,17 @@
 \begin_layout Plain Layout
 
         uint16_t ring[];
+\change_inserted 1 1304340808
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304340816
+
+        uint16_t used_event;
+\change_unchanged
+
 \end_layout
 
 \begin_layout Plain Layout
@@ -3086,6 +3683,17 @@
 \begin_layout Plain Layout
 
         struct vring_used_elem ring[];
+\change_inserted 1 1304340824
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304340831
+
+        uint16_t avail_event;
+\change_unchanged
+
 \end_layout
 
 \begin_layout Plain Layout
@@ -3223,7 +3831,13 @@
 
 \begin_layout Plain Layout
 
- *      __u16 used_idx;
+ *      __u16 
+\change_inserted 1 1306923408
+EVENT_IDX
+\change_deleted 1 1306923408
+used_idx
+\change_unchanged
+;
 \end_layout
 
 \begin_layout Plain Layout
@@ -3322,12 +3936,58 @@
 
 \begin_layout Plain Layout
 
-                + sizeof(uint16_t)*2 + sizeof(struct vring_used_elem)*num;
+                + sizeof(uint16_t)*
+\change_deleted 1 1304340844
+2
+\change_inserted 1 1304340844
+3
+\change_unchanged
+ + sizeof(struct vring_used_elem)*num;
 \end_layout
 
 \begin_layout Plain Layout
 
 }
+\change_inserted 1 1304340918
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304340918
+
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304340987
+
+static inline int vring_need_event(uint16_t event_idx, uint16_t new_idx,
+ uint16_t old_idx)
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304340944
+
+{
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304341001
+
+         return (uint16_t)(new_idx - event_idx - 1) < (uint16_t)(new_idx
+ - old_idx); 
+\end_layout
+
+\begin_layout Plain Layout
+
+\change_inserted 1 1304340938
+
+}
+\change_unchanged
+
 \end_layout
 
 \begin_layout Plain Layout
@@ -3351,7 +4011,13 @@
 \end_layout
 
 \begin_layout Standard
-Currently there are three device-independent feature bits defined:
+Currently there are 
+\change_inserted 1 1306923235
+five
+\change_deleted 1 1304330657
+three
+\change_unchanged
+ device-independent feature bits defined:
 \end_layout
 
 \begin_layout Description
@@ -3361,7 +4027,11 @@
 
 (24) Negotiating this feature indicates that the driver wants an interrupt
  if the device runs out of available descriptors on a virtqueue, even though
- interrupts are suppressed using the VRING_AVAIL_F_NO_INTERRUPT flag.
+ interrupts are suppressed using the VRING_AVAIL_F_NO_INTERRUPT flag
+\change_inserted 1 1304341161
+ or the used_event field
+\change_unchanged
+.
  An example of this is the networking driver: it doesn't need to know every
  time a packet is transmitted, but it does need to free the transmitted
  packets a finite time after they are transmitted.
@@ -3386,6 +4056,53 @@
 \end_layout
 
 \begin_layout Description
+
+\change_inserted 1 1306923206
+VIRTIO_F_RING_EVENT_IDX(29) This feature enables the 
+\emph on
+used_event
+\emph default
+ and the 
+\emph on
+avail_event
+\emph default
+ fields.
+ If set, it indicates that the device should ignore the 
+\emph on
+flags
+\emph default
+ field in the available ring structure.
+ Instead, the
+\emph on
+ used_event
+\emph default
+ field in this structure is used by guest to suppress device interrupts.
+ Further, the driver should ignore the 
+\emph on
+flags
+\emph default
+ field in the used ring structure.
+ Instead, the 
+\emph on
+avail_event
+\emph default
+ field in this structure is used by the device to suppress notifications.
+ If unset, the driver should ignore the 
+\emph on
+used_event
+\emph default
+ field; the device should ignore the 
+\emph on
+avail_event
+\emph default
+ field; the 
+\emph on
+flags
+\emph default
+ field is used
+\end_layout
+
+\begin_layout Description
 VIRTIO_F_BAD_FEATURE(30) This feature should never be negotiated by the
  guest; doing so is an indication that the guest is faulty
 \begin_inset Foot
@@ -3399,6 +4116,16 @@
 \end_inset
 
 
+\change_inserted 1 1304330854
+
+\end_layout
+
+\begin_layout Description
+
+\change_inserted 1 1304330961
+VIRTIO_F_FEATURES_HIGH(31) This feature indicates that the device supports
+ feature bits 32:63.
+ If unset, feature bits 32:63 are unset.
 \end_layout
 
 \begin_layout Chapter*
@@ -4870,12 +5597,8 @@
 \emph on
 type
 \emph default
- of the request is either a read (VIRTIO_BLK_T_IN),
-\change_deleted 0 1285634492
- 
-\change_unchanged
- a write (VIRTIO_BLK_T_OUT), a scsi packet command (VIRTIO_BLK_T_SCSI_CMD
- or VIRTIO_BLK_T_SCSI_CMD_OUT
+ of the request is either a read (VIRTIO_BLK_T_IN), a write (VIRTIO_BLK_T_OUT),
+ a scsi packet command (VIRTIO_BLK_T_SCSI_CMD or VIRTIO_BLK_T_SCSI_CMD_OUT
 \begin_inset Foot
 status open
 
@@ -4993,11 +5716,7 @@
 \emph on
 data
 \emph default
- field is either read-only or write-only, depending on
-\change_deleted 0 1285634492
- 
-\change_unchanged
- the request.
+ field is either read-only or write-only, depending on the request.
  The size of the read or write can be derived from the total size of the
  request buffers.
 \end_layout
@@ -5169,8 +5888,17 @@
 
 \begin_layout Description
 Virtqueues 0:receiveq(port0).
- 1:transmitq(port0), 2:control receiveq, 3:control transmitq, 4:receiveq(port1),
- 5:transmitq(port1), ...
+ 1:transmitq(port0), 2:control receiveq
+\begin_inset Foot
+status open
+
+\begin_layout Plain Layout
+Ports 2 onwards only if VIRTIO_CONSOLE_F_MULTIPORT is set
+\end_layout
+
+\end_inset
+
+, 3:control transmitq, 4:receiveq(port1), 5:transmitq(port1), ...
 \end_layout
 
 \begin_layout Description
@@ -5318,7 +6046,7 @@
 \end_layout
 
 \begin_layout Enumerate
-If the host specified a port 'name', a sysfs attribute is created with the
+If the host specified a port `name', a sysfs attribute is created with the
  name filled in, so that udev rules can be written that can create a symlink
  from the port's name to the char device for port discovery by applications
  in the guest.
@@ -5572,7 +6300,13 @@
 
 \begin_layout Plain Layout
 
-struct virtio_console_config {
+struct virtio_
+\change_inserted -608949062 1305437680
+balloon
+\change_deleted -608949062 1305437671
+console
+\change_unchanged
+_config {
 \end_layout
 
 \begin_layout Plain Layout