From: "Michael S. Tsirkin" <mst@redhat.com>
To: Xiaoguang Wang <lege.wang@jaguarmicro.com>
Cc: virtio-comment@lists.linux.dev, vattunuru@marvell.com,
ndabilpuram@marvell.com, parav@nvidia.com,
leo.liu@jaguarmicro.com, angus.chen@jaguarmicro.com
Subject: Re: [PATCH] VIRTIO_F_USED_EVENT_AUTO_DISABLE: add new used buffer notification suppression mechanism
Date: Tue, 2 Jul 2024 08:00:39 -0400 [thread overview]
Message-ID: <20240702073359-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20240701034435.675-1-lege.wang@jaguarmicro.com>
Thanks for the patch!
Yet something to improve:
On Mon, Jul 01, 2024 at 11:44:35AM +0800, Xiaoguang Wang wrote:
> Currently for the PCI transport, used buffer notification suppression
> informations are located in guest memory, for example, pvirtq_event_suppress
> for packed ring and virtq_avail for split ring, then PCI devices simulated
> by hypervisors, such as QEMU, can vist these suppression informations
> directly before issuing used event, the only overheads may be just proper
> memory barriers, but for some hardware PCI devices offered by
> DPU(Data Processing Unit), DPU would need to submit DMAs to copy guest
> suppression informations to DPU internal memory, then check whether
> used event should be notified by examing this internal memory, which
> is obvious expensive, and this DMA operation is needed every time
> DPU attempts to issue used event, DPU may also choose to add a hardware
> component to polling suppression informations by submit DMAs continuously
> to get newest used event suppression infos, but it's also expensive.
>
> To help improve this sitiuations, add a new feature:
> VIRTIO_F_USED_EVENT_AUTO_DISABLE. When this feature bit is negotiated,
> devices will place new notification area for used buffer suppression
> notification in PCI bar specfied by virtio_pci_notify_cap, also for better
> used buffer notification coalescing, the device will disable later used
> buffer notifications automatically after sending one used buffer notification
> to driver, and after the driver finishes handling current used buffer event,
> it needs to notify the device to enable used buffer notification again by
> writing above new notification area in PCI bar. Device will receive
> this notification reliably, and device knows that it can issue used event
> now, but it may choose appropriate timing to send used events according to
> its notification coalescing policy , now it also does not need to DMA guest
> memory to obtain notification suppression.
>
> Signed-off-by: Xiaoguang Wang <lege.wang@jaguarmicro.com>
This proposal raises a lot of questions.
See some of them below.
> ---
> content.tex | 38 ++++++++++++++++++++++++++++++++++++++
> transport-pci.tex | 26 +++++++++++++++++++++++++-
> 2 files changed, 63 insertions(+), 1 deletion(-)
>
> diff --git a/content.tex b/content.tex
> index 0a62dce..84505da 100644
> --- a/content.tex
> +++ b/content.tex
> @@ -448,6 +448,7 @@ \section{Driver Notifications} \label{sec:Basic Facilities of a Virtio Device /
> The driver is sometimes required to send an available buffer
> notification to the device.
>
> +\subsection{Available Buffer Notifications} \label{sec:Basic Facilities of a Virtio Device / Driver notifications / Available Buffer Notifications}
> When VIRTIO_F_NOTIFICATION_DATA has not been negotiated,
> this notification contains either a virtqueue index if
> VIRTIO_F_NOTIF_CONFIG_DATA is not negotiated or device supplied virtqueue
> @@ -488,6 +489,35 @@ \section{Driver Notifications} \label{sec:Basic Facilities of a Virtio Device /
> has been negotiated, these notifications would then have
> identical \field{next_off} and \field{next_wrap} values.
>
> +\subsection{Used Buffer Event Enable Notifications} \label{sec:Basic Facilities of a Virtio Device / Driver notifications / Used Buffer Event Enable Notifications}
> +This kind of notification is only necessary when VIRTIO_F_USED_EVENT_AUTO_DISABLE has been negotiated.
This is not how you start a section. Some text from commit log
might be helpful here.
> +When this feature bit is negotiated, the device will disable used buffer notification
> +automatically after sending one used buffer notification to the driver, and after the driver
> +finishes handling current used buffer event, it needs to notify the device to enable used
> +buffer notification again.
> +
> +\begin{description}
> +\item [vq_index or vq_notif_config_data] Either virtqueue index or device
> + supplied queue notification config data corresponding to a virtqueue.
> +\item [used_off] Offset
> + within the ring where the latest used ring entry the driver has processed.
> + Without VIRTIO_F_RING_PACKED this refers to the 14 least significant bits of the
> + offset (in units of descriptor entries) within the descriptor ring where the latest used
> + ring entry the driver has processed. With VIRTIO_F_RING_PACKED this refers to the offset
> + (in units of descriptor entries) within the descriptor ring where the latest used ring
> + entry the driver has processed.
> +\item [used_wrap] Wrap Counter.
> + With VIRTIO_F_RING_PACKED this is the wrap counter
> + referring to the latest used descriptor where the driver has processed.
> + Without VIRTIO_F_RING_PACKED this refers to the most significant bit(bit 14) of the
> + offset (in units of descriptor entries) within the descriptor ring where the latest used ring
> + entry the driver has processed..
> +\item [enable_notify] Whether to enable used buffer notification.
> + The driver may benefit from just informing device the latest used ring entry
> + it has processed, but not enabling used buffer notification. This field only
> + occupies one bit, if set to 1, it will enable used buffer notification, otherwise not.
not what?
> +\end{description}
> +
I don't really understand what is this list supposed to mean.
You seem to be defining a bunch of fields which are never used?
Wouldn't a better way to put all this be to say that
the driver sends a copy of notification suppression
info to device?
In case of split - flags + used_event
In case of packed - struct pvirtq_event_suppress
> \input{shared-mem.tex}
>
> \section{Exporting Objects}\label{sec:Basic Facilities of a Virtio Device / Exporting Objects}
> @@ -872,6 +902,14 @@ \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_USED_EVENT_AUTO_DISABLE(42)] This feature indicates that the device
> + will disable used buffer notification automatically after sending one used buffer notification.
> + Note: when VIRTIO_F_RING_PACKED has not been negotiated, the maximum queue
> + size MUST NOT be greater than 16384, when VIRTIO_F_RING_PACKED has been negotiated,
> + the maximum queue size MUST NOT be greater than 16383.
This is not the place for this kind of note.
> +
> + See \ref{sec:Basic Facilities of a Virtio Device / Driver notifications / Used Buffer Event Enable Notifications}
> +
> \end{description}
>
> \drivernormative{\section}{Reserved Feature Bits}{Reserved Feature Bits}
> diff --git a/transport-pci.tex b/transport-pci.tex
> index a5c6719..62ba9dc 100644
> --- a/transport-pci.tex
> +++ b/transport-pci.tex
> @@ -551,6 +551,13 @@ \subsubsection{Notification structure layout}\label{sec:Virtio Transport Options
> cap.offset + queue_notify_off * notify_off_multiplier
> \end{lstlisting}
>
> +If the VIRTIO_F_USED_EVENT_AUTO_DISABLE feature has been negotiated, \field{notify_off_multiplier} is also
> +combined with the \field{queue_notify_off} to derive the Queue Notify address for enabling
> +used buffer notifications within a BAR for a virtqueue,
each term has to be first explained, then used.
you never bother saying what is "Queue Notify address for enabling
used buffer notifications"
> but add a 4 bytes offset:
> +\begin{lstlisting}
> + cap.offset + queue_notify_off * notify_off_multiplier + 4
quite a hack. why not just a new capability?
> +\end{lstlisting}
> +
> The \field{cap.offset} and \field{notify_off_multiplier} are taken from the
> notification capability structure above, and the \field{queue_notify_off} is
> taken from the common configuration structure.
All this is quite vague and informal.
> @@ -563,7 +570,7 @@ \subsubsection{Notification structure layout}\label{sec:Virtio Transport Options
> \devicenormative{\paragraph}{Notification capability}{Virtio Transport Options / Virtio Over PCI Bus / PCI Device Layout / Notification capability}
> The device MUST present at least one notification capability.
>
> -For devices not offering VIRTIO_F_NOTIFICATION_DATA:
> +For devices not offering VIRTIO_F_NOTIFICATION_DATA or VIRTIO_F_USED_EVENT_AUTO_DISABLE:
>
> The \field{cap.offset} MUST be 2-byte aligned.
>
> @@ -596,6 +603,23 @@ \subsubsection{Notification structure layout}\label{sec:Virtio Transport Options
> cap.length >= queue_notify_off * notify_off_multiplier + 4
> \end{lstlisting}
>
> +For devices offering VIRTIO_F_USED_EVENT_AUTO_DISABLE:
> +
> +The device MUST either present \field{notify_off_multiplier} as a
> +number that is a power of 2 that is also a multiple 4,
> +or present \field{notify_off_multiplier} as 0.
> +
> +The \field{cap.offset} MUST be 4-byte aligned.
> +
> +The value \field{cap.length} presented by the device MUST be at least 8
> +and MUST be large enough to support queue notification offsets
> +for all supported queues in all possible configurations.
> +
> +For all queues, the value \field{cap.length} presented by the device MUST satisfy:
> +\begin{lstlisting}
> +cap.length >= queue_notify_off * notify_off_multiplier + 8
> +\end{lstlisting}
> +
> \subsubsection{ISR status capability}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI Device Layout / ISR status capability}
>
> The VIRTIO_PCI_CAP_ISR_CFG capability
After reading this and the text, I can't figure out how is this feature
supposed to work without races. What if the device uses a buffer while
the driver notification is in flight to the device?
> --
> 2.34.1
next prev parent reply other threads:[~2024-07-02 12:00 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-01 3:44 [PATCH] VIRTIO_F_USED_EVENT_AUTO_DISABLE: add new used buffer notification suppression mechanism Xiaoguang Wang
2024-07-01 8:24 ` Lege Wang
2024-07-02 1:15 ` Xuan Zhuo
2024-07-02 5:30 ` [EXTERNAL] " Vamsi Krishna Attunuru
2024-07-02 7:40 ` Jason Wang
2024-07-03 4:32 ` Lege Wang
2024-07-03 5:10 ` Jason Wang
2024-07-03 7:37 ` Lege Wang
2024-07-03 7:59 ` Jason Wang
2024-07-03 8:36 ` Michael S. Tsirkin
2024-07-03 8:47 ` Jason Wang
2024-07-03 9:08 ` Michael S. Tsirkin
2024-07-04 5:37 ` Jason Wang
2024-07-04 8:30 ` Michael S. Tsirkin
2024-07-05 5:48 ` Jason Wang
2024-07-05 7:48 ` Michael S. Tsirkin
2024-07-08 1:39 ` Jason Wang
2024-07-02 12:00 ` Michael S. Tsirkin [this message]
2024-07-03 6:52 ` Lege Wang
2024-07-03 8:28 ` Michael S. Tsirkin
2024-07-03 12:14 ` Lege Wang
2024-07-03 12:34 ` Michael S. Tsirkin
2024-07-04 2:27 ` Lege Wang
2024-07-05 7:57 ` Michael S. Tsirkin
2024-07-05 11:12 ` Lege Wang
2024-07-05 11:29 ` Michael S. Tsirkin
2024-07-05 3:35 ` Lege Wang
2024-07-05 4:42 ` Parav Pandit
2024-07-05 7:52 ` Michael S. Tsirkin
2024-07-08 2:37 ` Parav Pandit
2024-07-05 8:25 ` Michael S. Tsirkin
2024-07-08 2:33 ` Parav Pandit
2024-07-05 8:00 ` Michael S. Tsirkin
2024-11-05 16:23 ` [EXTERNAL] " Vamsi Krishna Attunuru
2024-11-06 4:33 ` Jason Wang
2024-11-06 11:11 ` Vamsi Krishna Attunuru
2024-11-06 7:40 ` Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240702073359-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=angus.chen@jaguarmicro.com \
--cc=lege.wang@jaguarmicro.com \
--cc=leo.liu@jaguarmicro.com \
--cc=ndabilpuram@marvell.com \
--cc=parav@nvidia.com \
--cc=vattunuru@marvell.com \
--cc=virtio-comment@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.