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

 


Help: OASIS Mailing Lists Help | MarkMail Help

virtio-dev message

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


Subject: Re: [PATCH 2/2] virtio-fs: add notification queue


* Stefan Hajnoczi (stefanha@redhat.com) wrote:
> The FUSE protocol allows the file server (device) to initiate
> communication with the client (driver) using FUSE notify messages.
> Normally only the client can initiate communication.  This feature is
> used to report asynchronous events that are not related to an in-flight
> request.
> 
> This patch adds a notification queue that works like an rx queue in
> other types of device.  The device can emit FUSE notify messages by
> using a buffer from this queue.
> 
> This mechanism was designed by Vivek Goyal <vgoyal@redhat.com>.
> 
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> TODO:
>  * Flow control?  What happens when the notification queue is empty when
>    the device wants to emit a message.  We cannot assume unlimited
>    device resources for holding back pending notifications.  Eventually
>    they will have to be dropped and/or the device needs to report an
>    error.
> ---
>  conformance.tex |  1 +
>  virtio-fs.tex   | 63 +++++++++++++++++++++++++++++++++++++++++--------
>  2 files changed, 54 insertions(+), 10 deletions(-)
> 
> diff --git a/conformance.tex b/conformance.tex
> index 25d11ec..a43eea3 100644
> --- a/conformance.tex
> +++ b/conformance.tex
> @@ -190,6 +190,7 @@ \section{Conformance Targets}\label{sec:Conformance / Conformance Targets}
>  \begin{itemize}
>  \item \ref{drivernormative:Device Types / File System Device / Device configuration layout}
>  \item \ref{drivernormative:Device Types / File System Device / Device Operation / Device Operation: High Priority Queue}
> +\item \ref{drivernormative:Device Types / File System Device / Device Operation / Device Operation: Notification Queue}
>  \item \ref{drivernormative:Device Types / File System Device / Device Operation / Device Operation: DAX Window}
>  \end{itemize}
>  
> diff --git a/virtio-fs.tex b/virtio-fs.tex
> index 158d066..a94a377 100644
> --- a/virtio-fs.tex
> +++ b/virtio-fs.tex
> @@ -25,24 +25,33 @@ \subsection{Virtqueues}\label{sec:Device Types / File System Device / Virtqueues
>  
>  \begin{description}
>  \item[0] hiprio
> -\item[1\ldots n] request queues
> +\item[1] notification queue
> +\item[2\ldots n] request queues
>  \end{description}
>  
> +The notification queue only exists if VIRTIO_FS_F_NOTIFICATION is set.
> +
>  \subsection{Feature bits}\label{sec:Device Types / File System Device / Feature bits}
>  
> -There are currently no feature bits defined.
> +\begin{description}
> +\item[VIRTIO_FS_F_NOTIFICATION (0)] Device has support for FUSE notify
> +    messages.  The notification queue is virtqueue 1.
> +\end{description}
>  
>  \subsection{Device configuration layout}\label{sec:Device Types / File System Device / Device configuration layout}
>  
> -All fields of this configuration are always available.
> -
>  \begin{lstlisting}
>  struct virtio_fs_config {
>          char tag[36];
>          le32 num_request_queues;
> +        le32 notify_buf_size;
>  };
>  \end{lstlisting}
>  
> +The \field{tag} and \field{num_request_queues} fields are always available.
> +The \field{notify_buf_size} field is only available when
> +VIRTIO_FS_F_NOTIFICATION is set.
> +
>  \begin{description}
>  \item[\field{tag}] is the name associated with this file system.  The tag is
>      encoded in UTF-8 and padded with NUL bytes if shorter than the
> @@ -53,6 +62,8 @@ \subsection{Device configuration layout}\label{sec:Device Types / File System De
>      there are no ordering guarantees between requests made available on
>      different queues.  Use of multiple queues is intended to increase
>      performance.
> +\item[\field{notify_buf_size}] is the minimum number of bytes required for each
> +    buffer in the notification queue.
>  \end{description}
>  
>  \drivernormative{\subsubsection}{Device configuration layout}{Device Types / File System Device / Device configuration layout}
> @@ -65,13 +76,20 @@ \subsection{Device configuration layout}\label{sec:Device Types / File System De
>  
>  The device MUST set \field{num_request_queues} to 1 or greater.
>  
> +The device MUST set \field{notify_buf_size} to be large enough to hold any of
> +the FUSE notify messages that this device emits.
> +

Is there some ordering requirement here to ensure that the device has
set notify_buf_size before the driver starts trying to populate the
queue with empties?

Dave

>  \subsection{Device Initialization}\label{Device Types / File System Device / Device Initialization}
>  
> -On initialization the driver first discovers the device's virtqueues.  The FUSE
> -session is started by sending a FUSE\_INIT request as defined by the FUSE
> -protocol on one request virtqueue.  All virtqueues provide access to the same
> -FUSE session and therefore only one FUSE\_INIT request is required regardless
> -of the number of available virtqueues.
> +On initialization the driver first discovers the device's virtqueues.
> +
> +The driver populates the notification queue with buffers for receiving FUSE
> +notify messages if VIRTIO_FS_F_NOTIFICATION is set.
> +
> +The FUSE session is started by sending a FUSE\_INIT request as defined by the
> +FUSE protocol on one request virtqueue.  All virtqueues provide access to the
> +same FUSE session and therefore only one FUSE\_INIT request is required
> +regardless of the number of available virtqueues.
>  
>  \subsection{Device Operation}\label{sec:Device Types / File System Device / Device Operation}
>  
> @@ -88,7 +106,8 @@ \subsection{Device Operation}\label{sec:Device Types / File System Device / Devi
>        full.
>  \end{itemize}
>  
> -Note that FUSE notification requests are not supported.
> +FUSE notify messages are received on the notification queue if
> +VIRTIO_FS_F_NOTIFICATION is set.
>  
>  \subsubsection{Device Operation: Request Queues}\label{sec:Device Types / File System Device / Device Operation / Device Operation: Request Queues}
>  
> @@ -179,6 +198,30 @@ \subsubsection{Device Operation: High Priority Queue}\label{sec:Device Types / F
>  
>  The driver MUST anticipate that request queues are processed concurrently with the hiprio queue.
>  
> +\subsubsection{Device Operation: Notification Queue}\label{sec:Device Types / File System Device / Device Operation / Device Operation: Notification Queue}
> +
> +The notification queue is populated with buffers by the driver and these
> +buffers are used by the device to emit FUSE notify messages.  Notification
> +queue buffer layout is as follows:
> +
> +\begin{lstlisting}
> +struct virtio_fs_notify {
> +        // Device-writable part
> +        struct fuse_out_header out_hdr;
> +        char outarg[notify_buf_size - sizeof(struct fuse_out_header)];
> +};
> +\end{lstlisting}
> +
> +\field{outarg} contains the FUSE notify message payload that depends on the
> +type of notification being emitted.
> +
> +\drivernormative{\paragraph}{Device Operation: Notification Queue}{Device Types / File System Device / Device Operation / Device Operation: Notification Queue}
> +
> +The driver MUST provide buffers of at least \field{notify_buf_size} bytes.
> +
> +The driver SHOULD replenish notification queue buffers sufficiently quickly so
> +that there is always at least one available buffer.
> +
>  \subsubsection{Device Operation: DAX Window}\label{sec:Device Types / File System Device / Device Operation / Device Operation: DAX Window}
>  
>  FUSE\_READ and FUSE\_WRITE requests transfer file contents between the
> -- 
> 2.23.0
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK



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