[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: [PATCH] virtio-blk: add provision feature to specification
This proposal extends virtio-blk protocol to support provision requests, which act as a signal to the host to provision blocks if the storage backend is thinly provisioned. Introduced new feature flag and command type: VIRTIO_BLK_F_PROVISION VIRTIO_BLK_T_PROVISION Given limited visibility into the provisioning state of the backend storage, virtio-blk will report this feature to guest OS if the storage backend is a file or if the storage backend reports support for provisioning. virtio-blk will pass through provisioning requests and delegate the handling to the storage backend. Introduced new fields in virtio_blk_config for secure provision commands: struct virtio_blk_config { ... max_provision_sectors; max_provision_seg; }; Suggested-by: Stefan Hajnoczi <stefanha@redhat.com> Suggested-by: Daniel Verkamp <dverkamp@chromium.org> Signed-off-by: Sarthak Kukreti <sarthakkukreti@chromium.org> --- content.tex | 48 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/content.tex b/content.tex index e863709..2c3cb60 100644 --- a/content.tex +++ b/content.tex @@ -4655,6 +4655,10 @@ \subsection{Feature bits}\label{sec:Device Types / Block Device / Feature bits} maximum erase sectors count in \field{max_secure_erase_sectors} and maximum erase segment number in \field{max_secure_erase_seg}. +\item[VIRTIO_BLK_F_PROVISION (17)] Device supports provision command, maximum + provision sectors count in \field{max_provision_sectors} and maximum + segment number in \field{max_provision_seg}. + \end{description} \subsubsection{Legacy Interface: Feature bits}\label{sec:Device Types / Block Device / Feature bits / Legacy Interface: Feature bits} @@ -4685,7 +4689,9 @@ \subsection{Device configuration layout}\label{sec:Device Types / Block Device / is expressed in 512-byte units if the VIRTIO_BLK_F_WRITE_ZEROES feature bit is negotiated. The parameters in the configuration space of the device \field{max_secure_erase_sectors} \field{secure_erase_sector_alignment} are expressed -in 512-byte units if the VIRTIO_BLK_F_SECURE_ERASE feature bit is negotiated. +in 512-byte units if the VIRTIO_BLK_F_SECURE_ERASE feature bit is negotiated. The +parameter in the configuration space of the device \field{max_provision_sectors} is +expressed in 512-byte units if the VIRTIO_BLK_F_PROVISION feature bit is negotiated. \begin{lstlisting} struct virtio_blk_config { @@ -4721,6 +4727,8 @@ \subsection{Device configuration layout}\label{sec:Device Types / Block Device / le32 max_secure_erase_sectors; le32 max_secure_erase_seg; le32 secure_erase_sector_alignment; + le32 max_provision_sectors; + le32 max_provision_seg; }; \end{lstlisting} @@ -4784,6 +4792,11 @@ \subsection{Device Initialization}\label{sec:Device Types / Block Device / Devic \field{secure_erase_sector_alignment} can be used by OS when splitting a request based on alignment. +\item If the VIRTIO_BLK_F_PROVISION feature is negotiated, + \field{max_provision_sectors} and \field{max_provision_seg} can be read to + determine the maximum provision sectors and the maximum number of provision + segments for the block driver to use. + \end{enumerate} \drivernormative{\subsubsection}{Device Initialization}{Device Types / Block Device / Device Initialization} @@ -4852,8 +4865,8 @@ \subsection{Device Operation}\label{sec:Device Types / Block Device / Device Ope (VIRTIO_BLK_T_OUT), a discard (VIRTIO_BLK_T_DISCARD), a write zeroes (VIRTIO_BLK_T_WRITE_ZEROES), a flush (VIRTIO_BLK_T_FLUSH), a get device ID string command (VIRTIO_BLK_T_GET_ID), a secure erase -(VIRTIO_BLK_T_SECURE_ERASE), or a get device lifetime command -(VIRTIO_BLK_T_GET_LIFETIME). +(VIRTIO_BLK_T_SECURE_ERASE), a provision (VIRTIO_BLK_T_PROVISION) or a get +device lifetime command (VIRTIO_BLK_T_GET_LIFETIME). \begin{lstlisting} #define VIRTIO_BLK_T_IN 0 @@ -4864,6 +4877,7 @@ \subsection{Device Operation}\label{sec:Device Types / Block Device / Device Ope #define VIRTIO_BLK_T_DISCARD 11 #define VIRTIO_BLK_T_WRITE_ZEROES 13 #define VIRTIO_BLK_T_SECURE_ERASE 14 +#define VIRTIO_BLK_T_PROVISION 15 \end{lstlisting} The \field{sector} number indicates the offset (multiplied by 512) where @@ -4875,11 +4889,11 @@ \subsection{Device Operation}\label{sec:Device Types / Block Device / Device Ope requests write the contents of \field{data} to the block device (in multiples of 512 bytes). -The \field{data} used for discard, secure erase or write zeroes commands -consists of one or more segments. The maximum number of segments is +The \field{data} used for discard, provision, secure erase or write zeroes +commands consists of one or more segments. The maximum number of segments is \field{max_discard_seg} for discard commands, \field{max_secure_erase_seg} for -secure erase commands and \field{max_write_zeroes_seg} for write zeroes -commands. +secure erase commands, \field{max_write_zeroes_seg} for write zeroes +commands and \field{max_provision_seg} for provision commands. Each segment is of form: \begin{lstlisting} @@ -4895,9 +4909,9 @@ \subsection{Device Operation}\label{sec:Device Types / Block Device / Device Ope \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 in write zeroes commands and allows -the device to discard the specified range, provided that following reads return -zeroes. +discarded or provisioned range. \field{unmap} is only used in write zeroes +commands and allows the device to discard the specified range, provided +that following reads return zeroes. VIRTIO_BLK_T_GET_ID requests fetch the device ID string from the device into \field{data}. The device ID string is a NUL-padded ASCII string up to 20 bytes @@ -4969,7 +4983,8 @@ \subsection{Device Operation}\label{sec:Device Types / Block Device / Device Ope The length of \field{data} MUST be a multiple of the size of struct virtio_blk_discard_write_zeroes for VIRTIO_BLK_T_DISCARD, -VIRTIO_BLK_T_SECURE_ERASE and VIRTIO_BLK_T_WRITE_ZEROES requests. +VIRTIO_BLK_T_SECURE_ERASE, VIRTIO_BLK_T_WRITE_ZEROES and VIRTIO_BLK_T_PROVISION +requests. The length of \field{data} MUST be 20 bytes for VIRTIO_BLK_T_GET_ID requests. @@ -4985,6 +5000,10 @@ \subsection{Device Operation}\label{sec:Device Types / Block Device / Device Ope \field{max_write_zeroes_seg} struct virtio_blk_discard_write_zeroes segments in \field{data}. +VIRTIO_BLK_T_PROVISION requests MUST NOT contain more than +\field{max_provision_seg} struct virtio_blk_discard_write_zeroes segments in +\field{data}. + If the VIRTIO_BLK_F_CONFIG_WCE feature is negotiated, the driver MAY switch to writethrough or writeback mode by writing respectively 0 and 1 to the \field{writeback} field. After writing a 0 to \field{writeback}, @@ -5011,8 +5030,8 @@ \subsection{Device Operation}\label{sec:Device Types / Block Device / Device Ope write any data. The device MUST set the \field{status} byte to VIRTIO_BLK_S_UNSUPP for -discard, secure erase and write zeroes commands if any unknown flag is set. -Furthermore, the device MUST set the \field{status} byte to +discard, provision, secure erase 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 @@ -5024,6 +5043,9 @@ \subsection{Device Operation}\label{sec:Device Types / Block Device / Device Ope is completed, reads of the specified ranges of sectors MUST return zeroes. This is true independent of whether \field{unmap} was set or clear. +For provision, the device MAY allocate the specified range of sectors in the +device backend storage, if the storage was thinly provisioned. + 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 -- 2.37.3.968.ga6b4b080e4-goog
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]