On 29 Nov 2022, at 17:35, Phelan, Michael wrote:
>> -----Original Message-----
>> From: Ilya Maximets <[email protected]>
>> Sent: Tuesday 29 November 2022 15:07
>> To: Finn, Emma <[email protected]>; [email protected]; Phelan,
>> Michael <[email protected]>
>> Cc: [email protected]; Eelco Chaudron <[email protected]>; Van
>> Haaren, Harry <[email protected]>; Stokes, Ian
>> <[email protected]>
>> Subject: Re: [ovs-dev] [v5] odp-execute: Add ISA implementation of
>> set_masked IPv6 action
>>
>> On 11/29/22 15:09, Finn, Emma wrote:
>>>
>>>
>>>> -----Original Message-----
>>>> From: Ilya Maximets <[email protected]>
>>>> Sent: Friday 25 November 2022 17:22
>>>> To: Finn, Emma <[email protected]>; [email protected]
>>>> Cc: [email protected]; Eelco Chaudron <[email protected]>
>>>> Subject: Re: [ovs-dev] [v5] odp-execute: Add ISA implementation of
>>>> set_masked IPv6 action
>>>>
>>>> On 11/25/22 17:23, Emma Finn wrote:
>>>>> This commit adds support for the AVX512 implementation of the
>>>>> ipv6_set_addrs action as well as an AVX512 implementation of
>>>>> updating the L4 checksums.
>>>>>
>>>>> Signed-off-by: Emma Finn <[email protected]>
>>>>>
>>>>> ---
>>>>> v5:
>>>>> - Fixed load for ip6 src and dst mask for checksum check.
>>>>> v4:
>>>>> - Reworked and moved check for checksum outside loop.
>>>>> - Code cleanup based on review from Eelco.
>>>>> v3:
>>>>> - Added a runtime check for AVX512 vbmi.
>>>>> v2:
>>>>> - Added check for availbility of s6_addr32 field of struct in6_addr.
>>>>> - Fixed network headers for freebsd builds.
>>>>> ---
>>>>> ---
>>>>> lib/odp-execute-avx512.c | 204
>>>>> ++++++++++++++++++++++++++++++++++++++
>>>>> lib/odp-execute-private.c | 17 ++++
>>>>> lib/odp-execute-private.h | 1 +
>>>>> 3 files changed, 222 insertions(+)
>>>>
>>>> Hi, Emma. Thanks for the patch!
>>>> I didn't review the actual AVX512 code, but I have a couple of
>>>> questions and nits inline.
>>>>
>>>
>>> Thanks Ilya.
>>> My replies are inline below.
>>>
>>> <SNIP>
>>>>> +
>>>>> +/* This function performs the same operation on each packet in the
>>>>> +batch as
>>>>> + * the scalar odp_set_ipv6() function. */
>>>>
>>>> I'm not sure if that statement is correct. If you'll look at the
>>>> odp_set_ipv6() implementation and precisely at the
>>>> packet_set_ipv6() implementation, there is a check for the routing
>>>> extension header combined with the check for the fragmentation header
>>>> (packet_rh_present) to prevent writing into L4 fields that do not
>>>> exist or, in case of routing header being present, checksum should
>>>> not be updated for the destination address.
>>>>
>>>> Could you point me to the AVX512 code that is responsible for that check?
>>>>
>>> I think the AVX code is handling this case the same as scalar and also I
>> cannot reproduce a failure with the autovalidator.
>>> If I am following the scalar code correctly, you're right. If there is a
>>> routing
>> extension header present, for the dst address no checksum will happen.
>>> But similarly for src address, a checksum won't happen.
>>> As packet_update_csum128() will only do a checksum if ip6_nxt is UPD,TCP
>> or ICMPv6. Which won't be the case if any extension header is present.
>>
>> Not really, the 'proto' argument in this function is one of the results of
>> packet_rh_present() that iterates over all the extension headers and takes
>> the protocol number from the last one. So, extension headers are jumped
>> over this way.
>>
>>> Similarly in the AVX code, l4 checksum will only happen if ip6_nxt is
>> UPD,TCP or ICMPv6, i.e no extension header is present.
>>> So I think this case is covered if I'm not missing any corner cases?
>>
>> I didn't read the AVX code carefully enough to confirm that, but it is not
>> really
>> a correct behavior as extension headers should generally be just ignored
>> except for fragmentation header and the routing header. So, the logic is:
>>
>> - If the fragmentation header is present and it is a 'later'
>> fragment - skip the checksum as there is no L4 header in
>> the packet. For the 'first' fragment the checksum should
>> be re-calculated.
>>
>> - If the routing header with non-zero segments_left is present
>> then update of the destination address should not be reflected
>> in the checksum. Update of the source address should still
>> trigger the checksum update. This is because the original
>> packet checksum is calculated with the destination address
>> taken from the last segment of the routing header.
>>
>> - In all other cases, extension headers should be just ignored
>> and the checksum should be updated.
>>
>> I'm not sure if that logic is covering all the cases, but that is what
>> scalar code is
>> doing.
>>
>>> Have you been able to see a failure with autovalidator ?
>>
>> Yes, there is a failure on a system test:
>>
>> 9. system-traffic.at:229: testing datapath - ping6 between two ports with
>> header modify ...
>>
>> 2022-11-28T17:27:13.067Z|00107|dpif_lookup_avx512_gather|INFO|Using
>> non-specialized AVX512 lookup for subtable (4,5) and possibly oth ers.
>> 2022-11-28T17:27:13.389Z|00108|odp_execute_impl|ERR|Autovalidation of
>> avx512 failed. Details:
>> Packet: 0
>> Action : set(ipv6(dst=fc00::2))
>> Good hex:
>> 00000000 e4 11 22 33 44 54 e4 11-22 33 44 55 86 dd 60 06
>> 00000010 01 5d 05 b0 2c 40 fc 00-00 00 00 00 00 00 00 00
>> 00000020 00 00 00 00 00 01 fc 00-00 00 00 00 00 00 00 00
>> 00000030 00 00 00 00 00 02 3a 00-00 01 81 05 2f 0d 80 00
>> 00000040 0b bc 39 39 00 01 71 ef-84 63 00 00 00 00 13 ed
>> 00000050 05 00 00 00 00 00 10 11-12 13 14 15 16 17 18 19 <...> Test hex:
>> 00000000 e4 11 22 33 44 54 e4 11-22 33 44 55 86 dd 60 06
>> 00000010 01 5d 05 b0 2c 40 fc 00-00 00 00 00 00 00 00 00
>> 00000020 00 00 00 00 00 01 fc 00-00 00 00 00 00 00 00 00
>> 00000030 00 00 00 00 00 02 3a 00-00 01 81 05 2f 0d 80 00
>> 00000040 0b bb 39 39 00 01 71 ef-84 63 00 00 00 00 13 ed
>> 00000050 05 00 00 00 00 00 10 11-12 13 14 15 16 17 18 19 <...>
>>
>>
>> This is a fragmented ICMPv6 packet. The first fragment.
>>
>> I'm also wondering why CI didn't catch that...
>>
>> There might be 2 reasons:
>>
>> 1. Actions autovalidator is not enabled in CI, or 2. CI system doesn't have
>> avx512vbmi.
>>
>> Michael, could you check that?
>
> Hi Ilya,
> The CI system does have avx512vbmi, however, the actions autovalidator is
> never enabled for any of the tests.
>
> I could add a test to configure with the actions autovalidator if you think
> this would be a good value add for the CI?
I would suggest doing a run with and without all the avx512 auto validators
enabled at compile time.
>>
>>
>>>
>>>>> +static void
>>>>> +__attribute__((__target__("avx512vbmi")))
>>>>> +action_avx512_ipv6_set_addrs(struct dp_packet_batch *batch,
>>>>> + const struct nlattr *a)
>>>>
>>>> Name of a function is a bit confusing. Doesn't it also set tclass, proto,
>>>> etc.
>> ?
>>>>
>>> It does. Would something like action_avx512_set_ipv6() be better?
>>> As the scalar function is called packet_set_ipv6().
>>
>> Yes, that looks better. Thanks!
>>
>> Best regards, Ilya Maximets.
> Thanks,
> Michael.
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev