This patch allows the driver to reset a queue individually.

This is very common on general network equipment. By disabling a queue,
you can quickly reclaim the buffer currently on the queue. If necessary,
we can reinitialize the queue separately.

For example, when virtio-net implements support for AF_XDP, we need to
disable a queue to release all the original buffers when AF_XDP setup.
And quickly release all the AF_XDP buffers that have been placed in the
queue when AF_XDP exits.

Signed-off-by: Xuan Zhuo <xuanz...@linux.alibaba.com>
---
 content.tex | 32 +++++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

diff --git a/content.tex b/content.tex
index 3aeb4a4..235cbf9 100644
--- a/content.tex
+++ b/content.tex
@@ -1001,7 +1001,13 @@ \subsubsection{Common configuration structure 
layout}\label{sec:Virtio Transport
 After writing 0 to \field{device_status}, the driver MUST wait for a read of
 \field{device_status} to return 0 before reinitializing the device.
 
-The driver MUST NOT write a 0 to \field{queue_enable}.
+If the VIRTIO_F_RING_RESET feature bit is not negotiated,
+the driver MUST NOT write a 0 to \field{queue_enable}.
+
+Otherwise, if the VIRTIO_F_RING_RESET feature bit is negotiated,
+the driver can stop using the queue by writing a 0 to \field{queue_enable} and
+MUST read the value back to ensure synchronization. Then optionally re-enable
+the queue.
 
 \subsubsection{Notification structure layout}\label{sec:Virtio Transport 
Options / Virtio Over PCI Bus / PCI Device Layout / Notification capability}
 
@@ -1964,9 +1970,15 @@ \subsection{MMIO Device Register 
Layout}\label{sec:Virtio Transport Options / Vi
 \field{QueueNum}, \field{QueueDescLow}, \field{QueueDescHigh},
 \field{QueueDriverLow}, \field{QueueDriverHigh}, \field{QueueDeviceLow}, 
\field{QueueDeviceHigh}.
 
-To stop using the queue the driver MUST write zero (0x0) to this
+If the VIRTIO_F_RING_RESET feature bit is not negotiated,
+to stop using the queue the driver MUST write zero (0x0) to this
 \field{QueueReady} and MUST read the value back to ensure
-synchronization.
+synchronization. But the queue cannot be re-enabled.
+
+Otherwise, if the VIRTIO_F_RING_RESET feature bit is negotiated,
+the driver can stop using the queue by writing a 0 to \field{QueueReady} and
+MUST read the value back to ensure synchronization. Then optionally re-enable
+the queue.
 
 The driver MUST ignore undefined bits in \field{InterruptStatus}.
 
@@ -6673,6 +6685,20 @@ \chapter{Reserved Feature Bits}\label{sec:Reserved 
Feature Bits}
   transport specific.
   For more details about driver notifications over PCI see \ref{sec:Virtio 
Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And 
Device Operation / Available Buffer Notifications}.
 
+  \item[VIRTIO_F_RING_RESET(40)] This feature indicates
+  that the driver can reset a queue individually.
+
+  "reset a queue" is divided into two parts. We can stop a queue first, and 
then
+  re-enable the queue. The re-enable part is optional.
+
+  In the process of independently stopping a queue, we MUST first notify the
+  device and confirm that we have successfully stopped a queue. Then we destroy
+  the state and memory of the queue.
+
+  Re-enable the queue, just like the process of a queue during the reset 
process.
+  Reallocate memory and set the state. For example, the avail index MUST be the
+  same as the reset process, set to 0.
+
 \end{description}
 
 \drivernormative{\section}{Reserved Feature Bits}{Reserved Feature Bits}
-- 
2.31.0


---------------------------------------------------------------------
To unsubscribe, e-mail: virtio-dev-unsubscr...@lists.oasis-open.org
For additional commands, e-mail: virtio-dev-h...@lists.oasis-open.org

Reply via email to