All of lore.kernel.org
 help / color / mirror / Atom feed
* [virtio-dev] [PATCH v2] Add lifetime metrics to virtio-blk
@ 2021-02-25 23:41 Enrico Granata
  2021-03-01 11:20 ` Stefan Hajnoczi
  0 siblings, 1 reply; 3+ messages in thread
From: Enrico Granata @ 2021-02-25 23:41 UTC (permalink / raw)
  To: virtio-dev

In many embedded systems, virtio-blk implementations are
backed by eMMC or UFS storage devices, which are subject to
predictable and measurable wear over time due to repeated write
cycles.

For such systems, it can be important to be able to track
accurately the amount of wear imposed on the storage over
time and surface it to applications. In a native deployments
this is generally handled by the physical block device driver
but no such provision is made in virtio-blk to expose these
metrics for devices where it makes sense to do so.

This patch adds support to virtio-blk for lifetime and wear
metrics to be exposed to the guest when a deployment of
virtio-blk is done over compatible eMMC or UFS storage.

Signed-off-by: Enrico Granata <egranata@google.com>
---
 content.tex | 31 +++++++++++++++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)

diff --git a/content.tex b/content.tex
index 835f1ea..0e73ff0 100644
--- a/content.tex
+++ b/content.tex
@@ -4418,6 +4418,9 @@ \subsection{Feature bits}\label{sec:Device Types
/ Block Device / Feature bits}
 \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}.
+
+\item[VIRTIO_BLK_F_LIFETIME (15)] Device supports providing storage lifetime
+     information.
 \end{description}

 \subsubsection{Legacy Interface: Feature bits}\label{sec:Device Types
/ Block Device / Feature bits / Legacy Interface: Feature bits}
@@ -4601,8 +4604,9 @@ \subsection{Device Operation}\label{sec:Device
Types / Block Device / Device Ope

 The type of the request is either a read (VIRTIO_BLK_T_IN), a write
 (VIRTIO_BLK_T_OUT), a discard (VIRTIO_BLK_T_DISCARD), a write zeroes
-(VIRTIO_BLK_T_WRITE_ZEROES), a flush (VIRTIO_BLK_T_FLUSH), or a get device ID
-string command (VIRTIO_BLK_T_GET_ID).
+(VIRTIO_BLK_T_WRITE_ZEROES), a flush (VIRTIO_BLK_T_FLUSH), a get device ID
+string command (VIRTIO_BLK_T_GET_ID), or a get device lifetime
+command (VIRTIO_BLK_T_GET_LIFETIME).

 \begin{lstlisting}
 #define VIRTIO_BLK_T_IN           0
@@ -4611,6 +4615,7 @@ \subsection{Device Operation}\label{sec:Device
Types / Block Device / Device Ope
 #define VIRTIO_BLK_T_GET_ID       8
 #define VIRTIO_BLK_T_DISCARD      11
 #define VIRTIO_BLK_T_WRITE_ZEROES 13
+#define VIRTIO_BLK_T_GET_LIFETIME 15
 \end{lstlisting}

 The \field{sector} number indicates the offset (multiplied by 512) where
@@ -4648,6 +4653,23 @@ \subsection{Device Operation}\label{sec:Device
Types / Block Device / Device Ope
 \field{data}.  The device ID string is a NUL-padded ASCII string up to 20 bytes
 long.  If the string is 20 bytes long then there is no NUL terminator.

+The \field{data} used for VIRTIO_BLK_T_GET_LIFETIME requests is populated by
+the device, and is of the form:
+
+\begin{lstlisting}
+struct virtio_blk_lifetime {
+    le16 pre_eol_info;
+    le16 device_lifetime_est_a;
+    le16 device_lifetime_est_b;
+};
+\end{lstlisting}
+
+The device lifetime metrics \field{pre_eol_info}, \field{device_lifetime_est_a}
+and \field{device_lifetime_est_b} have the semantics described by the JEDEC
+standard No.84-B50 for the extended CSD register fields \field{PRE_EOL_INFO}
+\field{DEVICE_LIFETIME_EST_TYP_A} and \field{DEVICE_LIFETIME_EST_TYP_B}
+respectively.
+
 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
 error or VIRTIO_BLK_S_UNSUPP for a request unsupported by device:
@@ -4754,6 +4776,11 @@ \subsection{Device Operation}\label{sec:Device
Types / Block Device / Device Ope
 (case~\ref{item:flush3}).  Failure to do so can cause data loss
 in case of a crash.

+If the device is backed by eMMC or UFS persistent storage, the device SHOULD
+offer the VIRTIO_BLK_F_LIFETIME flag. The flag MUST NOT be offered if
the device
+is backed by storage for which the lifetime metrics as described in
this document
+cannot be obtained or have no useful meaning.
+
 If the driver changes \field{writeback} between the submission of the write
 and its completion, the write could be either volatile or stable when
 its completion is reported; in other words, the exact behavior is undefined.
--
2.30.1.766.gb4fecdf3b7-goog

---------------------------------------------------------------------
To unsubscribe, e-mail: virtio-dev-unsubscribe@lists.oasis-open.org
For additional commands, e-mail: virtio-dev-help@lists.oasis-open.org


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [virtio-dev] [PATCH v2] Add lifetime metrics to virtio-blk
  2021-02-25 23:41 [virtio-dev] [PATCH v2] Add lifetime metrics to virtio-blk Enrico Granata
@ 2021-03-01 11:20 ` Stefan Hajnoczi
  2021-03-01 17:52   ` Enrico Granata
  0 siblings, 1 reply; 3+ messages in thread
From: Stefan Hajnoczi @ 2021-03-01 11:20 UTC (permalink / raw)
  To: Enrico Granata; +Cc: virtio-dev

[-- Attachment #1: Type: text/plain, Size: 1127 bytes --]

On Thu, Feb 25, 2021 at 04:41:41PM -0700, Enrico Granata wrote:
> @@ -4611,6 +4615,7 @@ \subsection{Device Operation}\label{sec:Device
> Types / Block Device / Device Ope
>  #define VIRTIO_BLK_T_GET_ID       8
>  #define VIRTIO_BLK_T_DISCARD      11
>  #define VIRTIO_BLK_T_WRITE_ZEROES 13
> +#define VIRTIO_BLK_T_GET_LIFETIME 15

Sorry I missed this in the previous revision:

There is some funny business in the Linux drivers/block/virtio_blk.c
driver and QEMU hw/block/virtio-blk.c device implementations where the
least significant bit indicates a driver-to-device DMA transfer when
set and a device-to-driver DMA transfer when clear. That's why
DISCARD/WRITE_ZEROES have odd-numbered request types but GET_ID has an
even-numbered request type.

The implementations should probably be overhauled to stop doing this.
There doesn't seem to be a good reason for it! :P

To make life easy, please choose an even-numbered request type. That way
these implementations will treat VIRTIO_BLK_T_GET_LIFETIME as a "read"
instead of a "write". 10, 12, or 14 would work.

Otherwise:

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [virtio-dev] [PATCH v2] Add lifetime metrics to virtio-blk
  2021-03-01 11:20 ` Stefan Hajnoczi
@ 2021-03-01 17:52   ` Enrico Granata
  0 siblings, 0 replies; 3+ messages in thread
From: Enrico Granata @ 2021-03-01 17:52 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: virtio-dev

Thanks for pointing this issue out :) I respun a v3 patch with a new value (10)

Please feel free to take a look when you get a chance.

- Enrico

On Mon, Mar 1, 2021 at 4:20 AM Stefan Hajnoczi <stefanha@redhat.com> wrote:
>
> On Thu, Feb 25, 2021 at 04:41:41PM -0700, Enrico Granata wrote:
> > @@ -4611,6 +4615,7 @@ \subsection{Device Operation}\label{sec:Device
> > Types / Block Device / Device Ope
> >  #define VIRTIO_BLK_T_GET_ID       8
> >  #define VIRTIO_BLK_T_DISCARD      11
> >  #define VIRTIO_BLK_T_WRITE_ZEROES 13
> > +#define VIRTIO_BLK_T_GET_LIFETIME 15
>
> Sorry I missed this in the previous revision:
>
> There is some funny business in the Linux drivers/block/virtio_blk.c
> driver and QEMU hw/block/virtio-blk.c device implementations where the
> least significant bit indicates a driver-to-device DMA transfer when
> set and a device-to-driver DMA transfer when clear. That's why
> DISCARD/WRITE_ZEROES have odd-numbered request types but GET_ID has an
> even-numbered request type.
>
> The implementations should probably be overhauled to stop doing this.
> There doesn't seem to be a good reason for it! :P
>
> To make life easy, please choose an even-numbered request type. That way
> these implementations will treat VIRTIO_BLK_T_GET_LIFETIME as a "read"
> instead of a "write". 10, 12, or 14 would work.
>
> Otherwise:
>
> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

---------------------------------------------------------------------
To unsubscribe, e-mail: virtio-dev-unsubscribe@lists.oasis-open.org
For additional commands, e-mail: virtio-dev-help@lists.oasis-open.org


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-03-01 17:52 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-25 23:41 [virtio-dev] [PATCH v2] Add lifetime metrics to virtio-blk Enrico Granata
2021-03-01 11:20 ` Stefan Hajnoczi
2021-03-01 17:52   ` Enrico Granata

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.