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] virtio-transport: Clarify requirements


Ping.

On 06-12-23, 15:13, Viresh Kumar wrote:
> On 05-12-23, 14:18, Cornelia Huck wrote:
> > On Tue, Dec 05 2023, Viresh Kumar <viresh.kumar@linaro.org> wrote:
> > > diff --git a/content.tex b/content.tex
> 
> > I think we should concentrate on the transport being what links device
> > and driver together... what about (reusing parts of your writeup):
> > 
> > "Devices and drivers can use different transport methods to enable
> > interaction, for example PCI, MMIO, or Channel I/O. The transport
> > methods define various aspects of the communication between the device
> > and the driver, like device discovery, exchanging capabilities,
> > interrupt handling, data transfer, etc. For example, in a host/guest
> > architecture, the host might expose a device to the guest on a PCI bus,
> > and the guest will use a PCI-specific driver to interact with it.
> > 
> > The standard is split into sections describing general virtio
> > implementation and transport-specific sections."
> 
> Looks good.
> 
> > > +\section{Virtio Transport Requirements}\label{sec:Virtio Transport Options / Virtio Transport Requirements}
> > > +
> > > +\devicenormative{\subsection}{Virtio Transport Requirements}{Virtio Transport Options}
> > 
> > I'm not sure we can introduce MUST (NOT) requirements for basic
> > functionality after the spec has been published for quite a time already
> > (although I'd assume every implementation is fulfilling the requirements
> > anyway)... thoughts?
> 
> Fair point. I think it would be okay to use MUST (NOT) if we are sure
> that the existing implementations are fulfilling the requirements.
> Else maybe we can use SHOULD (NOT) ?
> 
> > > +The device MUST present each event, in a transport defined way, from the
> > > +moment it takes place until the driver acknowledges the event.
> > 
> > I don't believe "event" is well-defined here.
> 
> I liked Alex's suggestion, how about that ?
> 
> "A device initiated transaction can isn't considered complete until
> acknowledged by the driver. As such data MUST remain visible to the
> driver until the transaction is complete"
> 
> > > +The device MUST NOT access virtqueue's contents before the driver
> > > +notifies that the queue is ready for access, in a transport defined way.
> > > +
> > > +The device MUST NOT access buffers on the virtqueue, after it has
> > > +modified them and notified the driver about their availability.
> > > +
> > > +The device MUST reset the virtqueues if requested by the driver, in a
> > > +transport defined way.
> > 
> > Isn't all of this already defined in one place of the spec or another?
> 
> Yes, some of this is picked from those places only. The purpose of
> this patch is to get it all at a single place, which would be easier
> for people to go through. Especially while introducing new transports
> or device specifications.
> 
> > > +\drivernormative{\subsection}{Virtio Transport Requirements}{Virtio Transport Options}
> > > +
> > > +The driver MUST NOT access guest memory locations outside what's made
> > > +available by the device to the driver.
> > 
> > I don't think that makes sense -- I'd assume most guest memory locations
> > do not have anything to do with virtio, and we should try to avoid
> > host/guest terminology.
> 
> Hmm, you are right about the guest/host terminology. This comes mostly
> from the MMIO transport section, where a guest presents 0x100 bytes of
> memory, followed by configuration space (whose length is device/driver
> dependent). The MMIO section has this:
> 
> "The driver MUST NOT access memory locations not described in the
> table \ref{tab:Virtio Transport Options / Virtio Over MMIO / MMIO Device Register Layout}
> (or, in case of the configuration space, described in the device specification),
> MUST NOT write to the read-only registers (direction R) and
> MUST NOT read from the write-only registers (direction W)."
> 
> > > +The driver MUST NOT write to the read-only memory area and MUST NOT read
> > > +from the write-only memory area.
> > 
> > Which memory areas does that refer to? Parts of the transport-specific
> > data structures?
> 
> Yes, based again on the above MMIO section, but perhaps apply to other
> transports as well..
> 
> > > +The driver MUST acknowledge events presented by the device, as mandated
> > > +by the transport.
> > 
> > I don't think this is quite correct in the absolute -- for example, it
> > should be fine to not acknowledge events if some overriding event comes
> > along, or if the driver initiates a reset.
> 
> What about:
> 
> The driver SHOULD acknowledge events presented by the device, as
> mandated by the transport, unless a new event from the device
> overrides the previous one or the driver initiates a reset.
> 
> > > +The driver MUST NOT access virtqueue contents before the device notifies
> > > +about the readiness of the same.
> > > +
> > > +The driver MUST NOT access buffers, after it has added them to the
> > > +virtqueue and notified the device about their availability. The driver
> > > +MAY access them after the device has processed them and notified the
> > > +driver of their availability, in a transport defined way.
> > > +
> > > +The driver MAY ask the device to reset the virtqueues if, for example,
> > > +the driver times out waiting for a notification from the device for a
> > > +previously queued request.
> > 
> > Again, I believe this has already been covered in the generic
> > sections
> 
> Right, but having it all at a single place makes it more convenient,
> instead of looking at implementations.
> 
> > do we instead need to specify that a transport MUST provide
> > a method to do xy? (or SHOULD, MAY, as applicable -- it would be good to
> > list explicitly what is mandatory for a transport to implement, and what
> > is optional.)
> 
> Hmm, yeah sounds good. How about these ?
> 
> - The transport MUST provide a mechanism for device discovery at the
>   driver's end.
> 
> - The transport must provide a mechanism for the driver to identify
>   the device type.
> 
> - The transport MUST provide a mechanism for the driver to share
>   virtqueue configurations with the device.
> 
> - The transport SHOULD allow multiple virtqueues per device. The
>   number of virtqueues for a pair of device-driver are governed by the
>   individual device protocol.
> 
> - The transport MUST provide shared memory regions between the device
>   and the driver for the implementation of virtqueues.
> 
> - The transport MUST provide a mechanism for the device and the driver
>   to notify each other, for example about availability of a buffer on
>   the virtqueue.
> 
> - The transport SHOULD provide a mechanism for the driver to initiate
>   a reset of the virtqueues and device.

-- 
viresh


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