On 18 Oct 2021, at 14:03, Chris Mi wrote:

> Hi Eelco,
>
> On 10/15/2021 9:42 PM, Eelco Chaudron wrote:
>> Small comments inline, and Ilya please take a look at the first 
>> comment/request.
>>
>> //Eelco
>>
>>
>> On 12 Oct 2021, at 10:19, Chris Mi wrote:
>>
>>> Some offload actions require functionality that is not netdev
>>> based, but dpif. For example, sFlow action requires to create
>>> a psample netlink socket to receive the sampled packets from
>>> TC or kernel driver.
>>>
>>> Create dpif-offload-provider layer to support such actions.
>>>
>>> Signed-off-by: Chris Mi <c...@nvidia.com>
>>> Reviewed-by: Eli Britstein <el...@nvidia.com>
>>> ---
>> <SNIP>
>>
>>> diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h
>>> index 7e11b9697..ce20cdeb1 100644
>>> --- a/lib/dpif-provider.h
>>> +++ b/lib/dpif-provider.h
>>> @@ -22,8 +22,9 @@
>>>    * exposed over OpenFlow as a single switch.  Datapaths and the 
>>> collections of
>>>    * ports that they contain may be fixed or dynamic. */
>>>
>>> -#include "openflow/openflow.h"
>>>   #include "dpif.h"
>>> +#include "dpif-offload-provider.h"
>>> +#include "openflow/openflow.h"
>>>   #include "util.h"
>>>
>>>   #ifdef  __cplusplus
>>> @@ -635,6 +636,11 @@ struct dpif_class {
>>>        * sufficient to store BOND_BUCKETS number of elements. */
>>>       int (*bond_stats_get)(struct dpif *dpif, uint32_t bond_id,
>>>                             uint64_t *n_bytes);
>>> +
>>> +    /* Some offload actions require functionality that is not netdev based,
>>> +     * but dpif. Add dpif-offload-provider layer API to support such
>>> +     * offload actions. */
>>> +    const struct dpif_offload_api *offload_api;
>>  From previous revisions:
>>
>> | EC> Here you add the provider directly into the dpif class. Not sure if 
>> this is what Ilya had in mind. As in general, these get integrated into the 
>> dpif/netdev, not the class. Ilya can you comment on/review this?
>> | CM> OK.
>>
>>  From my side, this looks wrong as there is a direct relation between dpif 
>> and dpif-offload. I would assume you should be able to pick a specific one, 
>> or what else would have stopped us from adding the 
>> dpif_offload_sflow_recv_wait()/dpif_offload_sflow_recv() directly in the 
>> dpif.
> I'll think about it. If I understand correctly, it should be something like 
> this, right?
>
> struct dpif {
>     const struct dpif_class *dpif_class;
>     const struct dpif_offload_api *dpif_offload_api;
> ...

Yes, this is what I was referring to.

> Thanks,
> Chris
>> To me, it's also not clear how we would continue from here, are there any 
>> plans to move all offload stuff to the offload provider? If so, in what time 
>> frame?
>>
>>>   };
>>>
>>>   extern const struct dpif_class dpif_netlink_class;
>>> diff --git a/lib/dpif.c b/lib/dpif.c
>>> index 8c4aed47b..51cf5d666 100644
>>> --- a/lib/dpif.c
>>> +++ b/lib/dpif.c
>>> @@ -153,6 +153,15 @@ dp_register_provider__(const struct dpif_class 
>>> *new_class)
>>>           return error;
>>>       }
>>>
>>> +    if (new_class->offload_api && new_class->offload_api->init) {
>>> +        error = new_class->offload_api->init();
>>> +        if (error) {
>>> +            VLOG_WARN("failed to initialize %s datapath class for offload: 
>>> %s",
>> Please use a capital F for Failed.
>>
>>> +                      new_class->type, ovs_strerror(error));
>>> +            return error;
>>> +        }
>>> +    }
>>> +
>>>       registered_class = xmalloc(sizeof *registered_class);
>>>       registered_class->dpif_class = new_class;
>>>       registered_class->refcount = 0;
>>> @@ -183,6 +192,7 @@ static int
>>>   dp_unregister_provider__(const char *type)
>>>   {
>>>       struct shash_node *node;
>>> +    const struct dpif_class *dpif_class;
>>>       struct registered_dpif_class *registered_class;
>>>
>>>       node = shash_find(&dpif_classes, type);
>>> @@ -196,6 +206,11 @@ dp_unregister_provider__(const char *type)
>>>           return EBUSY;
>>>       }
>>>
>>> +    dpif_class = registered_class->dpif_class;
>>> +    if (dpif_class->offload_api && dpif_class->offload_api->destroy) {
>>> +        dpif_class->offload_api->destroy();
>>> +    }
>>> +
>>>       shash_delete(&dpif_classes, node);
>>>       free(registered_class);
>>>
>>> -- 
>>> 2.30.2

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to