summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content.tex84
1 files changed, 81 insertions, 3 deletions
diff --git a/content.tex b/content.tex
index 3be16c8..2e75b5e 100644
--- a/content.tex
+++ b/content.tex
@@ -3534,6 +3534,14 @@ device except where noted.
\item[VIRTIO_BLK_F_CONFIG_WCE (11)] Device can toggle its cache between writeback
and writethrough modes.
+
+\item[VIRTIO_BLK_F_DISCARD (13)] Device can support discard command, maximum
+ discard sectors size in \field{max_discard_sectors} and maximum discard
+ segment number in \field{max_discard_seg}.
+
+\item[VIRTIO_BLK_F_WRITE_ZEROES (14)] Device can support write zeroes command,
+ maximum write zeroes sectors size in \field{max_write_zeroes_sectors} and
+ maximum write zeroes segment number in \field{max_write_zeroes_seg}.
\end{description}
\subsubsection{Legacy Interface: Feature bits}\label{sec:Device Types / Block Device / Feature bits / Legacy Interface: Feature bits}
@@ -3555,6 +3563,12 @@ The \field{capacity} of the device (expressed in 512-byte sectors) is always
present. The availability of the others all depend on various feature
bits as indicated above.
+The parameters in the configuration space of the device \field{max_discard_sectors}
+\field{discard_sector_alignment} are expressed in 512-byte units if the
+VIRTIO_BLK_F_DISCARD feature bit is negotiated. The \field{max_write_zeroes_sectors}
+is expressed in 512-byte units if the VIRTIO_BLK_F_WRITE_ZEROES feature
+bit is negotiated.
+
\begin{lstlisting}
struct virtio_blk_config {
le64 capacity;
@@ -3577,6 +3591,14 @@ struct virtio_blk_config {
le32 opt_io_size;
} topology;
u8 writeback;
+ u8 unused0[3];
+ le32 max_discard_sectors;
+ le32 max_discard_seg;
+ le32 discard_sector_alignment;
+ le32 max_write_zeroes_sectors;
+ le32 max_write_zeroes_seg;
+ u8 write_zeroes_may_unmap;
+ u8 unused1[3];
};
\end{lstlisting}
@@ -3618,6 +3640,17 @@ according to the native endian of the guest rather than
after reset can be either writeback or writethrough. The actual
mode can be determined by reading \field{writeback} after feature
negotiation.
+
+\item If the VIRTIO_BLK_F_DISCARD feature is negotiated,
+ \field{max_discard_sectors} and \field{max_discard_seg} can be read
+ to determine the maximum discard sectors and maximum number of discard
+ segments for the block driver to use. \field{discard_sector_alignment}
+ can be used by OS when splitting a request based on alignment.
+
+\item if the VIRTIO_BLK_F_WRITE_ZEROES feature is negotiated,
+ \field{max_write_zeroes_sectors} and \field{max_write_zeroes_seg} can
+ be read to determine the maximum write zeroes sectors and maximum
+ number of write zeroes segments for the block driver to use.
\end{enumerate}
\drivernormative{\subsubsection}{Device Initialization}{Device Types / Block Device / Device Initialization}
@@ -3641,6 +3674,9 @@ if they offer VIRTIO_BLK_F_CONFIG_WCE.
If VIRTIO_BLK_F_CONFIG_WCE is negotiated but VIRTIO_BLK_F_FLUSH
is not, the device MUST initialize \field{writeback} to 0.
+The device MUST initialize padding bytes \field{unused0} and
+\field{unused1} to 0.
+
\subsubsection{Legacy Interface: Device Initialization}\label{sec:Device Types / Block Device / Device Initialization / Legacy Interface: Device Initialization}
Because legacy devices do not have FEATURES_OK, transitional devices
@@ -3677,20 +3713,38 @@ struct virtio_blk_req {
u8 data[][512];
u8 status;
};
+
+struct virtio_blk_discard_write_zeroes {
+ le64 sector;
+ le32 num_sectors;
+ struct {
+ le32 unmap:1;
+ le32 reserved:31;
+ } flags;
+};
\end{lstlisting}
The type of the request is either a read (VIRTIO_BLK_T_IN), a write
-(VIRTIO_BLK_T_OUT), or a flush (VIRTIO_BLK_T_FLUSH).
+(VIRTIO_BLK_T_OUT), a discard (VIRTIO_BLK_T_DISCARD), a write zeroes
+(VIRTIO_BLK_T_WRITE_ZEROES) or a flush (VIRTIO_BLK_T_FLUSH).
\begin{lstlisting}
#define VIRTIO_BLK_T_IN 0
#define VIRTIO_BLK_T_OUT 1
#define VIRTIO_BLK_T_FLUSH 4
+#define VIRTIO_BLK_T_DISCARD 11
+#define VIRTIO_BLK_T_WRITE_ZEROES 13
\end{lstlisting}
The \field{sector} number indicates the offset (multiplied by 512) where
-the read or write is to occur. This field is unused and set to 0
-for scsi packet commands and for flush commands.
+the read or write is to occur. This field is unused and set to 0 for
+commands other than read or write.
+
+The \field{data} used for discard or write zeroes command is described
+by one or more virtio_blk_discard_write_zeroes structs. \field{sector}
+indicates the starting offset (in 512-byte units) of the segment, while
+\field{num_sectors} indicates the number of sectors in each discarded
+range. \field{unmap} is only used for write zeroes command.
The final \field{status} byte is written by the device: either
VIRTIO_BLK_S_OK for success, VIRTIO_BLK_S_IOERR for device or driver
@@ -3718,12 +3772,36 @@ switch to writethrough or writeback mode by writing respectively 0 and
the driver MUST NOT assume that any volatile writes have been committed
to persistent device backend storage.
+The \field{unmap} bit MUST be zero for discard commands. The driver
+MUST NOT assume anything about the data returned by read requests after
+a range of sectors has been discarded.
+
\devicenormative{\subsubsection}{Device Operation}{Device Types / Block Device / Device Operation}
A device MUST set the \field{status} byte to VIRTIO_BLK_S_IOERR
for a write request if the VIRTIO_BLK_F_RO feature if offered, and MUST NOT
write any data.
+The device MUST set the \field{status} byte to VIRTIO_BLK_S_UNSUPP for
+discard and write zeroes commands if any unknown flag is set.
+Furthermore, the device MUST set the \field{status} byte to
+VIRTIO_BLK_S_UNSUPP for discard commands if the \field{unmap} flag is set.
+
+For discard commands, the device MAY deallocate the specified range of
+sectors in the device backend storage.
+
+For write zeroes commands, if the \field{unmap} is set, the device MAY
+deallocate the specified range of sectors in the device backend storage,
+as if the DISCARD command had been sent. After a write zeroes command
+is completed, reads of the specified ranges of sectors MUST return
+zeroes. This is true independent of whether \field{unmap} was set or clear.
+
+The device SHOULD clear the \field{write_zeroes_may_unmap} field of the
+virtio configuration space if and only if a write zeroes request cannot
+result in deallocating one or more sectors. The device MAY change the
+content of the field during operation of the device; when this happens,
+the device SHOULD trigger a configuration change interrupt.
+
A write is considered volatile when it is submitted; the contents of
sectors covered by a volatile write are undefined in persistent device
backend storage until the write becomes stable. A write becomes stable