[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: [PATCH] virtio: introduce VIRTIO_F_RING_RESET for reset queue
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 <xuanzhuo@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
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]