OASIS Open Mailing List Archives  ·  All Lists  ·  virtio  ·  2023-08

virtio — archive

[Date Prev]  |  [Thread Prev]  |  [Thread Next]  |  [Date Next]   —  [Date Index]  |  [Thread Index]  |  [Month Index]  |  [List Home]

[PATCH requirements v4 0/7] virtio net requirements for 1.4


? 2023/8/17 ??12:57, Parav Pandit ??: > >> From: Heng Qi <[email protected]> >> Sent: Wednesday, August 16, 2023 6:07 PM >> >> >> ? 2023/8/16 ??6:46, Parav Pandit ??: >>>> From: Heng Qi <[email protected]> >>>> Sent: Wednesday, August 16, 2023 2:01 PM >>>> >>>> ? 2023/8/15 ??3:45, Parav Pandit ??: >>>>> Add virtio net device notification coalescing improvements requirements. >>>>> >>>>> Signed-off-by: Parav Pandit <[email protected]> >>>>> Acked-by: David Edmondson <[email protected]> >>>>> >>>>> --- >>>>> changelog: >>>>> v3->v4: >>>>> - no change >>>>> >>>>> v1->v2: >>>>> - addressed comments from Stefan >>>>> - redrafted the requirements to use rearm term and avoid queue enable >>>>> confusion >>>>> v0->v1: >>>>> - updated the description >>>>> --- >>>>> net-workstream/features-1.4.md | 11 +++++++++++ >>>>> 1 file changed, 11 insertions(+) >>>>> >>>>> diff --git a/net-workstream/features-1.4.md >>>>> b/net-workstream/features-1.4.md index 72d04bd..cb72442 100644 >>>>> --- a/net-workstream/features-1.4.md >>>>> +++ b/net-workstream/features-1.4.md >>>>> @@ -8,6 +8,7 @@ together is desired while updating the virtio net >> interface. >>>>> # 2. Summary >>>>> 1. Device counters visible to the driver >>>>> 2. Low latency tx and rx virtqueues for PCI transport >>>>> +3. Virtqueue notification coalescing re-arming support >>>>> >>>>> # 3. Requirements >>>>> ## 3.1 Device counters >>>>> @@ -172,3 +173,13 @@ struct vnet_rx_completion { >>>>> which can be recycled by the driver when the packets from the >> completed >>>>> page is fully consumed. >>>>> 8. The device should be able to consume multiple pages for a >>>>> receive GSO >>>> stream. >>>>> + >>>>> +## 3.3 Virtqueue notification coalescing re-arming support 0. >>>>> +Design >>>>> +goal: >>>>> + a. Avoid constant notifications from the device even in conditions when >>>>> + the driver may not have acted on the previous pending notification. >>>>> +1. When Tx and Rx virtqueue notification coalescing is enabled, and >>>>> +when >>>> such >>>>> + a notification is reported by the device, the device stops sending further >>>>> + notifications until the driver rearms the notifications of the virtqueue. >>>>> +2. When the driver rearms the notification of the virtqueue, the device >>>>> + to notify again if notification coalescing conditions are met. >>>> I'm wondering how this relates to the existing notification >>>> coalesing[1] and notification suppression[2]: >>>> >>>> [1] >>>> The device sends a used buffer notification once the notification >>>> conditions are met and if the notifications are not suppressed as >>>> explained in \ref{sec:Basic Facilities of a Virtio Device / >>>> Virtqueues / Used Buffer Notification Supppression}. >>>> >>>> [2] >>>> If the VIRTIO_F_EVENT_IDX feature bit is not negotiated: >>>> \begin{itemize} >>>> \item The driver MUST ignore the \field{avail_event} value. >>>> \item After the driver writes a descriptor index into the available ring: >>>>    \begin{itemize} >>>>          \item If \field{flags} is 1, the driver SHOULD NOT send a notification. >>>>          \item If \field{flags} is 0, the driver MUST send a notification. >>>>    \end{itemize} >>>> \end{itemize} >>>> >>>> Otherwise, if the VIRTIO_F_EVENT_IDX feature bit is negotiated: >>>> \begin{itemize} >>>> \item The driver MUST ignore the lower bit of \field{flags}. >>>> \item After the driver writes a descriptor index into the available ring: >>>>    \begin{itemize} >>>>          \item If the \field{idx} field in the available ring (which determined >>>>            where that descriptor index was placed) was equal to >>>>            \field{avail_event}, the driver MUST send a notification. >>>>          \item Otherwise the driver SHOULD NOT send a notification. >>>>    \end{itemize} >>>> \end{itemize} >>>> >>>> Regarding notification suppression: >>>> 1.When there is VIRTIO_NET_F_EVENT_IDX, even if the notification >>>> coalesing condition is met, we need to wait for the used_event >>>> notification condition to be met(the driver does not rearms the >>>> notification of the virtqueue now and the avail ring  is set >> VRING_AVAIL_F_NO_INTERRUPT in flag). >>>> 2.When there is no VIRTIO_NET_F_EVENT_IDX, if the driver turns off >>>> the notification, even if the notidication condition is met, the >>>> device cannot send the notification. >>>> >>>> Therefore, if I'm not wrong, a device can issue a notification only >>>> if the device is not suppressed from notifying the driver. >>>> [1][2] seems to have met this condition. >>> Notification suppression using _EVENT_IDX for non-memory transport is just >> sub-optimal for two reasons. >>> 1. It requires device to poll on the used event to learn about when to >>> un-suppress. (arm) 2. this bit also controls driver notifications yet >>> again demand device to arbitrarily poll on new descriptors posting >>> >>> Hence, an efficient scheme is needed and device notifications to be detached >> from driver notification. >>> And now that VQ level notification coalescing is in place, which suppresses >> the device notifications, it is logical to combine it with VQ device notifications. >> Let me summarize: >> 1. When used idx notification is satisfied, but coalescing is not satisfied, the >> driver continues to suppress device notifications. > Ack. > >> 2. When used idx notification is not satisfied, even if coalescing is satisfied, the >> device still cannot notify the driver. > Ack. > >> I think that's what coalescing does, and the description below has satisfied this >> behavior: >> "The device sends a used buffer notification once the notification conditions >> are met and if the notifications are not suppressed as explained in \ref{sec:Basic >> Facilities of a Virtio Device / Virtqueues / Used Buffer Notification >> Supppression}." >> > Ack. > the proposal here is to not use EVENT_IDX scheme, instead driver to enable/disable notification coalescing in different way, even when notification coalescing parameters are configured. > And this to be done in fairly fast way (not like a cvq) command. For example like driver notifications. > >> Or we want to say that it has nothing to do with the used idx notification. > When >> the coalescing is satisfied and the driver rearms the notification of the >> virtqueue, the device now send a notification. >> > Right. > F_NOTIFION_ARM is mutually exclusive with F_EVENT_IDX. OK, I think I get your point, F_NOTIFION_ARM is mutually exclusive with VIRTQ_AVAIL_F_NO_INTERRUPT\used idx\VIRTIO_F_NOTIFY_ON_EMPT, and it seems that F_NOTIFION_ARM has the highest priority, and it needs a new feature bit. Am I right :)? Thanks! > (Like packed vq is mutually exclusive with split q.)

[Date Prev]  |  [Thread Prev]  |  [Thread Next]  |  [Date Next]   —  [Date Index]  |  [Thread Index]  |  [Month Index]  |  [List Home]