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: [virtio] [PATCH] legacy: clean up virtqueue layout definitions


On Fri, Jan 16, 2015 at 01:01:08PM +0100, Cornelia Huck wrote:
> Generalize "Legacy Interfaces: A Note on Virtqueue Layout" to allow
> for different alignment requirements. Have pci and ccw refer to that
> section for legacy devices. Remove the double definition of virtqueue
> alignment (which referred to legacy, but was not tagged as such) from
> the ccw section.
> 
> VIRTIO-129
> 
> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>

OK this is a bugfix, it'll be appropriate for 1.0 branch,
as well as trunk?

> ---
>  content.tex |   41 ++++++++++-------------------------------
>  1 file changed, 10 insertions(+), 31 deletions(-)
> 
> diff --git a/content.tex b/content.tex
> index 1efdcc8..6a8638b 100644
> --- a/content.tex
> +++ b/content.tex
> @@ -288,7 +288,8 @@ For Legacy Interfaces, several additional
>  restrictions are placed on the virtqueue layout:
>  
>  Each virtqueue occupies two or more physically-contiguous pages
> -(usually defined as 4096 bytes, but depending on the transport)
> +(usually defined as 4096 bytes, but depending on the transport;
> +henceforth referred to as Queue Align)
>  and consists of three parts:
>  
>  \begin{tabular}{|l|l|l|}
> @@ -301,11 +302,12 @@ The bus-specific Queue Size field controls the total number of bytes
>  for the virtqueue.
>  When using the legacy interface, the transitional
>  driver MUST retrieve the Queue Size field from the device
> -and MUST allocate the total number of bytes for the virtuqueue
> -according to the following formula:
> +and MUST allocate the total number of bytes for the virtqueue
> +according to the following formula (Queue Align given in qalign and
> +Queue Size given in qsz):
>  
>  \begin{lstlisting}
> -#define ALIGN(x) (((x) + PAGE_SIZE) & ~PAGE_SIZE)
> +#define ALIGN(x) (((x) + qalign) & ~qalign)
>  static inline unsigned virtq_size(unsigned int qsz)
>  {
>       return ALIGN(sizeof(struct virtq_desc)*qsz + sizeof(u16)*(3 + qsz))
> @@ -326,7 +328,7 @@ struct virtq {
>          // A ring of available descriptor heads with free-running index.
>          struct virtq_avail avail;
>  
> -        // Padding to the next PAGE_SIZE boundary.
> +        // Padding to the next Queue Align boundary.
>          u8 pad[ Padding ];
>  
>          // A ring of used descriptor heads with free-running index.
> @@ -1761,8 +1763,8 @@ The driver typically does this as follows, for each virtqueue a device has:
>  \end{enumerate}
>  
>  \subparagraph{Legacy Interface: A Note on Virtqueue Configuration}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Device Initialization / Virtqueue Configuration / Legacy Interface: A Note on Virtqueue Configuration}
> -When using the legacy interface, the page size for a virtqueue on a PCI virtio
> -device is defined as 4096 bytes.  Driver writes the physical address, divided
> +When using the legacy interface, the queue layout follows \ref{sec:Basic Facilities of a Virtio Device / Virtqueues / Legacy Interfaces: A Note on Virtqueue Layout}~\nameref{sec:Basic Facilities of a Virtio Device / Virtqueues / Legacy Interfaces: A Note on Virtqueue Layout} with an alignment of 4096.
> +Driver writes the physical address, divided
>  by 4096 to the Queue Address field\footnote{The 4096 is based on the x86 page size, but it's also large
>  enough to ensure that the separate parts of the virtqueue are on
>  separate cache lines.
> @@ -2585,30 +2587,7 @@ struct vq_info_block_legacy {
>  \end{lstlisting}
>  
>  \field{queue} contains the guest address for queue \field{index}, \field{num} the number of buffers
> -and \field{align} the alignment.
> -
> -\subsubsection{Virtqueue Layout}\label{sec:Virtio Transport Options / Virtio over channel I/O / Device Initialization / Virtqueue Layout}
> -
> -The virtqueue is physically contiguous, with padding added to make the
> -used ring meet the align value:
> -
> -\begin{tabular}{|l|l|l|}
> -\hline
> -Descriptor Table & Available Ring (\ldots padding\ldots) & Used Ring \\
> -\hline
> -\end{tabular}
> -
> -The calculation for total size is as follows:
> -
> -\begin{lstlisting}
> -#define ALIGN(x) (((x) + align) & ~align)
> -static inline unsigned virtq_size(unsigned int num)
> -{
> -     return ALIGN(sizeof(struct virtq_desc)*num
> -                  + sizeof(u16)*(3 + num))
> -          + ALIGN(sizeof(u16)*3 + sizeof(struct virtq_used_elem)*num);
> -}
> -\end{lstlisting}
> +and \field{align} the alignment. The queue layout follows \ref{sec:Basic Facilities of a Virtio Device / Virtqueues / Legacy Interfaces: A Note on Virtqueue Layout}~\nameref{sec:Basic Facilities of a Virtio Device / Virtqueues / Legacy Interfaces: A Note on Virtqueue Layout}.
>  
>  \subsubsection{Communicating Status Information}\label{sec:Virtio Transport Options / Virtio over channel I/O / Device Initialization / Communicating Status Information}
>  
> -- 
> 1.7.9.5
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe from this mail list, you must leave the OASIS TC that 
> generates this mail.  Follow this link to all your TCs in OASIS at:
> https://www.oasis-open.org/apps/org/workgroup/portal/my_workgroups.php 


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