OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

virtio message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [PATCH v3] used ring: specify legacy behaviour for len field



On 20/04/2015 16:24, Michael S. Tsirkin wrote:
> many hypervisors implemented len field incorrectly.
> Document existing bugs in the legacy sections.
> 
> VIRTIO-141
> 
> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> ---
> 
> As Paolo pointed out, most devices don't really need the used len
> field. Going over QEMU code, I found more devices that seem buggy.
> So let's just document that drivers should ignore len in
> legacy mode, for all devices where this makes sense (i.e.  except
> receive queue for serial and net devices, and the rng).

Looks good.  Indeed in this cases len is used.

Thanks,

Paolo

> changes from v2
>         dropped normative statements from generic section
>         added non-normative text suggesting len is unreliable
>         updated all devices
> 
> 
>  content.tex | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 56 insertions(+), 1 deletion(-)
> 
> diff --git a/content.tex b/content.tex
> index 748c78d..ac14490 100644
> --- a/content.tex
> +++ b/content.tex
> @@ -614,6 +614,17 @@ the constant as VRING_USED_F_NO_NOTIFY, but the layout and value were
>  identical.
>  \end{note}
>  
> +\subsubsection{Legacy Interface: The Virtqueue Used
> +Ring}\label{sec:Basic Facilities of a Virtio Device / Virtqueues
> +/ The Virtqueue Used Ring/ Legacy Interface: The Virtqueue Used
> +Ring}
> +
> +Historically, many drivers ignored the \field{len} value, as a
> +result, many devices set \field{len} incorrectly.  Thus, when
> +using the legacy interface, it is generally a good idea to ignore
> +the \field{len} value in used ring entries if possible.  Specific
> +known issues are listed per device type.
> +
>  \devicenormative{\subsubsection}{The Virtqueue Used Ring}{Basic Facilities of a Virtio Device / Virtqueues / The Virtqueue Used Ring}
>  
>  The device MUST set \field{len} prior to updating the used \field{idx}.
> @@ -3236,6 +3247,15 @@ The legacy driver only presented \field{num_buffers} in the struct virtio_net_hd
>  when VIRTIO_NET_F_MRG_RXBUF was not negotiated; without that feature the
>  structure was 2 bytes shorter.
>  
> +When using the legacy interface, the driver SHOULD ignore the
> +\field{len} value in used ring entries for the transmit queues
> +and the controlq queue.
> +\begin{note}
> +Historically, some devices put
> +the total descriptor length there, even though no data was
> +actually written.
> +\end{note}
> +
>  \subsubsection{Packet Transmission}\label{sec:Device Types / Network Device / Device Operation / Packet Transmission}
>  
>  Transmitting a single packet is simple, but varies depending on
> @@ -3936,6 +3956,14 @@ MUST format the fields in struct virtio_blk_req
>  according to the native endian of the guest rather than
>  (necessarily when not using the legacy interface) little-endian.
>  
> +When using the legacy interface, transitional drivers
> +SHOULD ignore the \field{len} value in used ring entries.
> +\begin{note}
> +Historically, some devices put the total descriptor length,
> +or the total length of device-writable buffers there,
> +even when only the status byte was actually written.
> +\end{note}
> +
>  The \field{reserved} field was previously called \field{ioprio}.  \field{ioprio}
>  is a hint about the relative priorities of requests to the device:
>  higher numbers indicate more important requests.
> @@ -4259,6 +4287,14 @@ MUST format the fields in struct virtio_console_control
>  according to the native endian of the guest rather than
>  (necessarily when not using the legacy interface) little-endian.
>  
> +When using the legacy interface, the driver SHOULD ignore the
> +\field{len} value in used ring entries for the transmit queues
> +and the control transmitq.
> +\begin{note}
> +Historically, some devices put the total descriptor length there,
> +even though no data was actually written.
> +\end{note}
> +
>  \subsubsection{Legacy Interface: Framing Requirements}\label{sec:Device
>  Types / Console Device / Legacy Interface: Framing Requirements}
>  
> @@ -4301,7 +4337,7 @@ by random data by the device.
>  
>  The driver MUST NOT place driver-readable buffers into the queue.
>  
> -The driver MUST examine the length written by the driver to determine
> +The driver MUST examine the length written by the device to determine
>  how many random bytes were received.
>  
>  \devicenormative{\subsubsection}{Device Operation}{Device Types / Entropy Device / Device Operation}
> @@ -4432,6 +4468,15 @@ before using the pages.
>  The driver MUST update \field{actual} after changing the number
>  of pages in the balloon.
>  
> +\paragraph{Legacy Interface: Device Operation}\label{sec:Device
> +Types / Memory Balloon Device / Device Operation / Legacy
> +Interface: Device Operation}
> +When using the legacy interface, the driver SHOULD ignore the \field{len} value in used ring entries.
> +\begin{note}
> +Historically, some devices put the total descriptor length there,
> +even though no data was actually written.
> +\end{note}
> +
>  \subsubsection{Memory Statistics}\label{sec:Device Types / Memory Balloon Device / Device Operation / Memory Statistics}
>  
>  The stats virtqueue is atypical because communication is driven
> @@ -4649,6 +4694,16 @@ RESET.}.
>  Device operation consists of operating request queues, the control
>  queue and the event queue.
>  
> +\paragraph{Legacy Interface: Device Operation}\label{sec:Device
> +Types / SCSI Host Device / Device Operation / Legacy
> +Interface: Device Operation}
> +When using the legacy interface, the driver SHOULD ignore the \field{len} value in used ring entries.
> +\begin{note}
> +Historically, devices put the total descriptor length,
> +or the total length of device-writable buffers there,
> +even when only part of the buffers were actually written.
> +\end{note}
> +
>  \subsubsection{Device Operation: Request Queues}\label{sec:Device Types / SCSI Host Device / Device Operation / Device Operation: Request Queues}
>  
>  The driver queues requests to an arbitrary request queue, and
> 


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]