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: [virtio-dev] [PATCH v5 1/2] content: add virtio file system device


On Wed, Jul 31, 2019 at 11:58:46AM +0200, Cornelia Huck wrote:
> On Fri, 26 Jul 2019 10:53:37 +0100
> Stefan Hajnoczi <stefanha@redhat.com> wrote:
> > +\drivernormative{\subsubsection}{Device configuration layout}{Device Types / File System Device / Device configuration layout}
> > +
> > +The driver MUST NOT write to device configuration fields.
> > +
> > +The driver MAY use from one up to \field{num_queues} virtqueues.
> 
> s/virtqueues/request virtqueues/ ? I'm still a bit unsure about the
> requirements for queue usage, see below.

Will fix, thanks.

> 
> > +
> > +\devicenormative{\subsubsection}{Device configuration layout}{Device Types / File System Device / Device configuration layout}
> > +
> > +The device MUST set \field{num_queues} to 1 or greater.
> > +
> > +\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.
> > +
> > +\subsection{Device Operation}\label{sec:Device Types / File System Device / Device Operation}
> > +
> > +Device operation consists of operating the virtqueues to facilitate file system
> > +access.
> > +
> > +The FUSE request types are as follows:
> > +\begin{itemize}
> > +\item Normal requests are made available by the driver and used by the device.
> 
> These go via the normal request queues...
> 
> > +\item Interrupt requests are made available by the driver to abort requests
> > +      that the device has not used yet.
> 
> ...and these via the hiprio queue?

Yes.

> 
> > +\end{itemize}
> > +
> > +Note that FUSE notification requests are not supported.
> > +
> > +\subsubsection{Device Operation: Request Queues}\label{sec:Device Types / File System Device / Device Operation / Device Operation: Request Queues}
> > +
> > +The driver enqueues normal requests on an arbitrary request queue and they are
> > +completed by the device on that same queue.
> 
> Do we need a device normative statement that requests MUST be completed
> on the queue they have been submitted on?

That would be impossible since the request struct has both IN and OUT
elements.  virtio-fs is a request+response queue design like
virtio-blk/virtio-scsi, not a rx/tx queue design like
virtio-net/virtio-vsock.

> 
> > The device processes requests in
> > +any order.  The driver is responsible for ensuring that ordering constraints
> > +are met by making available a dependent request only after its prerequisite
> > +request has been used.
> > +
> > +Requests have the following format:
> 
> These can be either LE or BE from what is stated below, right? Maybe
> spell it out here already?

I will add "with the endianness chosen by the driver as detailed below".

> 
> > +
> > +\begin{lstlisting}
> > +struct virtio_fs_req {
> > +        // Device-readable part
> > +        struct fuse_in_header in;
> > +        u8 datain[];
> > +
> > +        // Device-writable part
> > +        struct fuse_out_header out;
> > +        u8 dataout[];
> > +};
> > +\end{lstlisting}
> > +
> > +Note that the words "in" and "out" follow the FUSE meaning and do not indicate
> > +the direction of data transfer under VIRTIO.  "In" means input to a request and
> > +"out" means output from processing a request.
> > +
> > +\field{in} is the common header for all types of FUSE requests.
> > +
> > +\field{datain} consists of request-specific data, if any.  This is identical to
> > +the data read from the /dev/fuse device by a FUSE daemon.
> > +
> > +\field{out} is the completion header common to all types of FUSE requests.
> > +
> > +\field{dataout} consists of request-specific data, if any.  This is identical
> > +to the data written to the /dev/fuse device by a FUSE daemon.
> > +
> > +For example, the full layout of a FUSE\_READ request is as follows:
> > +
> > +\begin{lstlisting}
> > +struct virtio_fs_read_req {
> > +        // Device-readable part
> > +        struct fuse_in_header in;
> > +        union {
> > +                struct fuse_read_in readin;
> > +                u8 datain[sizeof(struct fuse_read_in)];
> > +        };
> > +
> > +        // Device-writable part
> > +        struct fuse_out_header out;
> > +        u8 dataout[out.len - sizeof(struct fuse_out_header)];
> > +};
> > +\end{lstlisting}
> > +
> > +The FUSE protocol documented in \hyperref[intro:FUSE]{FUSE} specifies the set
> > +of request types and their contents.
> > +
> > +The endianness of the FUSE protocol session is detectable by inspecting the
> > +uint32\_t \field{in.opcode} field of the FUSE\_INIT request sent by the driver
> > +to the device.  This allows the device to determine whether the session is
> > +little-endian or big-endian.
> 
> Do we need a driver normative statement that the driver MUST NOT send a
> request with a different endianness once it established the session's
> endianness via FUSE_INIT?

It is valid to send another FUSE_INIT to switch to a fresh session.  In
that case the driver could change the endianness again.  I think we want
this just in case a weird system without fixed endianness has a
bootloader running in little-endian and a guest kernel running in
big-endian, for example.

I will document this in the next revision.

> 
> > +
> > +\subsubsection{Device Operation: High Priority Queue}\label{sec:Device Types / File System Device / Device Operation / Device Operation: High Priority Queue}
> > +
> > +The hiprio queue follows the same request format as the request queues.  This
> > +queue only contains FUSE\_INTERRUPT, FUSE\_FORGET, and FUSE\_BATCH\_FORGET
> > +requests.
> 
> Does this also imply that normal request queues can't be used for
> interrupt and forget requests? The normative statement below seems to
> imply that, but I think the text here does not make it clear already.

Yes, these requests must only be placed on the hiprio queue.  Will
clarify, thanks!

> > +
> > +Interrupt and forget requests have a higher priority than normal requests.  The
> > +separate hiprio queue is used for these requests to ensure they can be
> > +delivered even when all request queues are full.
> > +
> > +\devicenormative{\paragraph}{Device Operation: High Priority Queue}{Device Types / File System Device / Device Operation / Device Operation: High Priority Queue}
> > +
> > +The device MUST NOT pause processing of the hiprio queue due to activity on a
> > +normal request queue.
> > +
> > +The device MAY process request queues concurrently with the hiprio queue.
> > +
> > +\drivernormative{\paragraph}{Device Operation: High Priority Queue}{Device Types / File System Device / Device Operation / Device Operation: High Priority Queue}
> > +
> > +The driver MUST submit FUSE\_INTERRUPT, FUSE\_FORGET, and FUSE\_BATCH\_FORGET requests solely on the hiprio queue.
> 
> This specifies that the driver MUST submit interrupt and forget request
> via the hiprio queue, but it does not specify that no other requests
> may go via the hiprio queue, what the descriptive text above implies.

Will clarify.

Thank you for your review!


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