[ovs-dev] [PATCH v7 11/11] netdev-offload-tc: Add offload support for sFlow

Chris Mi cmi at nvidia.com
Tue Dec 15 03:31:34 UTC 2020


Hi Eelco,

Thanks for your review.

On 12/14/2020 7:46 PM, Eelco Chaudron wrote:
> Hi Chris,
>
> Noticed your v8, will try to fully review it before the year is over ;)
>
> //Eelco
>
> On 14 Dec 2020, at 10:33, Chris Mi wrote:
>
> <SNIP>
>
>>> diff --git a/lib/dpif.h b/lib/dpif.h
>>> index ed4257210..150162034 100644
>>> --- a/lib/dpif.h
>>> +++ b/lib/dpif.h
>>> @@ -878,6 +878,7 @@ void dpif_register_upcall_cb(struct dpif *, 
>>> upcall_callback *, void *aux);
>>>  struct dpif_sflow_attr {
>>>      const struct nlattr *sflow; /* sFlow action */
>>>      size_t sflow_len;           /* Length of 'sflow' in bytes. */
>>> +    // Why do we need to store sflow_len, it's part of the nlattr 
>>> data?
>> We need to copy and compare the dpif_sflow_attr. So sflow_len is used 
>> for that.
>
> But you could just use sflow->nla_len?
Done.
>
>>>      void *userdata;             /* struct user_action_cookie */
>>>      size_t userdata_len;        /* struct user_action_cookie length */
>>> diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
>>> index 75744aa3c..84991ff6a 100644
>>>
>>>  static int
>>> -parse_action_userspace(const struct nlattr *actions,
>>> -                       struct dpif_sflow_attr *sflow_attr)
>>> +parse_sample_actions(const struct nlattr *actions,
>>> +                     struct dpif_sflow_attr *sflow_attr)
>>>  {
>>>      const struct nlattr *nla;
>>>      unsigned int left;
>>> +    int err = EINVAL;
>>>
>>>      NL_NESTED_FOR_EACH_UNSAFE (nla, left, actions) {
>>>          if (nl_attr_type(nla) == OVS_ACTION_ATTR_USERSPACE) {
>>> -            return parse_userspace_userdata(nla, sflow_attr);
>>> +            err = parse_userspace_userdata(nla, sflow_attr);
>>> +        } else {
>>> +            /* We can't offload other nested actions */
>>> +            VLOG_DBG_RL(&error_rl,
>>> +                        "%s: other than OVS_ACTION_ATTR_USERSPACE 
>>> attribute",
>>> +                        __func__);
>>> +            return EINVAL;
>>>          }
>>>      }
>> I think we should not log in this function. We may be overwhelmed for 
>> various usespace actions.
>
> It’s a debug message, and it might be useful to figure out why offload 
> is failing, especially as this is a corner case.
Done.
>
>>> -    VLOG_ERR_RL(&error_rl, "%s: no OVS_ACTION_ATTR_USERSPACE 
>>> attribute",
>>> -                __func__);
>>> -    return EINVAL;
>>> +    if (err) {
>>> +        //THIS IS NOT AN ERROR CASE, FROM A DATAPATH IT'S VALID TO 
>>> DO ANY ACTION
>> But sample action expects a userspace attribute.
>
> This is the typical use case, but I think you can add one without it 
> and just redirect the packet to a different port. I don’t have a setup 
> right now, but I will try some examples when I’ll do the v8 review.
>
>>> + VLOG_DBG_RL(&error_rl, "%s: no OVS_ACTION_ATTR_USERSPACE attribute",
>>> +                    __func__);
>>> +    }
>>> +    return err;
>>>  }
>>>
>
> <SNIP>
>
>>>>>
>>>>> One other general command, how would we guarantee that the group 
>>>>> ID value used by tc-sample is unique and not being used by any 
>>>>> other application than OVS?
>>>> Please see the comment:
>>>>
>>>>  239 /* Allocate a unique group id for the given set of flow metadata.
>>>>  240  * The ID space is 2^^32, so there should never be a situation 
>>>> in which all
>>>>  241  * the IDs are used up.  We loop until we find a free one. */
>>>>  242 static struct gid_node *
>>>>  243 gid_alloc__(const struct dpif_sflow_attr *sflow, uint32_t hash)
>>>>
>>>> This id is similar to recirc id.
>>>>> Do we assume tc-sample is elusively assigned to OVS?
>>>> Yes, I think so.
>>>>> This might not be the case in customer environments, so we might 
>>>>> need to be able to disable offloading this action.
>>>> If we can offload, why not disable it. If we can't offload, tc will 
>>>> return EOPNOTSUPP and fail back to ovs datapath.
>>>> So I don't think we need to be able to disable it.
>>>
>>> Ack all three above, but I was referring to someone that uses sflow 
>>> kmod on his management interface already, and now all of a sudden 
>>> OVS will use it too. Which could cause a problem as the u32 space is 
>>> started between all user space application. So I do think we need an 
>>> option to disable it in OVS.
>> Sorry, what do you mean by sflow kmod?
>
> I mean the psample kmod, tc-sample feature.
OK, I see what you mean. But we can disable offload via:
# ovs-vsctl set Open_vSwitch . other_config:hw-offload="false";

sFlow is not per flow. If user creates OVS sflow, I think almost all 
flows will have an additional sFlow action.
I don't think we need to disable sFlow action only. That means we 
disable offload for all flows.
>
>>>>>
>>>>> One final question, do you know if this will be supported in your 
>>>>> NICs as hardware offload?
>>>> Sure. We submitted the first version of the OVS patch set in 
>>>> September. We support offload before that.
>>>> I believe the driver change will be in linux net-next branch soon.
>>>
>>> Cool, looking forward to seeing the change…
>>>
>>>
>>> If you do send out a new revision of this patchset, I’ll try to make 
>>> some time and do a full review and some testing.
>>>
>> V8 will be sent for the full review.
I'll send v9 for above two small changes.

Thanks,
Chris



More information about the dev mailing list