[ovs-dev] [PATCH v4 2/5] netdev-offload: Add "offload-driver" other_config to specify offload driver
Toshiaki Makita
toshiaki.makita1 at gmail.com
Fri Jul 31 02:55:11 UTC 2020
The following commit will introduce another offload driver using XDP.
When using afxdp netdev, both of TC and XDP will be supported, so let's
add an other_config to specify which offload driver is preferable.
When not specified and multiple offload drivers can be used, TC will be
used if netdev supports it.
Signed-off-by: Toshiaki Makita <toshiaki.makita1 at gmail.com>
---
lib/netdev-offload.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c
index 2da3bc701..f9c0b0438 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;
@@ -172,9 +175,38 @@ static int
netdev_assign_flow_api(struct netdev *netdev)
{
struct netdev_registered_flow_api *rfa;
+ const char *flow_api_driver = netdev_flow_api_driver;
+
+ if (!flow_api_driver) {
+ flow_api_driver = FLOW_API_DRIVER_DEFAULT;
+ }
CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
+ if (strcmp(flow_api_driver, rfa->flow_api->type)) {
+ continue;
+ }
if (!rfa->flow_api->init_flow_api(netdev)) {
+ goto found;
+ }
+ VLOG_DBG("%s: flow API '%s' is not suitable.",
+ netdev_get_name(netdev), rfa->flow_api->type);
+ if (netdev_flow_api_driver) {
+ goto err;
+ }
+ break;
+ }
+ if (netdev_flow_api_driver) {
+ VLOG_DBG("%s: flow API '%s' is not found.",
+ netdev_get_name(netdev), netdev_flow_api_driver);
+ goto err;
+ }
+
+ CMAP_FOR_EACH (rfa, cmap_node, &netdev_flow_apis) {
+ if (!strcmp(flow_api_driver, rfa->flow_api->type)) {
+ continue;
+ }
+ if (!rfa->flow_api->init_flow_api(netdev)) {
+found:
ovs_refcount_ref(&rfa->refcnt);
ovsrcu_set(&netdev->flow_api, rfa->flow_api);
VLOG_INFO("%s: Assigned flow API '%s'.",
@@ -184,6 +216,7 @@ netdev_assign_flow_api(struct netdev *netdev)
VLOG_DBG("%s: flow API '%s' is not suitable.",
netdev_get_name(netdev), rfa->flow_api->type);
}
+err:
VLOG_INFO("%s: No suitable flow API found.", netdev_get_name(netdev));
return -1;
@@ -647,6 +680,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 +695,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
More information about the dev
mailing list