[ovs-dev] [PATCH 7/8] netdev-dpdk: Check dpdk-extra when reading db

Aaron Conole aconole at redhat.com
Fri Apr 1 03:22:48 UTC 2016


A previous patch introduced the ability to pass arbitrary EAL command
line options via the dpdk_extras database entry. This commit enhances
that by warning the user when such a configuration is detected and
prefering the value in the database.

Suggested-by: Sean K Mooney <sean.k.mooney at intel.com>
Signed-off-by: Aaron Conole <aconole at redhat.com>
Tested-by: Sean K Mooney <sean.k.mooney at intel.com>
Tested-by: Kevin Traynor <kevin.traynor at intel.com>
Acked-by: Panu Matilainen <pmatilai at redhat.com>
Acked-by: Flavio Leitner <fbl at sysclose.org>
---
v9:
* Added as suggested by Sean K Mooney

v10:
* no change

v11:
* Minor cleanups as suggested by Daniele

 lib/netdev-dpdk.c | 66 +++++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 55 insertions(+), 11 deletions(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index b955cb8..bb8f233 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -2779,6 +2779,17 @@ dpdk_option_extend(char ***argv, int argc, const char *option,
     newargv[argc+1] = xstrdup(value);
 }
 
+static char **
+move_argv(char ***argv, size_t cur_size, char **src_argv, size_t src_argc)
+{
+    char **newargv = grow_argv(argv, cur_size, src_argc);
+    while (src_argc--) {
+        newargv[cur_size+src_argc] = src_argv[src_argc];
+        src_argv[src_argc] = 0;
+    }
+    return newargv;
+}
+
 static int
 extra_dpdk_args(const char *ovs_extra_config, char ***argv, int argc)
 {
@@ -2796,9 +2807,21 @@ extra_dpdk_args(const char *ovs_extra_config, char ***argv, int argc)
     return ret;
 }
 
+static bool
+argv_contains(char **argv_haystack, const size_t argc_haystack,
+              const char *needle)
+{
+    for (size_t i = 0; i < argc_haystack; ++i) {
+        if (!strcmp(argv_haystack[i], needle))
+            return true;
+    }
+    return false;
+}
+
 static int
 construct_dpdk_options(const struct ovsrec_open_vswitch *ovs_cfg,
-                       char ***argv, const int initial_size)
+                       char ***argv, const int initial_size,
+                       char **extra_args, const size_t extra_argc)
 {
     struct dpdk_options_map {
         const char *ovs_configuration;
@@ -2821,8 +2844,13 @@ construct_dpdk_options(const struct ovsrec_open_vswitch *ovs_cfg,
         }
 
         if (lookup) {
-            dpdk_option_extend(argv, ret, opts[i].dpdk_option, lookup);
-            ret += 2;
+            if (!argv_contains(extra_args, extra_argc, opts[i].dpdk_option)) {
+                dpdk_option_extend(argv, ret, opts[i].dpdk_option, lookup);
+                ret += 2;
+            } else {
+                VLOG_WARN("Ignoring database defined option '%s' due to "
+                          "dpdk_extras config", opts[i].dpdk_option);
+            }
         }
     }
 
@@ -2833,7 +2861,8 @@ construct_dpdk_options(const struct ovsrec_open_vswitch *ovs_cfg,
 
 static int
 construct_dpdk_mutex_options(const struct ovsrec_open_vswitch *ovs_cfg,
-                             char ***argv, const int initial_size)
+                             char ***argv, const int initial_size,
+                             char **extra_args, const size_t extra_argc)
 {
     struct dpdk_exclusive_options_map {
         const char *category;
@@ -2881,9 +2910,15 @@ construct_dpdk_mutex_options(const struct ovsrec_open_vswitch *ovs_cfg,
                      popt->category);
         }
 
-        dpdk_option_extend(argv, ret, popt->eal_dpdk_options[found_pos],
-                           found_value);
-        ret += 2;
+        if (!argv_contains(extra_args, extra_argc,
+                           popt->eal_dpdk_options[found_pos])) {
+            dpdk_option_extend(argv, ret, popt->eal_dpdk_options[found_pos],
+                               found_value);
+            ret += 2;
+        } else {
+            VLOG_WARN("Ignoring database defined option '%s' due to "
+                      "dpdk_extras config", popt->eal_dpdk_options[found_pos]);
+        }
     }
 
     return ret;
@@ -2894,14 +2929,23 @@ get_dpdk_args(const struct ovsrec_open_vswitch *ovs_cfg, char ***argv,
               int argc)
 {
     const char *extra_configuration;
-    int i = construct_dpdk_options(ovs_cfg, argv, argc);
-    i = construct_dpdk_mutex_options(ovs_cfg, argv, i);
+    char **extra_args = NULL;
+    int i;
+    size_t extra_argc = 0;
 
     extra_configuration = smap_get(&ovs_cfg->other_config, "dpdk-extra");
     if (extra_configuration) {
-        i = extra_dpdk_args(extra_configuration, argv, i);
+        extra_argc = extra_dpdk_args(extra_configuration, &extra_args, 0);
     }
-    return i;
+
+    i = construct_dpdk_options(ovs_cfg, argv, argc, extra_args, extra_argc);
+    i = construct_dpdk_mutex_options(ovs_cfg, argv, i, extra_args, extra_argc);
+
+    if (extra_configuration) {
+        *argv = move_argv(argv, i, extra_args, extra_argc);
+    }
+
+    return i + extra_argc;
 }
 
 static char **dpdk_argv;
-- 
2.5.5



More information about the dev mailing list