OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

virtio-comment message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: RE: [virtio-dev] Re: [virtio-comment] Re: [PATCH v7] virtio-net: support inner header hash


> From: Heng Qi <hengqi@linux.alibaba.com>
> Sent: Tuesday, February 7, 2023 9:31 PM
> 
> å 2023/1/31 äå1:28, Heng Qi åé:
> > On Mon, Jan 16, 2023 at 04:42:11PM +0800, Jason Wang wrote:
> >> å 2023/1/16 16:01, Heng Qi åé:
> >>> On Wed, Jan 11, 2023 at 04:45:12AM -0500, Michael S. Tsirkin wrote:
> >>>> On Wed, Jan 04, 2023 at 03:14:01PM +0800, Heng Qi wrote:
> >>>>> If the tunnel is used to encapsulate the packets, the hash
> >>>>> calculated using the outer header of the receive packets is always
> >>>>> fixed for the same flow packets, i.e. they will be steered to the same
> receive queue.
> >>>>>
> >>>>> We add a feature bit VIRTIO_NET_F_HASH_TUNNEL and related
> bitmasks
> >>>>> in \field{hash_types}, which instructs the device to calculate the
> >>>>> hash using the inner headers of tunnel-encapsulated packets.
> >>>>> Besides, values in \field{hash_report_tunnel} are added to report tunnel
> types.
> >>>>>
> >>>>> Fixes:
> >>>>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2F
> >>>>> github.com%2Foasis-tcs%2Fvirtio-
> spec%2Fissues%2F151&data=05%7C01%7
> >>>>>
> Cparav%40nvidia.com%7C12be6c51b3c04860c01608db097c796a%7C43083d15
> 7
> >>>>>
> 27340c1b7db39efd9ccc17a%7C0%7C0%7C638114202991221369%7CUnknown
> %7CT
> >>>>>
> WFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJ
> >>>>>
> XVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=6feFgy94LMCYfG0NKPlHCr1AvkC
> OH4v9
> >>>>> %2BnLomXklNqs%3D&reserved=0
> >>>>>
> >>>>> Reviewed-by: Jason Wang <jasowang@redhat.com>
> >>>>> Signed-off-by: Heng Qi <hengqi@linux.alibaba.com>
> >>>>> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
> >>>>> ---
> >>>>> v6:
> >>>>> 	1. Modify the wording of some sentences for clarity. @Michael S.
> Tsirkin
> >>>>> 	2. Fix some syntax issues. @Michael S. Tsirkin
> >>>>>
> >>>>> v5:
> >>>>> 	1. Fix some syntax and capitalization issues. @Michael S. Tsirkin
> >>>>> 	2. Use encapsulated/encaptulation uniformly. @Michael S. Tsirkin
> >>>>> 	3. Move the links to introduction section. @Michael S. Tsirkin
> >>>>> 	4. Clarify some sentences. @Michael S. Tsirkin
> >>>>>
> >>>>> v4:
> >>>>> 	1. Clarify some paragraphs. @Cornelia Huck
> >>>>> 	2. Fix the u8 type. @Cornelia Huck
> >>>>>
> >>>>> v3:
> >>>>> 	1. Rename VIRTIO_NET_F_HASH_GRE_VXLAN_GENEVE_INNER to
> VIRTIO_NET_F_HASH_TUNNEL. @Jason Wang
> >>>>> 	2. Make things clearer. @Jason Wang @Michael S. Tsirkin
> >>>>> 	3. Keep the possibility to use inner hash for automatic receive steering.
> @Jason Wang
> >>>>> 	4. Add the "Tunnel packet" paragraph to avoid repeating the GRE
> >>>>> etc. many times. @Michael S. Tsirkin
> >>>>>
> >>>>> v2:
> >>>>> 	1. Add a feature bit for GRE/VXLAN/GENEVE inner hash. @Jason Wang
> >>>>> 	2. Chang \field{hash_tunnel} to \field{hash_report_tunnel}.
> >>>>> @Jason Wang, @Michael S. Tsirkin
> >>>>>
> >>>>> v1:
> >>>>> 	1. Remove the patch for the bitmask fix. @Michael S. Tsirkin
> >>>>> 	2. Clarify some paragraphs. @Jason Wang
> >>>>> 	3. Add \field{hash_tunnel} and VIRTIO_NET_HASH_REPORT_GRE.
> @Yuri
> >>>>> Benditovich
> >>>>>
> >>>>>   content.tex      | 191
> +++++++++++++++++++++++++++++++++++++++++++++--
> >>>>>   introduction.tex |  19 +++++
> >>>>>   2 files changed, 203 insertions(+), 7 deletions(-)
> >>>>>
> >>>>> diff --git a/content.tex b/content.tex index e863709..7845f6c
> >>>>> 100644
> >>>>> --- a/content.tex
> >>>>> +++ b/content.tex
> >>>>> @@ -3084,6 +3084,9 @@ \subsection{Feature bits}\label{sec:Device
> Types / Network Device / Feature bits
> >>>>>   \item[VIRTIO_NET_F_CTRL_MAC_ADDR(23)] Set MAC address through
> control
> >>>>>       channel.
> >>>>> +\item[VIRTIO_NET_F_HASH_TUNNEL(52)] Device supports inner
> >>>>> +    header hash for GRE, VXLAN and GENEVE tunnel-encapsulated
> packets.
> >>>>> +
> >>>>>   \item[VIRTIO_NET_F_NOTF_COAL(53)] Device supports notifications
> coalescing.
> >>>>>   \item[VIRTIO_NET_F_GUEST_USO4 (54)] Driver can receive USOv4
> packets.
> >>>>> @@ -3095,7 +3098,8 @@ \subsection{Feature bits}\label{sec:Device
> Types / Network Device / Feature bits
> >>>>>    to several segments when each of these smaller packets has UDP
> header.
> >>>>>   \item[VIRTIO_NET_F_HASH_REPORT(57)] Device can report per-packet
> hash
> >>>>> -    value and a type of calculated hash.
> >>>>> +    value, a type of calculated hash, and, if
> VIRTIO_NET_F_HASH_TUNNEL
> >>>>> +    is negotiated, an encapsulation packet type.
> >>>>>   \item[VIRTIO_NET_F_GUEST_HDRLEN(59)] Driver can provide the exact
> \field{hdr_len}
> >>>>>       value. Device benefits from knowing the exact header length.
> >>>>> @@ -3140,6 +3144,7 @@ \subsubsection{Feature bit
> requirements}\label{sec:Device Types / Network Device
> >>>>>   \item[VIRTIO_NET_F_NOTF_COAL] Requires VIRTIO_NET_F_CTRL_VQ.
> >>>>>   \item[VIRTIO_NET_F_RSC_EXT] Requires VIRTIO_NET_F_HOST_TSO4 or
> VIRTIO_NET_F_HOST_TSO6.
> >>>>>   \item[VIRTIO_NET_F_RSS] Requires VIRTIO_NET_F_CTRL_VQ.
> >>>>> +\item[VIRTIO_NET_F_HASH_TUNNEL] Requires
> VIRTIO_NET_F_CTRL_VQ.
> >>>>>   \end{description}
> >>>>>   \subsubsection{Legacy Interface: Feature bits}\label{sec:Device
> >>>>> Types / Network Device / Feature bits / Legacy Interface: Feature bits}
> @@ -3386,7 +3391,8 @@ \subsection{Device Operation}\label{sec:Device
> Types / Network Device / Device O
> >>>>>           le16 num_buffers;
> >>>>>           le32 hash_value;        (Only if VIRTIO_NET_F_HASH_REPORT
> negotiated)
> >>>>>           le16 hash_report;       (Only if VIRTIO_NET_F_HASH_REPORT
> negotiated)
> >>>>> -        le16 padding_reserved;  (Only if VIRTIO_NET_F_HASH_REPORT
> negotiated)
> >>>>> +        u8 hash_report_tunnel;  (Only if VIRTIO_NET_F_HASH_REPORT
> >>>>> + negotiated, only valid of VIRTIO_NET_F_HASH_TUNNEL negotiated)
> >>>> of -> if?
> >>> Sorry for the late reply.
> >>> It's Cornelia's suggestion, and 'of' seems to work fine.
> >>>
> >>>> also let's add: otherwise reserved?
> >>> Sure.
> >>>
> >>>>> +        u8 padding_reserved;    (Only if VIRTIO_NET_F_HASH_REPORT
> negotiated)
> >>>>>   };
> >>>>>   \end{lstlisting}
> >>>>> @@ -3837,7 +3843,8 @@ \subsubsection{Processing of Incoming
> Packets}\label{sec:Device Types / Network
> >>>>>   A device attempts to calculate a per-packet hash in the following cases:
> >>>>>   \begin{itemize}
> >>>>>   \item The feature VIRTIO_NET_F_RSS was negotiated. The device uses
> the hash to determine the receive virtqueue to place incoming packets.
> >>>>> -\item The feature VIRTIO_NET_F_HASH_REPORT was negotiated. The
> device reports the hash value and the hash type with the packet.
> >>>>> +\item The feature VIRTIO_NET_F_HASH_REPORT was negotiated. The
> >>>>> +device reports the hash value and the hash type. If additionally
> VIRTIO_NET_F_HASH_TUNNEL was negotiated, the device reports the
> encapsulation type as well.
> >>>>>   \end{itemize}
> >>>>>   If the feature VIRTIO_NET_F_RSS was negotiated:
> >>>>> @@ -3863,8 +3870,36 @@ \subsubsection{Processing of Incoming
> Packets}\label{sec:Device Types / Network
> >>>>>    \ref{sec:Device Types / Network Device / Device Operation / Control
> Virtqueue / Automatic receive steering in multiqueue mode / Hash calculation}.
> >>>>>   \end{itemize}
> >>>>> +\subparagraph{Tunnel/Encapsulated packet} \label{sec:Device Types
> >>>>> +/ Network Device / Device Operation / Processing of Incoming
> >>>>> +Packets / Hash calculation for incoming packets /
> >>>>> +Tunnel/Encapsulated packet} A tunnel packet is encapsulated from
> >>>>> +the original packet based on the tunneling protocol (only a
> >>>>> +single level of encapsulation is currently supported). The encapsulated
> packet contains an outer header and an inner header, and the device calculates
> the hash over either the inner header or the outer header.
> >>>>> +
> >>>>> +When the feature VIRTIO_NET_F_HASH_TUNNEL is negotiated and the
> >>>>> +corresponding encapsulation type is set in \field{hash_types},
> >>>>> +the hash for a specific type of encapsulated packet is calculated over
> the inner as opposed to outer header.
> >>>>> +Supported encapsulation types are listed in \ref{sec:Device Types
> >>>>> +/ Network Device / Device Operation / Processing of Incoming
> >>>>> +Packets / Hash calculation for incoming packets / Supported/enabled
> hash types}.
> >>>>> +
> >>>>> +If both VIRTIO_NET_F_HASH_REPORT and
> VIRTIO_NET_F_HASH_TUNNEL are
> >>>>> +negotiated, the device can support inner hash calculation for
> >>>>> +\hyperref[intro:GRE]{[GRE]}, \hyperref[intro:VXLAN]{[VXLAN]} and
> >>>>> +\hyperref[intro:GENEVE]{[GENEVE]} encapsulated packets, and the
> >>>>> +corresponding encapsulation type in \field{hash_types} is
> >>>>> +VIRTIO_NET_HASH_TYPE_{GRE, VXLAN, GENEVE}_INNER respectively.
> The value in \field{hash_report_tunnel} is VIRTIO_NET_HASH_REPORT_{NONE,
> GRE, VXLAN, GENEVE} respectively.
> >>>>> +
> >>>>> +If VIRTIO_NET_F_HASH_REPORT is negotiated but
> >>>>> +VIRTIO_NET_F_HASH_TUNNEL is not negotiated, the device calculates
> >>>>> +the hash over the outer header, and \field{hash_report} reports
> >>>>> +the hash type. \field{hash_report_tunnel} is no longer valid.
> >>>> Does this mean that VIRTIO_NET_HASH_TYPE_{GRE, VXLAN,
> GENEVE}_INNER
> >>>> must not be set without VIRTIO_NET_F_HASH_TUNNEL?
> >>>>
> >>> Yes.
> >>>
> >>>> If yes then we can add conformance statements to this end and then
> >>>> drop the "If the feature VIRTIO_NET_F_HASH_TUNNEL is negotiated"
> >>>> all over the place just relying on hash type being set instead.
> >>> Please see the response below.
> >>>
> >>>> Also, note that it has to be ok for device to expose hash types without
> >>>> negotiating VIRTIO_NET_F_HASH_TUNNEL since they are in config space.
> >>>> Idea: do we want to decouple these completely? have
> VIRTIO_NET_F_HASH_TUNNEL
> >>>> just add hash_report_tunnel and have hash types speak for themselves?
> >>>> It makes things nicely orthogonal in that if one does not care
> >>>> about knowing encapsulation type (e.g. for RSS) one can disable
> >>>> VIRTIO_NET_F_HASH_TUNNEL.
> >>> This seems to have the following 3 problems:
> >>>
> >>> 1. This will break the specification. As described in the specification, any
> field
> >>>     in the configuration space only exists when there is a corresponding
> feature bit:
> >>>     "Device configuration space is generally used for rarely-changing or
> initialization-time parameters.
> >>>     Where configuration fields are optional, their existence is indicated by
> feature bits: ",
> >>>     which also applies to supported_hash_types.
> >>>
> >>> 2. If I'm not wrong, this seems to make the encapsulation hash types
> dependent on
> >>>     VIRTIO_NET_F_RSS, can the driver read supported_hash_types
> (including encapsulation
> >>>     hash types) if VIRTIO_NET_F_RSS is not negotiated? But that shouldn't be
> the case,
> >>>     we only use encapsulation hash types to provide guidance for hash
> calculation, but not
> >>>     necessarily use hash values to select receive queues (unless
> VIRTIO_NET_F_RSS is negotiated).
> >>>
> >>> 3. If all supported_hash_types speak for themselves, why do we need the
> VIRTIO_NET_F_HASH_TUNNEL
> >>>     feature, because as long as the encapsulation hash types exist and
> VIRTIO_NET_F_HASH_REPORT is
> >>>     negotiated, hash_report_tunnel exists correspondingly. "have
> VIRTIO_NET_F_HASH_TUNNEL just add
> >>>     hash_report_tunnel"? It seems like hash_report_tunnel will only work if
> the encapsulation hash
> >>>     types are present.
> >>>
> >>> So, if I'm not wrong, the reasonable logic should be that
> VIRTIO_NET_F_HASH_TUNNEL is only used
> >>> to declare that the device supports inner header hash and let the
> corresponding encapsulation
> >>> hash type exist, when VIRTIO_NET_F_RSS is negotiated, we can use this
> hash value to select the
> >>> receive queue. Considering the migration at the same time, if the dst device
> does not negotiate
> >>> VIRTIO_NET_F_HASH_TUNNEL, the migration will fail; otherwise, use
> encapsulation hash types to
> >>> determine whether the migration can succeed.
> >>
> >> I think it might be better to have consistency:
> >>
> >> 1) If VIRTIO_NET_F_HASH_TUNNEL introduces a new field in vnet
> >> header, is it better to have a new config filed in the config space?
> >>
> >> or
> >>
> >> 2) If VIRTIO_NET_F_HASH_TUNNEL doesn't introduce new config file,
> >> should we try to reuse hash_report?
> >>
> >> 1) seems better and cleaner to me.
> > Sorry for the late reply due to vacation.
> >
> > Good point, it's clearer to use the VIRTIO_NET_F_HASH_TUNNEL feature to
> > control all information related to inner header hash.
> 
> Hi, Parav.
> 
> Do you think we need both hash_types and hash_tunnel_types?

In struct virtio_net_config we need two fields.
a. supported_hash_types (already exists)
b. supported_hash_tunnel_type -> bitmap indicating for which outer headers, inner hash calculation is supported.

In struct virtio_net_hdr we need two fields.
a. hash_report (already exists)
b. hash_tunnel_type 8 bits -> absolute value indicating which outer header exists when inner header hash calculated.
You already have it in your patch named as hash_report_tunnel.
May be better to name as hash_report_tunnel_type to make it clearer that its type.


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]