On Tue, Apr 21, 2020 at 11:47:02PM +0900, Toshiaki Makita wrote:
> The following commit will introduce another offload driver using XDP.
> When using afxdp netdev, either of TC or XDP will be supported, so let's
> add an other_config to specify which offload driver is preferable.
> When not specified, TC will be used if netdev supports it.
> 
> Signed-off-by: Toshiaki Makita <[email protected]>
> ---
>  lib/netdev-offload.c | 37 +++++++++++++++++++++++++++++--------
>  1 file changed, 29 insertions(+), 8 deletions(-)
> 
> diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c
> index 32eab5910..ba9ebc3cd 100644
> --- a/lib/netdev-offload.c
> +++ b/lib/netdev-offload.c
> @@ -60,6 +60,9 @@ VLOG_DEFINE_THIS_MODULE(netdev_offload);
>  
>  static bool netdev_flow_api_enabled = false;
>  
> +#define FLOW_API_DRIVER_DEFAULT "linux_tc"
> +static const char *netdev_flow_api_driver = NULL;
> +
>  /* Protects 'netdev_flow_apis'.  */
>  static struct ovs_mutex netdev_flow_api_provider_mutex = 
> OVS_MUTEX_INITIALIZER;
>  
> @@ -171,18 +174,30 @@ netdev_flow_api_equals(const struct netdev *netdev1,
>  static int
>  netdev_assign_flow_api(struct netdev *netdev)
>  {
> -    struct netdev_registered_flow_api *rfa;
> +    struct netdev_registered_flow_api *rfa, *current_rfa = NULL;
>  
>      CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
> +        if (netdev_flow_api_driver &&
> +            strcmp(netdev_flow_api_driver, rfa->flow_api->type)) {
> +            continue;
> +        }
>          if (!rfa->flow_api->init_flow_api(netdev)) {
> -            ovs_refcount_ref(&rfa->refcnt);
> -            ovsrcu_set(&netdev->flow_api, rfa->flow_api);
> -            VLOG_INFO("%s: Assigned flow API '%s'.",
> -                      netdev_get_name(netdev), rfa->flow_api->type);
> -            return 0;
> +            if (!current_rfa ||
> +                (!netdev_flow_api_driver &&
> +                 !strcmp(FLOW_API_DRIVER_DEFAULT, rfa->flow_api->type))) {
> +                current_rfa = rfa;
Question:

When using netdev-afxdp, can we still enable tc-offload?
af_xdp hook gets packets before the tc hook, unless we have hw tc-offload,
then it by-passes the linux tc.

William

> +            }
> +        } else {
> +            VLOG_DBG("%s: flow API '%s' is not suitable.",
> +                     netdev_get_name(netdev), rfa->flow_api->type);
>          }
> -        VLOG_DBG("%s: flow API '%s' is not suitable.",
> -                 netdev_get_name(netdev), rfa->flow_api->type);
> +    }
> +    if (current_rfa) {
> +        ovs_refcount_ref(&current_rfa->refcnt);
> +        ovsrcu_set(&netdev->flow_api, current_rfa->flow_api);
> +        VLOG_INFO("%s: Assigned flow API '%s'.",
> +                  netdev_get_name(netdev), current_rfa->flow_api->type);
> +        return 0;
>      }
>      VLOG_INFO("%s: No suitable flow API found.", netdev_get_name(netdev));
>  
> @@ -647,6 +662,8 @@ netdev_set_flow_api_enabled(const struct smap 
> *ovs_other_config)
>          static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
>  
>          if (ovsthread_once_start(&once)) {
> +            const char *offload_driver;
> +
>              netdev_flow_api_enabled = true;
>  
>              VLOG_INFO("netdev: Flow API Enabled");
> @@ -660,6 +677,10 @@ netdev_set_flow_api_enabled(const struct smap 
> *ovs_other_config)
>                  netdev_offload_rebalance_policy = true;
>              }
>  
> +            offload_driver = smap_get_def(ovs_other_config, "offload-driver",
> +                                          NULL);
> +            netdev_flow_api_driver = nullable_xstrdup(offload_driver);
> +
>              netdev_ports_flow_init();
>  
>              ovsthread_once_done(&once);
> -- 
> 2.25.1
> 
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to