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 v2] virtio-blk: restore VIRTIO_BLK_F_FLUSH and VIRTIO_BLK_F_CONFIG_WCE


On Thu, Jul 02, 2015 at 03:01:55PM +0200, Paolo Bonzini wrote:
> 
> 
> On 02/07/2015 12:51, Michael S. Tsirkin wrote:
> >>>> +\item If the VIRTIO_BLK_F_CONFIG_WCE feature is negotiated, the cache
> >>>> +  mode can be read from \field{writeback}.  0 corresponds to a writethrough
> >>>> +  cache, 1 to a writeback cache\footnote{Consistent with
> >>>> +    \ref{sec:Device Types / Block Device / Device Operation},
> >>>> +    a writethrough cache can be defined broadly as a cache that commits
> >>>> +    writes to non-volatile storage before reporting their completion.
> >>>> +    For example, a battery-backed writeback cache actually counts as
> >>>> +    writethrough according to this definition.}.
> >>>
> >>> This seems a bit too much text for a footnote, I'd still prefer it
> >>> as a simple text note.
> >>
> >> I can't do this inside an {enumerate}.  It is long-ish, but it's just
> >> documenting what existing hardware does.
> > 
> > Why not? I just tried this: note nests fine within enumerate.
> 
> I get an error from LaTeX.

Do you mean XeTex? Also - how did you write it?


> >>>> +
> >>>> +\item If the VIRTIO_BLK_F_CONFIG_WCE feature is not available, the driver
> >>>> +  can deduct the cache mode by looking at the result of negotiating
> >>>> +  VIRTIO_BLK_F_FLUSH: the cache will be in writeback mode if and only if
> >>>> +  VIRTIO_BLK_F_FLUSH is negotiated.
> >>>> +\end{enumerate}
> >>>>  
> >>>> -Some older legacy devices did not operate in writethrough mode even
> >>>> -after a driver announced lack of support for VIRTIO_BLK_F_FLUSH.
> >>>> +If the VIRTIO_BLK_F_FLUSH feature is not negotiated while
> >>>> +VIRTIO_BLK_F_CONFIG_WCE is, \field{writeback} MUST read 0 immediately
> >>>> +after feature negotiation.
> >>>
> >>> This is confusing.
> >>> Previously you simply said writeback is only valid if
> >>> VIRTIO_BLK_F_CONFIG_WCE is negotiated.
> >>
> >> This paragraph says "If the VIRTIO_BLK_F_FLUSH feature is not negotiated
> >> *while VIRTIO_BLK_F_CONFIG_WCE is*".
> > 
> > Would be clearer to revert the order then.
> 
> Sure, I can do that.
> 
> > Is this logic something that legacy devices implemented?
> > I don't see anything like this in QEMU.
> 
> It wasn't possible because of the lack of a FEATURES_OK state.  I'll
> have to document legacy behavior better.
> 
> >>> Also, what's the reset value if it is negotiated?
> >>
> >> It is not specified.  The device can make it persistent or reset it to a
> >> user-specified value.
> > 
> > Does driver have to read it on init then?
> 
> Read it or set it.  Linux does the latter.

Is there value in specifying a non zero value on reset?
Maybe we can make this 0 unconditionally?


> > I think this text could benefit from separating
> > between two concepts:
> > - device writenback mode
> > - writeback field
> > 
> > operation should refer to current mode, separately
> > field might or might not make it discoverable.
> > 
> > I see this in QEMU:
> > 
> >     /* A guest that supports VIRTIO_BLK_F_CONFIG_WCE must be able to send
> >      * cache flushes.  Thus, the "auto writethrough" behavior is never
> >      * necessary for guests that support the VIRTIO_BLK_F_CONFIG_WCE feature.
> >      * Leaving it enabled would break the following sequence:
> >      *
> >      *     Guest started with "-drive cache=writethrough"
> >      *     Guest sets status to 0
> >      *     Guest sets DRIVER bit in status field
> >      *     Guest reads host features (WCE=0, CONFIG_WCE=1)
> >      *     Guest writes guest features (WCE=0, CONFIG_WCE=1)
> >      *     Guest writes 1 to the WCE configuration field (writeback mode)
> >      *     Guest sets DRIVER_OK bit in status field
> >      *
> >      * s->blk would erroneously be placed in writethrough mode.
> >      */
> >     if (!virtio_has_feature(vdev, VIRTIO_BLK_F_CONFIG_WCE)) {
> >         aio_context_acquire(blk_get_aio_context(s->blk));
> >         blk_set_enable_write_cache(s->blk,
> >                                    virtio_has_feature(vdev, VIRTIO_BLK_F_WCE));
> >         aio_context_release(blk_get_aio_context(s->blk));
> >     }
> > 
> > 
> > is this what this text is trying to say?
> 
> This is part of the behavior that I want to clarify.

Can't say I see how this maps into the text.
you don't document what happens without VIRTIO_BLK_F_CONFIG_WCE
at all, do you?


> > 
> > 
> > 
> > 
> >>> We can't have a mandatory behaviour but also
> >>> make it optional. And driver does not propose features, it negotiates
> >>> them.
> >>
> >> Will fix.
> >>
> >>> Or maybe device must fail negotiation if it meets some criteria?
> >>
> >> Yes, but just "MAY".
> > 
> > Devices may fail negotiation if any dependencies are not met.
> > Is this the case?
> > See Feature bit requirements that we have for the net device,
> > I think that's formulated in a clearer way.
> 
> Good.  But I don't want to make it mandatory.  I'll see what I can come
> up with in v3.
> 
> > 
> >>>>  \subsection{Device Operation}\label{sec:Device Types / Block Device / Device Operation}
> >>>>  
> >>>> @@ -3871,8 +3882,25 @@ A device MUST set the \field{status} byte to VIRTIO_BLK_S_IOERR
> >>>>  for a write request if the VIRTIO_BLK_F_RO feature if offered, and MUST NOT
> >>>>  write any data.
> >>>>  
> >>>> -Upon receipt of a VIRTIO_BLK_T_FLUSH request, the device SHOULD ensure
> >>>> -that any writes which were completed are committed to non-volatile storage.
> >>>> +If the \field{VIRTIO_BLK_F_FLUSH} feature is not negotiated, the
> >>>> +device SHOULD ensure that all writes are committed to non-volatile
> >>>> +storage before reporting completion.  It MUST do so if it proposed
> >>>> +\field{VIRTIO_BLK_F_FLUSH}.  Failure to do so can cause data loss.
> >>>
> >>> The 1st one is a SHOULD because not everyone cares about data loss.
> >>> But why is the second one a MUST? Same logic seems to apply.
> >>
> >> Because then the driver can _know_ that it is safe from data losses, by
> >> looking at proposed features.
> > 
> > I still don't see a difference. the point of the 1st
> > SHOULD is that maybe it's used with e.g. -snapshot
> > so data will be discarded on qemu exit anyway.
> 
> No, that's not the point of the 1st SHOULD.  From the point of view of
> the guest, if you use "-snapshot" it is totally irrelevant whether the
> host commits to non-volatile storage.  As you wrote, data will be
> discarded so there is no separation between volatile and non-volatile
> storage.
> 
> The point of the first SHOULD is simply to document reasonable behavior
> for the case of simple drivers that do not care about data loss.

Hmm why do such *drivers* exist, or should be allowed?


> Devices that do not support VIRTIO_BLK_F_FLUSH probably would not obey
> that SHOULD.  But devices that do support VIRTIO_BLK_F_FLUSH need to do
> better, hence the MUST.
> 
> Do you think the MUST prevents the trick with "-snapshot"?  I think it
> doesn't, because the guest cannot see the difference.


Well MUST means if you don't do it you violate spec.

>  (And I think even
> "MUST"s can be overridden by a user's "I know what I am doing" option
> such as QEMU's cache.no-flush=on).

I think that's exactly the SHOULD. SHOULD means "do this always unless
you really know what you are doing". Check out the RFC.


> > Maybe we should specify that data loss is in case of a crash.
> 
> Yes.
> 
> > This seems to apply to all cases that might lead to data loss.
> > 
> > IOW driver doesn't really know it's safe from losses since
> > backend can still lose data. All driver cares about is
> > what is required from driver to avoid losses.
> 
> That's the point: do not propose VIRTIO_BLK_T_FLUSH if you can lose
> unflushed data from a crash.
> 
> >>>> +If the \field{VIRTIO_BLK_F_FLUSH} feature is negotiated, upon receipt
> >>>> +of a VIRTIO_BLK_T_FLUSH request, the device MUST ensure that any writes
> >>>> +which were completed are committed to non-volatile storage.
> >
> > If writeback is enabled, device can cache requests,
> > and driver must issue explicit flushes, correct?
> > If writeback is disabled, driver may assume data
> > is committed after request completes.
> > 
> > Above should be conformance statements for the driver.
> 
> I'll add something, but I don't think there should be conformance
> statement for the drivers about this.  Every "MUST" for the driver can
> be rephrased to a "MAY assume" on the driver and vice versa.

True but this is an important topic so it bears repetition I think.

> > 
> >>>> +
> >>>> +If the VIRTIO_BLK_F_CONFIG_WCE feature is negotiated and the
> >>>> +\field{writeback} field in configuration space is 0, the device MUST
> >>>> +ensure that all writes are committed to non-volatile storage before
> >>>> +reporting completion.
> >>>> +
> >>>> +If the VIRTIO_BLK_F_CONFIG_WCE feature is negotiated, the driver MAY
> >>>> +switch to writethrough or writeback mode by writing respectively 0 and
> >>>> +1 to the \field{writeback} field.  After writing a 0 to \field{writeback},
> >>>> +the driver MUST NOT assume that writes submitted while the field was 1
> >>>
> >>> since the last VIRTIO_BLK_F_FLUSH completed, correct?
> >>
> >> More precisely "submitted while the field was 1 and completed after the
> >> last VIRTIO_BLK_F_FLUSH was submitted".  Does it have to be specified
> >> explicitly?
> > 
> > If we want it understood correctly, I guess yes.
> 
> Ok.  I have reworked the whole description of when a write becomes
> stable.  It is longer but I think it leaves no space for interpretation.
> 
> Paolo


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