All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] virtio-net: Ignore num_buffers when unused
@ 2024-12-26  5:37 Akihiko Odaki
  2024-12-26  7:29 ` Michael S. Tsirkin
  0 siblings, 1 reply; 8+ messages in thread
From: Akihiko Odaki @ 2024-12-26  5:37 UTC (permalink / raw)
  To: virtio-comment
  Cc: Michael S. Tsirkin, Jason Wang, Parav Pandit, devel,
	Akihiko Odaki

If VIRTIO_NET_F_MRG_RXBUF has not been negotuated, vhost_net and QEMU
sets num_buffers to zero while the specification tells to set it to one.

Let drivers ignore the field to make them compatible with both
vhost_net/QEMU and devices already compliant with the specification.
Also, remove statements requiring devices to set the field to one to
make vhost_net and QEMU compliant.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
 device-types/net/description.tex | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/device-types/net/description.tex b/device-types/net/description.tex
index 76585b0..b82fe8f 100644
--- a/device-types/net/description.tex
+++ b/device-types/net/description.tex
@@ -683,15 +683,12 @@ \subsubsection{Setting Up Receive Buffers}\label{sec:Device Types / Network Devi
 
 \devicenormative{\paragraph}{Setting Up Receive Buffers}{Device Types / Network Device / Device Operation / Setting Up Receive Buffers}
 
-The device MUST set \field{num_buffers} to the number of descriptors used to
-hold the incoming packet.
+If VIRTIO_NET_F_MRG_RXBUF was negotiated, the device MUST set
+\field{num_buffers} to the number of descriptors used to hold the incoming
+packet.
 
 The device MUST use only a single descriptor if VIRTIO_NET_F_MRG_RXBUF
 was not negotiated.
-\begin{note}
-{This means that \field{num_buffers} will always be 1
-if VIRTIO_NET_F_MRG_RXBUF is not negotiated.}
-\end{note}
 
 \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network Device / Device Operation / Processing of Incoming Packets}
 \label{sec:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
@@ -704,9 +701,8 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
 Processing incoming packets involves:
 
 \begin{enumerate}
-\item \field{num_buffers} indicates how many descriptors
-  this packet is spread over (including this one): this will
-  always be 1 if VIRTIO_NET_F_MRG_RXBUF was not negotiated.
+\item If VIRTIO_NET_F_MRG_RXBUF was negogiated, \field{num_buffers} indicates
+  how many descriptors this packet is spread over (including this one).
   This allows receipt of large packets without having to allocate large
   buffers: a packet that does not fit in a single buffer can flow
   over to the next buffer, and so on. In this case, there will be
@@ -717,9 +713,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
   The other buffers will not begin with a struct virtio_net_hdr.
 
 \item If
-  \field{num_buffers} is one, then the entire packet will be
-  contained within this buffer, immediately following the struct
-  virtio_net_hdr.
+  VIRTIO_NET_F_MRG_RXBUF was not negotiated or \field{num_buffers} is one, then
+  the entire packet will be contained within this buffer, immediately following
+  the struct virtio_net_hdr.
 \item If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
   VIRTIO_NET_HDR_F_DATA_VALID bit in \field{flags} can be
   set: if so, device has validated the packet checksum.
@@ -764,9 +760,6 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
 \devicenormative{\paragraph}{Processing of Incoming Packets}{Device Types / Network Device / Device Operation / Processing of Incoming Packets}
 \label{devicenormative:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
 
-If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the device MUST set
-\field{num_buffers} to 1.
-
 If VIRTIO_NET_F_MRG_RXBUF has been negotiated, the device MUST set
 \field{num_buffers} to indicate the number of buffers
 the packet (including the header) is spread over.
@@ -863,6 +856,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
 This is due to various bugs in implementations.
 \end{note}
 
+If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST ignore
+\field{num_buffers}.
+
 If neither VIRTIO_NET_HDR_F_NEEDS_CSUM nor
 VIRTIO_NET_HDR_F_DATA_VALID is set, the driver MUST NOT
 rely on the packet checksum being correct.

---
base-commit: b495841a8e80d12c1130f8868f4128866291142d
change-id: 20241226-reserved-d5960f173223

Best regards,
-- 
Akihiko Odaki <akihiko.odaki@daynix.com>


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] virtio-net: Ignore num_buffers when unused
  2024-12-26  5:37 [PATCH] virtio-net: Ignore num_buffers when unused Akihiko Odaki
@ 2024-12-26  7:29 ` Michael S. Tsirkin
  2024-12-26  7:32   ` Michael S. Tsirkin
  0 siblings, 1 reply; 8+ messages in thread
From: Michael S. Tsirkin @ 2024-12-26  7:29 UTC (permalink / raw)
  To: Akihiko Odaki; +Cc: virtio-comment, Jason Wang, Parav Pandit, devel

On Thu, Dec 26, 2024 at 02:37:17PM +0900, Akihiko Odaki wrote:
> If VIRTIO_NET_F_MRG_RXBUF has not been negotuated, vhost_net and QEMU
> sets num_buffers to zero while the specification tells to set it to one.
> 
> Let drivers ignore the field to make them compatible with both
> vhost_net/QEMU and devices already compliant with the specification.
> Also, remove statements requiring devices to set the field to one to
> make vhost_net and QEMU compliant.
> 
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> ---
>  device-types/net/description.tex | 26 +++++++++++---------------
>  1 file changed, 11 insertions(+), 15 deletions(-)
> 
> diff --git a/device-types/net/description.tex b/device-types/net/description.tex
> index 76585b0..b82fe8f 100644
> --- a/device-types/net/description.tex
> +++ b/device-types/net/description.tex
> @@ -683,15 +683,12 @@ \subsubsection{Setting Up Receive Buffers}\label{sec:Device Types / Network Devi
>  
>  \devicenormative{\paragraph}{Setting Up Receive Buffers}{Device Types / Network Device / Device Operation / Setting Up Receive Buffers}
>  
> -The device MUST set \field{num_buffers} to the number of descriptors used to
> -hold the incoming packet.
> +If VIRTIO_NET_F_MRG_RXBUF was negotiated, the device MUST set
> +\field{num_buffers} to the number of descriptors used to hold the incoming
> +packet.
>  
>  The device MUST use only a single descriptor if VIRTIO_NET_F_MRG_RXBUF
>  was not negotiated.
> -\begin{note}
> -{This means that \field{num_buffers} will always be 1
> -if VIRTIO_NET_F_MRG_RXBUF is not negotiated.}
> -\end{note}
>  
>  \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network Device / Device Operation / Processing of Incoming Packets}
>  \label{sec:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
> @@ -704,9 +701,8 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>  Processing incoming packets involves:
>  
>  \begin{enumerate}
> -\item \field{num_buffers} indicates how many descriptors
> -  this packet is spread over (including this one): this will
> -  always be 1 if VIRTIO_NET_F_MRG_RXBUF was not negotiated.
> +\item If VIRTIO_NET_F_MRG_RXBUF was negogiated, \field{num_buffers} indicates
> +  how many descriptors this packet is spread over (including this one).
>    This allows receipt of large packets without having to allocate large
>    buffers: a packet that does not fit in a single buffer can flow
>    over to the next buffer, and so on. In this case, there will be
> @@ -717,9 +713,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>    The other buffers will not begin with a struct virtio_net_hdr.
>  
>  \item If
> -  \field{num_buffers} is one, then the entire packet will be
> -  contained within this buffer, immediately following the struct
> -  virtio_net_hdr.
> +  VIRTIO_NET_F_MRG_RXBUF was not negotiated or \field{num_buffers} is one, then
> +  the entire packet will be contained within this buffer, immediately following
> +  the struct virtio_net_hdr.
>  \item If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
>    VIRTIO_NET_HDR_F_DATA_VALID bit in \field{flags} can be
>    set: if so, device has validated the packet checksum.
> @@ -764,9 +760,6 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>  \devicenormative{\paragraph}{Processing of Incoming Packets}{Device Types / Network Device / Device Operation / Processing of Incoming Packets}
>  \label{devicenormative:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
>  
> -If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the device MUST set
> -\field{num_buffers} to 1.
> -
>  If VIRTIO_NET_F_MRG_RXBUF has been negotiated, the device MUST set
>  \field{num_buffers} to indicate the number of buffers
>  the packet (including the header) is spread over.
> @@ -863,6 +856,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>  This is due to various bugs in implementations.
>  \end{note}
>  
> +If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST ignore
> +\field{num_buffers}.
> +
>  If neither VIRTIO_NET_HDR_F_NEEDS_CSUM nor
>  VIRTIO_NET_HDR_F_DATA_VALID is set, the driver MUST NOT
>  rely on the packet checksum being correct.


There could be drivers relying on it.
We can add a SHOULD not and ask drivers not to look at it,
and we should fix devices.


> ---
> base-commit: b495841a8e80d12c1130f8868f4128866291142d
> change-id: 20241226-reserved-d5960f173223
> 
> Best regards,
> -- 
> Akihiko Odaki <akihiko.odaki@daynix.com>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] virtio-net: Ignore num_buffers when unused
  2024-12-26  7:29 ` Michael S. Tsirkin
@ 2024-12-26  7:32   ` Michael S. Tsirkin
  2024-12-26  7:35     ` Akihiko Odaki
  0 siblings, 1 reply; 8+ messages in thread
From: Michael S. Tsirkin @ 2024-12-26  7:32 UTC (permalink / raw)
  To: Akihiko Odaki; +Cc: virtio-comment, Jason Wang, Parav Pandit, devel

On Thu, Dec 26, 2024 at 02:29:09AM -0500, Michael S. Tsirkin wrote:
> On Thu, Dec 26, 2024 at 02:37:17PM +0900, Akihiko Odaki wrote:
> > If VIRTIO_NET_F_MRG_RXBUF has not been negotuated, vhost_net and QEMU
> > sets num_buffers to zero while the specification tells to set it to one.
> > 
> > Let drivers ignore the field to make them compatible with both
> > vhost_net/QEMU and devices already compliant with the specification.
> > Also, remove statements requiring devices to set the field to one to
> > make vhost_net and QEMU compliant.
> > 
> > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> > ---
> >  device-types/net/description.tex | 26 +++++++++++---------------
> >  1 file changed, 11 insertions(+), 15 deletions(-)
> > 
> > diff --git a/device-types/net/description.tex b/device-types/net/description.tex
> > index 76585b0..b82fe8f 100644
> > --- a/device-types/net/description.tex
> > +++ b/device-types/net/description.tex
> > @@ -683,15 +683,12 @@ \subsubsection{Setting Up Receive Buffers}\label{sec:Device Types / Network Devi
> >  
> >  \devicenormative{\paragraph}{Setting Up Receive Buffers}{Device Types / Network Device / Device Operation / Setting Up Receive Buffers}
> >  
> > -The device MUST set \field{num_buffers} to the number of descriptors used to
> > -hold the incoming packet.
> > +If VIRTIO_NET_F_MRG_RXBUF was negotiated, the device MUST set
> > +\field{num_buffers} to the number of descriptors used to hold the incoming
> > +packet.
> >  
> >  The device MUST use only a single descriptor if VIRTIO_NET_F_MRG_RXBUF
> >  was not negotiated.
> > -\begin{note}
> > -{This means that \field{num_buffers} will always be 1
> > -if VIRTIO_NET_F_MRG_RXBUF is not negotiated.}
> > -\end{note}
> >  
> >  \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network Device / Device Operation / Processing of Incoming Packets}
> >  \label{sec:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
> > @@ -704,9 +701,8 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> >  Processing incoming packets involves:
> >  
> >  \begin{enumerate}
> > -\item \field{num_buffers} indicates how many descriptors
> > -  this packet is spread over (including this one): this will
> > -  always be 1 if VIRTIO_NET_F_MRG_RXBUF was not negotiated.
> > +\item If VIRTIO_NET_F_MRG_RXBUF was negogiated, \field{num_buffers} indicates
> > +  how many descriptors this packet is spread over (including this one).
> >    This allows receipt of large packets without having to allocate large
> >    buffers: a packet that does not fit in a single buffer can flow
> >    over to the next buffer, and so on. In this case, there will be
> > @@ -717,9 +713,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> >    The other buffers will not begin with a struct virtio_net_hdr.
> >  
> >  \item If
> > -  \field{num_buffers} is one, then the entire packet will be
> > -  contained within this buffer, immediately following the struct
> > -  virtio_net_hdr.
> > +  VIRTIO_NET_F_MRG_RXBUF was not negotiated or \field{num_buffers} is one, then
> > +  the entire packet will be contained within this buffer, immediately following
> > +  the struct virtio_net_hdr.
> >  \item If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
> >    VIRTIO_NET_HDR_F_DATA_VALID bit in \field{flags} can be
> >    set: if so, device has validated the packet checksum.
> > @@ -764,9 +760,6 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> >  \devicenormative{\paragraph}{Processing of Incoming Packets}{Device Types / Network Device / Device Operation / Processing of Incoming Packets}
> >  \label{devicenormative:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
> >  
> > -If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the device MUST set
> > -\field{num_buffers} to 1.
> > -
> >  If VIRTIO_NET_F_MRG_RXBUF has been negotiated, the device MUST set
> >  \field{num_buffers} to indicate the number of buffers
> >  the packet (including the header) is spread over.
> > @@ -863,6 +856,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> >  This is due to various bugs in implementations.
> >  \end{note}
> >  
> > +If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST ignore
> > +\field{num_buffers}.
> > +
> >  If neither VIRTIO_NET_HDR_F_NEEDS_CSUM nor
> >  VIRTIO_NET_HDR_F_DATA_VALID is set, the driver MUST NOT
> >  rely on the packet checksum being correct.
> 
> 
> There could be drivers relying on it.
> We can add a SHOULD not and ask drivers not to look at it,
> and we should fix devices.

Maybe allowing 0 too is a good idea? Need to think through
implemenation concerns.
In any case, pls fix devices.


> 
> > ---
> > base-commit: b495841a8e80d12c1130f8868f4128866291142d
> > change-id: 20241226-reserved-d5960f173223
> > 
> > Best regards,
> > -- 
> > Akihiko Odaki <akihiko.odaki@daynix.com>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] virtio-net: Ignore num_buffers when unused
  2024-12-26  7:32   ` Michael S. Tsirkin
@ 2024-12-26  7:35     ` Akihiko Odaki
  2024-12-26  9:13       ` Michael S. Tsirkin
  0 siblings, 1 reply; 8+ messages in thread
From: Akihiko Odaki @ 2024-12-26  7:35 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: virtio-comment, Jason Wang, Parav Pandit, devel

On 2024/12/26 16:32, Michael S. Tsirkin wrote:
> On Thu, Dec 26, 2024 at 02:29:09AM -0500, Michael S. Tsirkin wrote:
>> On Thu, Dec 26, 2024 at 02:37:17PM +0900, Akihiko Odaki wrote:
>>> If VIRTIO_NET_F_MRG_RXBUF has not been negotuated, vhost_net and QEMU
>>> sets num_buffers to zero while the specification tells to set it to one.
>>>
>>> Let drivers ignore the field to make them compatible with both
>>> vhost_net/QEMU and devices already compliant with the specification.
>>> Also, remove statements requiring devices to set the field to one to
>>> make vhost_net and QEMU compliant.
>>>
>>> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
>>> ---
>>>   device-types/net/description.tex | 26 +++++++++++---------------
>>>   1 file changed, 11 insertions(+), 15 deletions(-)
>>>
>>> diff --git a/device-types/net/description.tex b/device-types/net/description.tex
>>> index 76585b0..b82fe8f 100644
>>> --- a/device-types/net/description.tex
>>> +++ b/device-types/net/description.tex
>>> @@ -683,15 +683,12 @@ \subsubsection{Setting Up Receive Buffers}\label{sec:Device Types / Network Devi
>>>   
>>>   \devicenormative{\paragraph}{Setting Up Receive Buffers}{Device Types / Network Device / Device Operation / Setting Up Receive Buffers}
>>>   
>>> -The device MUST set \field{num_buffers} to the number of descriptors used to
>>> -hold the incoming packet.
>>> +If VIRTIO_NET_F_MRG_RXBUF was negotiated, the device MUST set
>>> +\field{num_buffers} to the number of descriptors used to hold the incoming
>>> +packet.
>>>   
>>>   The device MUST use only a single descriptor if VIRTIO_NET_F_MRG_RXBUF
>>>   was not negotiated.
>>> -\begin{note}
>>> -{This means that \field{num_buffers} will always be 1
>>> -if VIRTIO_NET_F_MRG_RXBUF is not negotiated.}
>>> -\end{note}
>>>   
>>>   \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network Device / Device Operation / Processing of Incoming Packets}
>>>   \label{sec:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
>>> @@ -704,9 +701,8 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>>>   Processing incoming packets involves:
>>>   
>>>   \begin{enumerate}
>>> -\item \field{num_buffers} indicates how many descriptors
>>> -  this packet is spread over (including this one): this will
>>> -  always be 1 if VIRTIO_NET_F_MRG_RXBUF was not negotiated.
>>> +\item If VIRTIO_NET_F_MRG_RXBUF was negogiated, \field{num_buffers} indicates
>>> +  how many descriptors this packet is spread over (including this one).
>>>     This allows receipt of large packets without having to allocate large
>>>     buffers: a packet that does not fit in a single buffer can flow
>>>     over to the next buffer, and so on. In this case, there will be
>>> @@ -717,9 +713,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>>>     The other buffers will not begin with a struct virtio_net_hdr.
>>>   
>>>   \item If
>>> -  \field{num_buffers} is one, then the entire packet will be
>>> -  contained within this buffer, immediately following the struct
>>> -  virtio_net_hdr.
>>> +  VIRTIO_NET_F_MRG_RXBUF was not negotiated or \field{num_buffers} is one, then
>>> +  the entire packet will be contained within this buffer, immediately following
>>> +  the struct virtio_net_hdr.
>>>   \item If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
>>>     VIRTIO_NET_HDR_F_DATA_VALID bit in \field{flags} can be
>>>     set: if so, device has validated the packet checksum.
>>> @@ -764,9 +760,6 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>>>   \devicenormative{\paragraph}{Processing of Incoming Packets}{Device Types / Network Device / Device Operation / Processing of Incoming Packets}
>>>   \label{devicenormative:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
>>>   
>>> -If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the device MUST set
>>> -\field{num_buffers} to 1.
>>> -
>>>   If VIRTIO_NET_F_MRG_RXBUF has been negotiated, the device MUST set
>>>   \field{num_buffers} to indicate the number of buffers
>>>   the packet (including the header) is spread over.
>>> @@ -863,6 +856,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>>>   This is due to various bugs in implementations.
>>>   \end{note}
>>>   
>>> +If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST ignore
>>> +\field{num_buffers}.
>>> +
>>>   If neither VIRTIO_NET_HDR_F_NEEDS_CSUM nor
>>>   VIRTIO_NET_HDR_F_DATA_VALID is set, the driver MUST NOT
>>>   rely on the packet checksum being correct.
>>
>>
>> There could be drivers relying on it.
>> We can add a SHOULD not and ask drivers not to look at it,

The patch adds the following statement:
> If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST
> ignore \field{num_buffers}.

Do you suggest changing MUST to SHOULD or rephrase other words in this 
statement?

>> and we should fix devices.
> 
> Maybe allowing 0 too is a good idea? Need to think through
> implemenation concerns.
> In any case, pls fix devices.

I opted allowing any values for devices based on the discussion in the 
following thread:
https://lore.kernel.org/virtio-comment/CY8PR12MB7195E5A1D321CABBA97D3FD7DC0D2@CY8PR12MB7195.namprd12.prod.outlook.com/T/#m5789536fe7405a7be18e167ff522c27333656fe9

Regards,
Akihiko Odaki

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] virtio-net: Ignore num_buffers when unused
  2024-12-26  7:35     ` Akihiko Odaki
@ 2024-12-26  9:13       ` Michael S. Tsirkin
  2024-12-26 11:09         ` Akihiko Odaki
  0 siblings, 1 reply; 8+ messages in thread
From: Michael S. Tsirkin @ 2024-12-26  9:13 UTC (permalink / raw)
  To: Akihiko Odaki; +Cc: virtio-comment, Jason Wang, Parav Pandit, devel

On Thu, Dec 26, 2024 at 04:35:55PM +0900, Akihiko Odaki wrote:
> On 2024/12/26 16:32, Michael S. Tsirkin wrote:
> > On Thu, Dec 26, 2024 at 02:29:09AM -0500, Michael S. Tsirkin wrote:
> > > On Thu, Dec 26, 2024 at 02:37:17PM +0900, Akihiko Odaki wrote:
> > > > If VIRTIO_NET_F_MRG_RXBUF has not been negotuated, vhost_net and QEMU
> > > > sets num_buffers to zero while the specification tells to set it to one.
> > > > 
> > > > Let drivers ignore the field to make them compatible with both
> > > > vhost_net/QEMU and devices already compliant with the specification.
> > > > Also, remove statements requiring devices to set the field to one to
> > > > make vhost_net and QEMU compliant.
> > > > 
> > > > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> > > > ---
> > > >   device-types/net/description.tex | 26 +++++++++++---------------
> > > >   1 file changed, 11 insertions(+), 15 deletions(-)
> > > > 
> > > > diff --git a/device-types/net/description.tex b/device-types/net/description.tex
> > > > index 76585b0..b82fe8f 100644
> > > > --- a/device-types/net/description.tex
> > > > +++ b/device-types/net/description.tex
> > > > @@ -683,15 +683,12 @@ \subsubsection{Setting Up Receive Buffers}\label{sec:Device Types / Network Devi
> > > >   \devicenormative{\paragraph}{Setting Up Receive Buffers}{Device Types / Network Device / Device Operation / Setting Up Receive Buffers}
> > > > -The device MUST set \field{num_buffers} to the number of descriptors used to
> > > > -hold the incoming packet.
> > > > +If VIRTIO_NET_F_MRG_RXBUF was negotiated, the device MUST set
> > > > +\field{num_buffers} to the number of descriptors used to hold the incoming
> > > > +packet.
> > > >   The device MUST use only a single descriptor if VIRTIO_NET_F_MRG_RXBUF
> > > >   was not negotiated.
> > > > -\begin{note}
> > > > -{This means that \field{num_buffers} will always be 1
> > > > -if VIRTIO_NET_F_MRG_RXBUF is not negotiated.}
> > > > -\end{note}
> > > >   \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network Device / Device Operation / Processing of Incoming Packets}
> > > >   \label{sec:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
> > > > @@ -704,9 +701,8 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> > > >   Processing incoming packets involves:
> > > >   \begin{enumerate}
> > > > -\item \field{num_buffers} indicates how many descriptors
> > > > -  this packet is spread over (including this one): this will
> > > > -  always be 1 if VIRTIO_NET_F_MRG_RXBUF was not negotiated.
> > > > +\item If VIRTIO_NET_F_MRG_RXBUF was negogiated, \field{num_buffers} indicates
> > > > +  how many descriptors this packet is spread over (including this one).
> > > >     This allows receipt of large packets without having to allocate large
> > > >     buffers: a packet that does not fit in a single buffer can flow
> > > >     over to the next buffer, and so on. In this case, there will be
> > > > @@ -717,9 +713,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> > > >     The other buffers will not begin with a struct virtio_net_hdr.
> > > >   \item If
> > > > -  \field{num_buffers} is one, then the entire packet will be
> > > > -  contained within this buffer, immediately following the struct
> > > > -  virtio_net_hdr.
> > > > +  VIRTIO_NET_F_MRG_RXBUF was not negotiated or \field{num_buffers} is one, then
> > > > +  the entire packet will be contained within this buffer, immediately following
> > > > +  the struct virtio_net_hdr.
> > > >   \item If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
> > > >     VIRTIO_NET_HDR_F_DATA_VALID bit in \field{flags} can be
> > > >     set: if so, device has validated the packet checksum.
> > > > @@ -764,9 +760,6 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> > > >   \devicenormative{\paragraph}{Processing of Incoming Packets}{Device Types / Network Device / Device Operation / Processing of Incoming Packets}
> > > >   \label{devicenormative:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
> > > > -If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the device MUST set
> > > > -\field{num_buffers} to 1.
> > > > -
> > > >   If VIRTIO_NET_F_MRG_RXBUF has been negotiated, the device MUST set
> > > >   \field{num_buffers} to indicate the number of buffers
> > > >   the packet (including the header) is spread over.
> > > > @@ -863,6 +856,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> > > >   This is due to various bugs in implementations.
> > > >   \end{note}
> > > > +If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST ignore
> > > > +\field{num_buffers}.
> > > > +
> > > >   If neither VIRTIO_NET_HDR_F_NEEDS_CSUM nor
> > > >   VIRTIO_NET_HDR_F_DATA_VALID is set, the driver MUST NOT
> > > >   rely on the packet checksum being correct.
> > > 
> > > 
> > > There could be drivers relying on it.
> > > We can add a SHOULD not and ask drivers not to look at it,
> 
> The patch adds the following statement:
> > If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST
> > ignore \field{num_buffers}.
> 
> Do you suggest changing MUST to SHOULD or rephrase other words in this
> statement?

Yes, I would change MUST to SHOULD. Basically documenting the existing
practice.

But I do not yes see why we should drop the device requirements the way you suggest.
We just need to fix devices, it does not seem hard.

> > > and we should fix devices.
> > 
> > Maybe allowing 0 too is a good idea? Need to think through
> > implemenation concerns.
> > In any case, pls fix devices.
> 
> I opted allowing any values for devices based on the discussion in the
> following thread:
> https://lore.kernel.org/virtio-comment/CY8PR12MB7195E5A1D321CABBA97D3FD7DC0D2@CY8PR12MB7195.namprd12.prod.outlook.com/T/#m5789536fe7405a7be18e167ff522c27333656fe9
> 
> Regards,
> Akihiko Odaki

That one asks for concrete data.

-- 
MST


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] virtio-net: Ignore num_buffers when unused
  2024-12-26  9:13       ` Michael S. Tsirkin
@ 2024-12-26 11:09         ` Akihiko Odaki
  2024-12-26 11:55           ` Michael S. Tsirkin
  0 siblings, 1 reply; 8+ messages in thread
From: Akihiko Odaki @ 2024-12-26 11:09 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: virtio-comment, Jason Wang, Parav Pandit, devel

On 2024/12/26 18:13, Michael S. Tsirkin wrote:
> On Thu, Dec 26, 2024 at 04:35:55PM +0900, Akihiko Odaki wrote:
>> On 2024/12/26 16:32, Michael S. Tsirkin wrote:
>>> On Thu, Dec 26, 2024 at 02:29:09AM -0500, Michael S. Tsirkin wrote:
>>>> On Thu, Dec 26, 2024 at 02:37:17PM +0900, Akihiko Odaki wrote:
>>>>> If VIRTIO_NET_F_MRG_RXBUF has not been negotuated, vhost_net and QEMU
>>>>> sets num_buffers to zero while the specification tells to set it to one.
>>>>>
>>>>> Let drivers ignore the field to make them compatible with both
>>>>> vhost_net/QEMU and devices already compliant with the specification.
>>>>> Also, remove statements requiring devices to set the field to one to
>>>>> make vhost_net and QEMU compliant.
>>>>>
>>>>> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
>>>>> ---
>>>>>    device-types/net/description.tex | 26 +++++++++++---------------
>>>>>    1 file changed, 11 insertions(+), 15 deletions(-)
>>>>>
>>>>> diff --git a/device-types/net/description.tex b/device-types/net/description.tex
>>>>> index 76585b0..b82fe8f 100644
>>>>> --- a/device-types/net/description.tex
>>>>> +++ b/device-types/net/description.tex
>>>>> @@ -683,15 +683,12 @@ \subsubsection{Setting Up Receive Buffers}\label{sec:Device Types / Network Devi
>>>>>    \devicenormative{\paragraph}{Setting Up Receive Buffers}{Device Types / Network Device / Device Operation / Setting Up Receive Buffers}
>>>>> -The device MUST set \field{num_buffers} to the number of descriptors used to
>>>>> -hold the incoming packet.
>>>>> +If VIRTIO_NET_F_MRG_RXBUF was negotiated, the device MUST set
>>>>> +\field{num_buffers} to the number of descriptors used to hold the incoming
>>>>> +packet.
>>>>>    The device MUST use only a single descriptor if VIRTIO_NET_F_MRG_RXBUF
>>>>>    was not negotiated.
>>>>> -\begin{note}
>>>>> -{This means that \field{num_buffers} will always be 1
>>>>> -if VIRTIO_NET_F_MRG_RXBUF is not negotiated.}
>>>>> -\end{note}
>>>>>    \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network Device / Device Operation / Processing of Incoming Packets}
>>>>>    \label{sec:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
>>>>> @@ -704,9 +701,8 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>>>>>    Processing incoming packets involves:
>>>>>    \begin{enumerate}
>>>>> -\item \field{num_buffers} indicates how many descriptors
>>>>> -  this packet is spread over (including this one): this will
>>>>> -  always be 1 if VIRTIO_NET_F_MRG_RXBUF was not negotiated.
>>>>> +\item If VIRTIO_NET_F_MRG_RXBUF was negogiated, \field{num_buffers} indicates
>>>>> +  how many descriptors this packet is spread over (including this one).
>>>>>      This allows receipt of large packets without having to allocate large
>>>>>      buffers: a packet that does not fit in a single buffer can flow
>>>>>      over to the next buffer, and so on. In this case, there will be
>>>>> @@ -717,9 +713,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>>>>>      The other buffers will not begin with a struct virtio_net_hdr.
>>>>>    \item If
>>>>> -  \field{num_buffers} is one, then the entire packet will be
>>>>> -  contained within this buffer, immediately following the struct
>>>>> -  virtio_net_hdr.
>>>>> +  VIRTIO_NET_F_MRG_RXBUF was not negotiated or \field{num_buffers} is one, then
>>>>> +  the entire packet will be contained within this buffer, immediately following
>>>>> +  the struct virtio_net_hdr.
>>>>>    \item If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
>>>>>      VIRTIO_NET_HDR_F_DATA_VALID bit in \field{flags} can be
>>>>>      set: if so, device has validated the packet checksum.
>>>>> @@ -764,9 +760,6 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>>>>>    \devicenormative{\paragraph}{Processing of Incoming Packets}{Device Types / Network Device / Device Operation / Processing of Incoming Packets}
>>>>>    \label{devicenormative:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
>>>>> -If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the device MUST set
>>>>> -\field{num_buffers} to 1.
>>>>> -
>>>>>    If VIRTIO_NET_F_MRG_RXBUF has been negotiated, the device MUST set
>>>>>    \field{num_buffers} to indicate the number of buffers
>>>>>    the packet (including the header) is spread over.
>>>>> @@ -863,6 +856,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
>>>>>    This is due to various bugs in implementations.
>>>>>    \end{note}
>>>>> +If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST ignore
>>>>> +\field{num_buffers}.
>>>>> +
>>>>>    If neither VIRTIO_NET_HDR_F_NEEDS_CSUM nor
>>>>>    VIRTIO_NET_HDR_F_DATA_VALID is set, the driver MUST NOT
>>>>>    rely on the packet checksum being correct.
>>>>
>>>>
>>>> There could be drivers relying on it.
>>>> We can add a SHOULD not and ask drivers not to look at it,
>>
>> The patch adds the following statement:
>>> If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST
>>> ignore \field{num_buffers}.
>>
>> Do you suggest changing MUST to SHOULD or rephrase other words in this
>> statement?
> 
> Yes, I would change MUST to SHOULD. Basically documenting the existing
> practice.
> 
> But I do not yes see why we should drop the device requirements the way you suggest.
> We just need to fix devices, it does not seem hard.

Well, I think we have already discussed and decided not to change vhost_net:
https://lore.kernel.org/all/CACGkMEt0spn59oLyoCwcJDdLeYUEibePF7gppxdVX1YvmAr72Q@mail.gmail.com/

> 
>>>> and we should fix devices.
>>>
>>> Maybe allowing 0 too is a good idea? Need to think through
>>> implemenation concerns.
>>> In any case, pls fix devices.
>>
>> I opted allowing any values for devices based on the discussion in the
>> following thread:
>> https://lore.kernel.org/virtio-comment/CY8PR12MB7195E5A1D321CABBA97D3FD7DC0D2@CY8PR12MB7195.namprd12.prod.outlook.com/T/#m5789536fe7405a7be18e167ff522c27333656fe9
>>
>> Regards,
>> Akihiko Odaki
> 
> That one asks for concrete data.

It asks concrete data that motivates requiring setting the value to zero 
and I decided removing such a requirement instead.

Regards,
Akihiko Odaki

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] virtio-net: Ignore num_buffers when unused
  2024-12-26 11:09         ` Akihiko Odaki
@ 2024-12-26 11:55           ` Michael S. Tsirkin
  2024-12-27  1:26             ` Jason Wang
  0 siblings, 1 reply; 8+ messages in thread
From: Michael S. Tsirkin @ 2024-12-26 11:55 UTC (permalink / raw)
  To: Akihiko Odaki; +Cc: virtio-comment, Jason Wang, Parav Pandit, devel

On Thu, Dec 26, 2024 at 08:09:59PM +0900, Akihiko Odaki wrote:
> On 2024/12/26 18:13, Michael S. Tsirkin wrote:
> > On Thu, Dec 26, 2024 at 04:35:55PM +0900, Akihiko Odaki wrote:
> > > On 2024/12/26 16:32, Michael S. Tsirkin wrote:
> > > > On Thu, Dec 26, 2024 at 02:29:09AM -0500, Michael S. Tsirkin wrote:
> > > > > On Thu, Dec 26, 2024 at 02:37:17PM +0900, Akihiko Odaki wrote:
> > > > > > If VIRTIO_NET_F_MRG_RXBUF has not been negotuated, vhost_net and QEMU
> > > > > > sets num_buffers to zero while the specification tells to set it to one.
> > > > > > 
> > > > > > Let drivers ignore the field to make them compatible with both
> > > > > > vhost_net/QEMU and devices already compliant with the specification.
> > > > > > Also, remove statements requiring devices to set the field to one to
> > > > > > make vhost_net and QEMU compliant.
> > > > > > 
> > > > > > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> > > > > > ---
> > > > > >    device-types/net/description.tex | 26 +++++++++++---------------
> > > > > >    1 file changed, 11 insertions(+), 15 deletions(-)
> > > > > > 
> > > > > > diff --git a/device-types/net/description.tex b/device-types/net/description.tex
> > > > > > index 76585b0..b82fe8f 100644
> > > > > > --- a/device-types/net/description.tex
> > > > > > +++ b/device-types/net/description.tex
> > > > > > @@ -683,15 +683,12 @@ \subsubsection{Setting Up Receive Buffers}\label{sec:Device Types / Network Devi
> > > > > >    \devicenormative{\paragraph}{Setting Up Receive Buffers}{Device Types / Network Device / Device Operation / Setting Up Receive Buffers}
> > > > > > -The device MUST set \field{num_buffers} to the number of descriptors used to
> > > > > > -hold the incoming packet.
> > > > > > +If VIRTIO_NET_F_MRG_RXBUF was negotiated, the device MUST set
> > > > > > +\field{num_buffers} to the number of descriptors used to hold the incoming
> > > > > > +packet.
> > > > > >    The device MUST use only a single descriptor if VIRTIO_NET_F_MRG_RXBUF
> > > > > >    was not negotiated.
> > > > > > -\begin{note}
> > > > > > -{This means that \field{num_buffers} will always be 1
> > > > > > -if VIRTIO_NET_F_MRG_RXBUF is not negotiated.}
> > > > > > -\end{note}
> > > > > >    \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network Device / Device Operation / Processing of Incoming Packets}
> > > > > >    \label{sec:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
> > > > > > @@ -704,9 +701,8 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> > > > > >    Processing incoming packets involves:
> > > > > >    \begin{enumerate}
> > > > > > -\item \field{num_buffers} indicates how many descriptors
> > > > > > -  this packet is spread over (including this one): this will
> > > > > > -  always be 1 if VIRTIO_NET_F_MRG_RXBUF was not negotiated.
> > > > > > +\item If VIRTIO_NET_F_MRG_RXBUF was negogiated, \field{num_buffers} indicates
> > > > > > +  how many descriptors this packet is spread over (including this one).
> > > > > >      This allows receipt of large packets without having to allocate large
> > > > > >      buffers: a packet that does not fit in a single buffer can flow
> > > > > >      over to the next buffer, and so on. In this case, there will be
> > > > > > @@ -717,9 +713,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> > > > > >      The other buffers will not begin with a struct virtio_net_hdr.
> > > > > >    \item If
> > > > > > -  \field{num_buffers} is one, then the entire packet will be
> > > > > > -  contained within this buffer, immediately following the struct
> > > > > > -  virtio_net_hdr.
> > > > > > +  VIRTIO_NET_F_MRG_RXBUF was not negotiated or \field{num_buffers} is one, then
> > > > > > +  the entire packet will be contained within this buffer, immediately following
> > > > > > +  the struct virtio_net_hdr.
> > > > > >    \item If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
> > > > > >      VIRTIO_NET_HDR_F_DATA_VALID bit in \field{flags} can be
> > > > > >      set: if so, device has validated the packet checksum.
> > > > > > @@ -764,9 +760,6 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> > > > > >    \devicenormative{\paragraph}{Processing of Incoming Packets}{Device Types / Network Device / Device Operation / Processing of Incoming Packets}
> > > > > >    \label{devicenormative:Device Types / Network Device / Device Operation / Processing of Packets}%old label for latexdiff
> > > > > > -If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the device MUST set
> > > > > > -\field{num_buffers} to 1.
> > > > > > -
> > > > > >    If VIRTIO_NET_F_MRG_RXBUF has been negotiated, the device MUST set
> > > > > >    \field{num_buffers} to indicate the number of buffers
> > > > > >    the packet (including the header) is spread over.
> > > > > > @@ -863,6 +856,9 @@ \subsubsection{Processing of Incoming Packets}\label{sec:Device Types / Network
> > > > > >    This is due to various bugs in implementations.
> > > > > >    \end{note}
> > > > > > +If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST ignore
> > > > > > +\field{num_buffers}.
> > > > > > +
> > > > > >    If neither VIRTIO_NET_HDR_F_NEEDS_CSUM nor
> > > > > >    VIRTIO_NET_HDR_F_DATA_VALID is set, the driver MUST NOT
> > > > > >    rely on the packet checksum being correct.
> > > > > 
> > > > > 
> > > > > There could be drivers relying on it.
> > > > > We can add a SHOULD not and ask drivers not to look at it,
> > > 
> > > The patch adds the following statement:
> > > > If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST
> > > > ignore \field{num_buffers}.
> > > 
> > > Do you suggest changing MUST to SHOULD or rephrase other words in this
> > > statement?
> > 
> > Yes, I would change MUST to SHOULD. Basically documenting the existing
> > practice.
> > 
> > But I do not yes see why we should drop the device requirements the way you suggest.
> > We just need to fix devices, it does not seem hard.
> 
> Well, I think we have already discussed and decided not to change vhost_net:
> https://lore.kernel.org/all/CACGkMEt0spn59oLyoCwcJDdLeYUEibePF7gppxdVX1YvmAr72Q@mail.gmail.com/

Looking at this spec made me realize fixing that is less risky.
I just replied on that thread and proposed a way to reduce risk
even more.
Sorry about leading you astray.

> > 
> > > > > and we should fix devices.
> > > > 
> > > > Maybe allowing 0 too is a good idea? Need to think through
> > > > implemenation concerns.
> > > > In any case, pls fix devices.
> > > 
> > > I opted allowing any values for devices based on the discussion in the
> > > following thread:
> > > https://lore.kernel.org/virtio-comment/CY8PR12MB7195E5A1D321CABBA97D3FD7DC0D2@CY8PR12MB7195.namprd12.prod.outlook.com/T/#m5789536fe7405a7be18e167ff522c27333656fe9
> > > 
> > > Regards,
> > > Akihiko Odaki
> > 
> > That one asks for concrete data.
> 
> It asks concrete data that motivates requiring setting the value to zero and
> I decided removing such a requirement instead.
> 
> Regards,
> Akihiko Odaki

Same thing really.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] virtio-net: Ignore num_buffers when unused
  2024-12-26 11:55           ` Michael S. Tsirkin
@ 2024-12-27  1:26             ` Jason Wang
  0 siblings, 0 replies; 8+ messages in thread
From: Jason Wang @ 2024-12-27  1:26 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Akihiko Odaki, virtio-comment, Parav Pandit, devel

[-- Attachment #1: Type: text/plain, Size: 8019 bytes --]

On Thu, Dec 26, 2024 at 7:56 PM Michael S. Tsirkin <mst@redhat.com> wrote:

> On Thu, Dec 26, 2024 at 08:09:59PM +0900, Akihiko Odaki wrote:
> > On 2024/12/26 18:13, Michael S. Tsirkin wrote:
> > > On Thu, Dec 26, 2024 at 04:35:55PM +0900, Akihiko Odaki wrote:
> > > > On 2024/12/26 16:32, Michael S. Tsirkin wrote:
> > > > > On Thu, Dec 26, 2024 at 02:29:09AM -0500, Michael S. Tsirkin wrote:
> > > > > > On Thu, Dec 26, 2024 at 02:37:17PM +0900, Akihiko Odaki wrote:
> > > > > > > If VIRTIO_NET_F_MRG_RXBUF has not been negotuated, vhost_net
> and QEMU
> > > > > > > sets num_buffers to zero while the specification tells to set
> it to one.
> > > > > > >
> > > > > > > Let drivers ignore the field to make them compatible with both
> > > > > > > vhost_net/QEMU and devices already compliant with the
> specification.
> > > > > > > Also, remove statements requiring devices to set the field to
> one to
> > > > > > > make vhost_net and QEMU compliant.
> > > > > > >
> > > > > > > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> > > > > > > ---
> > > > > > >    device-types/net/description.tex | 26
> +++++++++++---------------
> > > > > > >    1 file changed, 11 insertions(+), 15 deletions(-)
> > > > > > >
> > > > > > > diff --git a/device-types/net/description.tex
> b/device-types/net/description.tex
> > > > > > > index 76585b0..b82fe8f 100644
> > > > > > > --- a/device-types/net/description.tex
> > > > > > > +++ b/device-types/net/description.tex
> > > > > > > @@ -683,15 +683,12 @@ \subsubsection{Setting Up Receive
> Buffers}\label{sec:Device Types / Network Devi
> > > > > > >    \devicenormative{\paragraph}{Setting Up Receive
> Buffers}{Device Types / Network Device / Device Operation / Setting Up
> Receive Buffers}
> > > > > > > -The device MUST set \field{num_buffers} to the number of
> descriptors used to
> > > > > > > -hold the incoming packet.
> > > > > > > +If VIRTIO_NET_F_MRG_RXBUF was negotiated, the device MUST set
> > > > > > > +\field{num_buffers} to the number of descriptors used to hold
> the incoming
> > > > > > > +packet.
> > > > > > >    The device MUST use only a single descriptor if
> VIRTIO_NET_F_MRG_RXBUF
> > > > > > >    was not negotiated.
> > > > > > > -\begin{note}
> > > > > > > -{This means that \field{num_buffers} will always be 1
> > > > > > > -if VIRTIO_NET_F_MRG_RXBUF is not negotiated.}
> > > > > > > -\end{note}
> > > > > > >    \subsubsection{Processing of Incoming
> Packets}\label{sec:Device Types / Network Device / Device Operation /
> Processing of Incoming Packets}
> > > > > > >    \label{sec:Device Types / Network Device / Device Operation
> / Processing of Packets}%old label for latexdiff
> > > > > > > @@ -704,9 +701,8 @@ \subsubsection{Processing of Incoming
> Packets}\label{sec:Device Types / Network
> > > > > > >    Processing incoming packets involves:
> > > > > > >    \begin{enumerate}
> > > > > > > -\item \field{num_buffers} indicates how many descriptors
> > > > > > > -  this packet is spread over (including this one): this will
> > > > > > > -  always be 1 if VIRTIO_NET_F_MRG_RXBUF was not negotiated.
> > > > > > > +\item If VIRTIO_NET_F_MRG_RXBUF was negogiated,
> \field{num_buffers} indicates
> > > > > > > +  how many descriptors this packet is spread over (including
> this one).
> > > > > > >      This allows receipt of large packets without having to
> allocate large
> > > > > > >      buffers: a packet that does not fit in a single buffer
> can flow
> > > > > > >      over to the next buffer, and so on. In this case, there
> will be
> > > > > > > @@ -717,9 +713,9 @@ \subsubsection{Processing of Incoming
> Packets}\label{sec:Device Types / Network
> > > > > > >      The other buffers will not begin with a struct
> virtio_net_hdr.
> > > > > > >    \item If
> > > > > > > -  \field{num_buffers} is one, then the entire packet will be
> > > > > > > -  contained within this buffer, immediately following the
> struct
> > > > > > > -  virtio_net_hdr.
> > > > > > > +  VIRTIO_NET_F_MRG_RXBUF was not negotiated or
> \field{num_buffers} is one, then
> > > > > > > +  the entire packet will be contained within this buffer,
> immediately following
> > > > > > > +  the struct virtio_net_hdr.
> > > > > > >    \item If the VIRTIO_NET_F_GUEST_CSUM feature was
> negotiated, the
> > > > > > >      VIRTIO_NET_HDR_F_DATA_VALID bit in \field{flags} can be
> > > > > > >      set: if so, device has validated the packet checksum.
> > > > > > > @@ -764,9 +760,6 @@ \subsubsection{Processing of Incoming
> Packets}\label{sec:Device Types / Network
> > > > > > >    \devicenormative{\paragraph}{Processing of Incoming
> Packets}{Device Types / Network Device / Device Operation / Processing of
> Incoming Packets}
> > > > > > >    \label{devicenormative:Device Types / Network Device /
> Device Operation / Processing of Packets}%old label for latexdiff
> > > > > > > -If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the device
> MUST set
> > > > > > > -\field{num_buffers} to 1.
> > > > > > > -
> > > > > > >    If VIRTIO_NET_F_MRG_RXBUF has been negotiated, the device
> MUST set
> > > > > > >    \field{num_buffers} to indicate the number of buffers
> > > > > > >    the packet (including the header) is spread over.
> > > > > > > @@ -863,6 +856,9 @@ \subsubsection{Processing of Incoming
> Packets}\label{sec:Device Types / Network
> > > > > > >    This is due to various bugs in implementations.
> > > > > > >    \end{note}
> > > > > > > +If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver
> MUST ignore
> > > > > > > +\field{num_buffers}.
> > > > > > > +
> > > > > > >    If neither VIRTIO_NET_HDR_F_NEEDS_CSUM nor
> > > > > > >    VIRTIO_NET_HDR_F_DATA_VALID is set, the driver MUST NOT
> > > > > > >    rely on the packet checksum being correct.
> > > > > >
> > > > > >
> > > > > > There could be drivers relying on it.
> > > > > > We can add a SHOULD not and ask drivers not to look at it,
> > > >
> > > > The patch adds the following statement:
> > > > > If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the driver MUST
> > > > > ignore \field{num_buffers}.
> > > >
> > > > Do you suggest changing MUST to SHOULD or rephrase other words in
> this
> > > > statement?
> > >
> > > Yes, I would change MUST to SHOULD. Basically documenting the existing
> > > practice.
> > >
> > > But I do not yes see why we should drop the device requirements the
> way you suggest.
> > > We just need to fix devices, it does not seem hard.
> >
> > Well, I think we have already discussed and decided not to change
> vhost_net:
> >
> https://lore.kernel.org/all/CACGkMEt0spn59oLyoCwcJDdLeYUEibePF7gppxdVX1YvmAr72Q@mail.gmail.com/
>
> Looking at this spec made me realize fixing that is less risky.
>

It depends on how to do the relaxing, if we want to align the spec to the
implementation, can we simply remove this:

-If VIRTIO_NET_F_MRG_RXBUF has not been negotiated, the device MUST set
-\field{num_buffers} to 1.

?

Thanks


> I just replied on that thread and proposed a way to reduce risk
> even more.
> Sorry about leading you astray.
>
> > >
> > > > > > and we should fix devices.
> > > > >
> > > > > Maybe allowing 0 too is a good idea? Need to think through
> > > > > implemenation concerns.
> > > > > In any case, pls fix devices.
> > > >
> > > > I opted allowing any values for devices based on the discussion in
> the
> > > > following thread:
> > > >
> https://lore.kernel.org/virtio-comment/CY8PR12MB7195E5A1D321CABBA97D3FD7DC0D2@CY8PR12MB7195.namprd12.prod.outlook.com/T/#m5789536fe7405a7be18e167ff522c27333656fe9
> > > >
> > > > Regards,
> > > > Akihiko Odaki
> > >
> > > That one asks for concrete data.
> >
> > It asks concrete data that motivates requiring setting the value to zero
> and
> > I decided removing such a requirement instead.
> >
> > Regards,
> > Akihiko Odaki
>
> Same thing really.
>
>

[-- Attachment #2: Type: text/html, Size: 10946 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2024-12-27  1:26 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-26  5:37 [PATCH] virtio-net: Ignore num_buffers when unused Akihiko Odaki
2024-12-26  7:29 ` Michael S. Tsirkin
2024-12-26  7:32   ` Michael S. Tsirkin
2024-12-26  7:35     ` Akihiko Odaki
2024-12-26  9:13       ` Michael S. Tsirkin
2024-12-26 11:09         ` Akihiko Odaki
2024-12-26 11:55           ` Michael S. Tsirkin
2024-12-27  1:26             ` Jason Wang

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.