On 8/17/20 1:30 PM, Stokes, Ian wrote:
>>>> -----Original Message-----
>>>> From: Ilya Maximets <[email protected]>
>>>> Sent: Monday, August 17, 2020 12:59 PM
>>>> To: Ian Stokes <[email protected]>; [email protected]
>>>> Cc: Eli Britstein <[email protected]>; [email protected];
>>>> [email protected]; [email protected]
>>>> Subject: Re: [PATCH v3 1/1] netdev-offload-dpdk: Fix for broken
>>>> ethernet matching HWOL for XL710NIC.
>>>>
>>>>
>>>> On 8/14/20 3:38 PM, Ian Stokes wrote:
>>>>> From: Emma Finn <[email protected]>
>>>>>
>>>>> This patch introduces a temporary work around to fix partial
>>>>> hardware offload for XL710 devices. Currently the incorrect ethernet
>>>>> pattern is being set. This patch will be removed once this issue is
>>>>> fixed within the i40e PMD.
>>>>>
>>>>> Signed-off-by: Emma Finn <[email protected]>
>>>>> Signed-off-by: Eli Britstein <[email protected]>
>>>>> Co-authored-by: Eli Britstein <[email protected]>
>>>>> Tested-by: Ian Stokes <[email protected]>
>>>>> ---
>>>>
>>>> Thanks, Ian and Eli.
>>>> This patch looks good to me, but I had some issues backporting it to
>>>> 2.12 and below.  We have removed the XL710 workaround from these old
>>>> branches too, so I'm assuming that we need this patch there.
>>>>
>>>> On older branches memory for patterns is statically allocated, so
>>>> it's not easy to NULL-ify pointers.
>>>>
>>>> Following version of the code applies to 2.12 and could be easily
>>>> backported down to 2.10:
>>>>
>>>> diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
>>>> index 7146b2aab..b824218af 100644
>>>> --- a/lib/netdev-offload-dpdk.c
>>>> +++ b/lib/netdev-offload-dpdk.c
>>>> @@ -446,9 +446,18 @@ netdev_offload_dpdk_add_flow(struct netdev
>>>> *netdev,
>>>>     memset(&mask, 0, sizeof mask);
>>>>
>>>>     /* Eth */
>>>> -    if (match->wc.masks.dl_type ||
>>>> -        !eth_addr_is_zero(match->wc.masks.dl_src) ||
>>>> -        !eth_addr_is_zero(match->wc.masks.dl_dst)) {
>>>> +    if (match->wc.masks.dl_type == OVS_BE16_MAX && is_ip_any(&match-
>>>>> flow)
>>>> +        && eth_addr_is_zero(match->wc.masks.dl_dst)
>>>> +        && eth_addr_is_zero(match->wc.masks.dl_src)) {
>>>> +        /*
>>>> +         * This is a temporary work around to fix ethernet pattern for 
>>>> partial
>>>> +         * hardware offload for X710 devices. This fix will be reverted 
>>>> once
>>>> +         * the issue is fixed within the i40e PMD driver.
>>>> +         */
>>>> +        add_flow_pattern(&patterns, RTE_FLOW_ITEM_TYPE_ETH, NULL,
>> NULL);
>>>> +    } else if (match->wc.masks.dl_type ||
>>>> +               !eth_addr_is_zero(match->wc.masks.dl_src) ||
>>>> +               !eth_addr_is_zero(match->wc.masks.dl_dst)) {
>>>>         memcpy(&spec.eth.dst, &match->flow.dl_dst, sizeof spec.eth.dst);
>>>>         memcpy(&spec.eth.src, &match->flow.dl_src, sizeof spec.eth.src);
>>>>         spec.eth.type = match->flow.dl_type;
>>>> ---
>>>>
>>>> If it looks good to you, I could apply original patch (below) to
>>>> master,
>>>> 2.14 and 2.13, and a slightly different version (above) to 2.12, 2.11
>>>> and 2.10 once travis builds done.  What do you think?
>>> If intel can also do with zero masks (eth type spec 0x0800 type mask 0 /
>> ipv4...), we don't have to NULL-ify but only zero the mask, but that's 
>> already a
>> logic change than what we know working.
>>> Anyway, the above LGTM.
>>> Your plan is good, but there is also a slightly different approach. We can 
>>> adapt
>> the above and use it (or similar) for the 2.13+ branches, instead of the 
>> below, to
>> keep consistent and easier backporting in future.
>>
>>
>> Yes, I thought about this.  We will need to duplicate 'consumed' part on new
>> branches, but that might be not a big deal.  The code for new branches will 
>> look
>> like this:
>>
>> diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index
>> de6101e4d..5b632bac4 100644
>> --- a/lib/netdev-offload-dpdk.c
>> +++ b/lib/netdev-offload-dpdk.c
>> @@ -691,9 +691,22 @@ parse_flow_match(struct flow_patterns *patterns,
>>      consumed_masks->packet_type = 0;
>>
>>      /* Eth */
>> -    if (match->wc.masks.dl_type ||
>> -        !eth_addr_is_zero(match->wc.masks.dl_src) ||
>> -        !eth_addr_is_zero(match->wc.masks.dl_dst)) {
>> +    if (match->wc.masks.dl_type == OVS_BE16_MAX && is_ip_any(&match-
>>> flow)
>> +        && eth_addr_is_zero(match->wc.masks.dl_dst)
>> +        && eth_addr_is_zero(match->wc.masks.dl_src)) {
>> +        /*
>> +         * This is a temporary work around to fix ethernet pattern for 
>> partial
>> +         * hardware offload for X710 devices. This fix will be reverted once
>> +         * the issue is fixed within the i40e PMD driver.
>> +         */
>> +        add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_ETH, NULL, NULL);
>> +
>> +        memset(&consumed_masks->dl_dst, 0, sizeof consumed_masks->dl_dst);
>> +        memset(&consumed_masks->dl_src, 0, sizeof consumed_masks->dl_src);
>> +        consumed_masks->dl_type = 0;
>> +    } else if (match->wc.masks.dl_type ||
>> +               !eth_addr_is_zero(match->wc.masks.dl_src) ||
>> +               !eth_addr_is_zero(match->wc.masks.dl_dst)) {
>>          struct rte_flow_item_eth *spec, *mask;
>>
>>          spec = xzalloc(sizeof *spec);
>> ---
>>
>> If looks good for everyone, I could use above code for the patch on new
>> branches and the version without 'consumed_*' lines for older ones.
>>
>> Ian, Eli, what do you think?
> 
> I think this approach sounds ok, Emma is back in office and so can help 
> validate the patches if there are queries around supporting zeroing on the 
> X710 Nics.

I don't think we should change the logic of a workaround itself at this point.
But it will be good to have above diff validated.  To be sure that I didn't
break anything accidentially.

> 
> @Emma can you validate what Ilya has proposed?
> 
> Regards
> Ian
>>
>> Do we need v4 for this?
>>
>>>>
>>>>
>>>>>  lib/netdev-offload-dpdk.c | 28 ++++++++++++++++++++--------
>>>>>  1 file changed, 20 insertions(+), 8 deletions(-)
>>>>>
>>>>> diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
>>>>> index de6101e4d..2d668275a 100644
>>>>> --- a/lib/netdev-offload-dpdk.c
>>>>> +++ b/lib/netdev-offload-dpdk.c
>>>>> @@ -696,16 +696,28 @@ parse_flow_match(struct flow_patterns
>> *patterns,
>>>>>          !eth_addr_is_zero(match->wc.masks.dl_dst)) {
>>>>>          struct rte_flow_item_eth *spec, *mask;
>>>>>
>>>>> -        spec = xzalloc(sizeof *spec);
>>>>> -        mask = xzalloc(sizeof *mask);
>>>>> +        /*
>>>>> +         * This is a temporary work around to fix ethernet pattern for 
>>>>> partial
>>>>> +         * hardware offload for X710 devices. This fix will be reverted 
>>>>> once
>>>>> +         * the issue is fixed within the i40e PMD driver.
>>>>> +         */
>>>>> +        if (match->wc.masks.dl_type == OVS_BE16_MAX &&
>>>>> + is_ip_any(&match-
>>>>> flow)
>>>>> +            && eth_addr_is_zero(match->wc.masks.dl_dst)
>>>>> +            && eth_addr_is_zero(match->wc.masks.dl_src)) {
>>>>> +            spec = NULL;
>>>>> +            mask = NULL;
>>>>> +        } else {
>>>>> +            spec = xzalloc(sizeof *spec);
>>>>> +            mask = xzalloc(sizeof *mask);
>>>>>
>>>>> -        memcpy(&spec->dst, &match->flow.dl_dst, sizeof spec->dst);
>>>>> -        memcpy(&spec->src, &match->flow.dl_src, sizeof spec->src);
>>>>> -        spec->type = match->flow.dl_type;
>>>>> +            memcpy(&spec->dst, &match->flow.dl_dst, sizeof spec->dst);
>>>>> +            memcpy(&spec->src, &match->flow.dl_src, sizeof spec->src);
>>>>> +            spec->type = match->flow.dl_type;
>>>>>
>>>>> -        memcpy(&mask->dst, &match->wc.masks.dl_dst, sizeof mask->dst);
>>>>> -        memcpy(&mask->src, &match->wc.masks.dl_src, sizeof mask->src);
>>>>> -        mask->type = match->wc.masks.dl_type;
>>>>> +            memcpy(&mask->dst, &match->wc.masks.dl_dst, sizeof 
>>>>> mask->dst);
>>>>> +            memcpy(&mask->src, &match->wc.masks.dl_src, sizeof 
>>>>> mask->src);
>>>>> +            mask->type = match->wc.masks.dl_type;
>>>>> +        }
>>>>>
>>>>>          memset(&consumed_masks->dl_dst, 0, sizeof consumed_masks-
>>> dl_dst);
>>>>>          memset(&consumed_masks->dl_src, 0, sizeof
>>>>> consumed_masks->dl_src);
>>>>>
>>>
> 

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to