[virtio-dev] Re: [PATCH v5 1/1] Add SUSPEND bit to device status
"Zhu, Lingshan" <[email protected]> Tue, 27 Feb 2024 16:51:41 +0800
| Newsgroups | dev.linux.lists.virtio-dev,dev.linux.lists.virtio-comment |
|---|---|
| Message-ID | <[email protected]> |
On 2/27/2024 3:59 PM, David Stevens wrote: > On Tue, Feb 27, 2024 at 11:22 AM Zhu, Lingshan <[email protected]> wrote: >> On 2/27/2024 9:53 AM, David Stevens wrote: >>> Add a SUSPEND bit to the device status field to allow drivers to suspend >>> virtio devices. On systems where drivers don't directly manage interrupt >>> routing (e.g. Linux), this allows the drivers to suspend their devices >>> and prevent interrupts from being sent when the interrupt routing system >>> does not expect interrupts. >>> --- >>> content.tex | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++--- >>> 1 file changed, 84 insertions(+), 5 deletions(-) >>> >>> diff --git a/content.tex b/content.tex >>> index 0a62dce5f65f..2183c63c45ea 100644 >>> --- a/content.tex >>> +++ b/content.tex >>> @@ -49,6 +49,9 @@ \section{\field{Device Status} Field}\label{sec:Basic Facilities of a Virtio Dev >>> >>> \item[DEVICE_NEEDS_RESET (64)] Indicates that the device has experienced >>> an error from which it can't recover. >>> + >>> +\item[SUSPEND (16)] Indicates that the device has been suspended by the >>> + driver. Only valid when the VIRTIO_F_SUSPEND feature bit is negotiated. >>> \end{description} >>> >>> The \field{device status} field starts out as 0, and is reinitialized to 0 by >>> @@ -60,9 +63,11 @@ \section{\field{Device Status} Field}\label{sec:Basic Facilities of a Virtio Dev >>> initialization sequence specified in >>> \ref{sec:General Initialization And Device Operation / Device >>> Initialization}. >>> -The driver MUST NOT clear a >>> -\field{device status} bit. If the driver sets the FAILED bit, >>> -the driver MUST later reset the device before attempting to re-initialize. >>> + >>> +The driver MUST NOT clear a \field{device status} bit, except for the >>> +SUSPEND bit as described in \ref{sec:General Initialization And Device >>> +Operation / Device Suspend}. If the driver sets the FAILED bit, the >>> +driver MUST later reset the device before attempting to re-initialize. >> Comparing to add a new exception, why not just re-setting DRIVER_OK to >> let the device >> clearing SUSPEND? This issue has been addressed when Eugenio working on >> a similar STOP_BIT >> >> https://lists.oasis-open.org/archives/virtio-dev/202111/msg00020.html > I don't think the device status bit is bit-addressable, so it's not > possible to re-set DRIVER_OK without also either re-setting or > clearing SUSPEND. Please correct me if I misunderstand your point, I think it can be addressed, for example, in PCI it is an u8, the device can clear a bit in it. It may be easier to let the device to clear the SUSPEND bit. > > The linked series seems to effectively do the same thing as this patch > does. Just rather than an exception for SUSPEND, it explicitly lists > the bits which shouldn't be cleared. Although on the patch doing that, > there was feedback suggesting that it be done the way this patch does > it [1]. Personally, I think either an allowlist or a blocklist is > fine. > > [1] https://lists.oasis-open.org/archives/virtio-dev/202111/msg00025.html > >> Not sure it is my email client bug, it shows the authorship has been >> reset and >> all sign-off-by are removed. We have been working on this since 2021, >> how about >> just include our updated patch(WIP) in a new series? > Oh, sorry. I'm not very familiar with the process of collaboration > over email like this. I wasn't sure about adding Signed-off-by for > other people that haven't ready the patch yet, but I can add them > going forward if that's what's expected. And I'll fix up authorship > and add myself as Co-authored-by next time. This maps to my Intel assignment. So please let me send out a V2 and once the patch passed review process, we can add more PCI patches into the series. I will add your sign-off-by there. > > -David > >> Thanks >>> The driver SHOULD NOT rely on completion of operations of a >>> device if DEVICE_NEEDS_RESET is set. >>> @@ -73,6 +78,10 @@ \section{\field{Device Status} Field}\label{sec:Basic Facilities of a Virtio Dev >>> recover by issuing a reset. >>> \end{note} >>> >>> +If VIRTIO_F_SUSPEND is negotiated, the driver MUST manage the SUSPEND bit >>> +as described in \ref{sec:General Initialization And Device Operation / >>> +Device Suspend}. Otherwise, the driver MUST NOT set the SUSPEND bit. >>> + >>> \devicenormative{\subsection}{Device Status Field}{Basic Facilities of a Virtio Device / Device Status Field} >>> >>> The device MUST NOT consume buffers or send any used buffer >>> @@ -82,6 +91,10 @@ \section{\field{Device Status} Field}\label{sec:Basic Facilities of a Virtio Dev >>> that a reset is needed. If DRIVER_OK is set, after it sets DEVICE_NEEDS_RESET, the device >>> MUST send a device configuration change notification to the driver. >>> >>> +If VIRTIO_F_SUSPEND is negotiated, the device MUST manage the SUSPEND bit >>> +as described in \ref{sec:General Initialization And Device Operation / >>> +Device Suspend}. Otherwise, the device MUST ignore the SUSPEND bit. >>> + >>> \section{Feature Bits}\label{sec:Basic Facilities of a Virtio Device / Feature Bits} >>> >>> Each virtio device offers all the features it understands. During >>> @@ -99,10 +112,10 @@ \section{Feature Bits}\label{sec:Basic Facilities of a Virtio Device / Feature B >>> \begin{description} >>> \item[0 to 23, and 50 to 127] Feature bits for the specific device type >>> >>> -\item[24 to 41] Feature bits reserved for extensions to the queue and >>> +\item[24 to 42] Feature bits reserved for extensions to the queue and >>> feature negotiation mechanisms >>> >>> -\item[42 to 49, and 128 and above] Feature bits reserved for future extensions. >>> +\item[43 to 49, and 128 and above] Feature bits reserved for future extensions. >>> \end{description} >>> >>> \begin{note} >>> @@ -629,6 +642,67 @@ \section{Device Cleanup}\label{sec:General Initialization And Device Operation / >>> >>> Thus a driver MUST ensure a virtqueue isn't live (by device reset) before removing exposed buffers. >>> >>> +\section{Device Suspend}\label{sec:General Initialization And Device Operation / Device Suspend} >>> + >>> +When the VIRTIO_F_SUSPEND feature is negotiated, the driver can set the >>> +SUSPEND bit in \field{device status} to suspend a live device, and can >>> +clear the SUSPEND bit to resume a suspended device. A suspended device >>> +should pause its operation, but it must maintain it state such that it >>> +can immediately continue operation upon being resumed. >>> + >>> +Suspending a device via the SUSPEND bit is a seperate process from any >>> +transport-specific suspend mechanism. >>> + >>> +\drivernormative{\subsection}{Device Suspend}{General Initialization And Device Operation / Device Suspend} >>> + >>> +The driver MUST NOT set the SUSPEND bit if the DRIVER_OK bit is not set. >>> + >>> +After writing a new value to the SUSPEND bit, the driver MUST wait for >>> +the device to acknowledged the transition by reading from \field{device >>> +status} until the returned value of the SUSPEND bit matches the written >>> +value. During this period, the driver MAY abort the transition by writing >>> +a new value to the SUSPEND bit or by resetting the device. >>> + >>> +A driver MUST NOT access the device configuration space of a suspended >>> +device, except for \field{device status}. >>> + >>> +A driver MAY suspend a device that has buffers in its virtqueues. While >>> +the device is suspended, a driver MUST NOT modify any available buffers >>> +or their descriptors. >>> + >>> +A driver MUST NOT make any new buffers available to a suspended device. >>> + >>> +If a transport-specific suspend mechanism is available, the driver SHOULD >>> +use it to put the device into a deeper suspend state after setting the >>> +SUSPEND bit. >>> + >>> +\drivernormative{\subsection}{Device Suspend}{General Initialization And Device Operation / Device Suspend} >>> + >>> +A device MUST ignore writes to the SUSPEND bit if the DRIVER_OK bit is >>> +not set. >>> + >>> +A device MUST maintain its state while suspended such that all driver >>> +visible state after resuming exactly matches driver visible state >>> +before suspending. >>> + >>> +A device MUST ignore all writes to its configuration space while >>> +suspended, except for writes to \field{device status}. >>> + >>> +A device MUST NOT send notifications, access any virtqueues, or modify >>> +any fields in its configuration space while suspended. >>> + >>> +A device MAY send notifications, access any virtqueues, or modify its >>> +configuration space after the driver writes the SUSPEND bit but before >>> +the device acknowledges the transition by returning a \field{device >>> +status} value with the SUSPEND bit set. A device SHOULD finish processing >>> +and send the used buffer notification for any buffers it is able to >>> +before acknowledging the transition, but MAY retain buffers that cannot >>> +be immiedately processed (e.g. empty buffers in a network recieveq). >>> + >>> +A device SHOULD take steps to minimize its resource consumption while >>> +suspended, although what this involves is specific to the particular >>> +device implementation. >>> + >>> \chapter{Virtio Transport Options}\label{sec:Virtio Transport Options} >>> >>> Virtio can use various different buses, thus the standard is split >>> @@ -872,6 +946,11 @@ \chapter{Reserved Feature Bits}\label{sec:Reserved Feature Bits} >>> \ref{devicenormative:Basic Facilities of a Virtio Device / Feature Bits} for >>> handling features reserved for future use. >>> >>> + \item[VIRTIO_F_SUSPEND(42)] This feature indicates that the driver can >>> + suspend the device via the SUSPEND bit in \field{device status} (see >>> + \ref{sec:Basic Facilities of a Virtio Device / Device Status Field}). >>> + >>> + >>> \end{description} >>> >>> \drivernormative{\section}{Reserved Feature Bits}{Reserved Feature Bits} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]