[ovs-dev] [PATCH 6/8] netdev-dpdk: Allow arbitrary eal arguments

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


A previous change moved some commonly used arguments from commandline to
the database, and with it the ability to pass arbitrary arguments to
EAL. This change allows arbitrary eal arguments to be provided
via a new db entry 'other_config:dpdk-extra' which will tokenize the
string and add it to the argument list. The only argument which will not
be supported with this change is '--no-huge', which appears to break the
system in other ways.

Signed-off-by: Aaron Conole <aconole at redhat.com>
Tested-by: Sean K Mooney <sean.k.mooney at intel.com>
Tested-by: RobertX Wojciechowicz <robertx.wojciechowicz at intel.com>
Tested-by: Kevin Traynor <kevin.traynor at intel.com>
Acked-by: Panu Matilainen <pmatilai at redhat.com>
Acked-by: Kevin Traynor <kevin.traynor at intel.com>
Acked-by: Flavio Leitner <fbl at sysclose.org>
---
v4:
* Added by suggestion of Panu, making socket-mem non-default

v5:
* Keep the socket-mem as default parameter, and mention that we
  do not support --no-huge
* Update ovs-dev.py with the new mechanism for passing arbitrary dpdk
  options

v6->v9:
* No change

v10:
* INSTALL.DPDK.md - removed the note since a future commit in the series makes
  that documentation invalid (and it seems silly to add it here, only to remove
  in in the next commit)

v11:
* Restructured the arguments to a single line (using dynamic-string)
* Moved argument print to info level

 INSTALL.DPDK.md      |  5 +++++
 lib/netdev-dpdk.c    | 39 ++++++++++++++++++++++++++++++++++++++-
 utilities/ovs-dev.py |  7 +++++--
 vswitchd/vswitch.xml | 11 +++++++++++
 4 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/INSTALL.DPDK.md b/INSTALL.DPDK.md
index 73fc876..f37205f 100644
--- a/INSTALL.DPDK.md
+++ b/INSTALL.DPDK.md
@@ -178,6 +178,11 @@ Using the DPDK with ovs-vswitchd:
    * dpdk-hugepage-dir
    Directory where hugetlbfs is mounted
 
+   * dpdk-extra
+   Extra arguments to provide to DPDK EAL, as previously specified on the
+   command line. Do not pass '--no-huge' to the system in this way. Support
+   for running the system without hugepages is nonexistent.
+
    * cuse-dev-name
    Option to set the vhost_cuse character device name.
 
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index c84a2b8..b955cb8 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -51,6 +51,7 @@
 #include "unaligned.h"
 #include "timeval.h"
 #include "unixctl.h"
+#include "openvswitch/dynamic-string.h"
 #include "openvswitch/vlog.h"
 #include "vswitch-idl.h"
 
@@ -2779,6 +2780,23 @@ dpdk_option_extend(char ***argv, int argc, const char *option,
 }
 
 static int
+extra_dpdk_args(const char *ovs_extra_config, char ***argv, int argc)
+{
+    int ret = argc;
+    char *release_tok = xstrdup(ovs_extra_config);
+    char *tok = release_tok, *endptr = NULL;
+
+    for (tok = strtok_r(release_tok, " ", &endptr); tok != NULL;
+         tok = strtok_r(NULL, " ", &endptr)) {
+        char **newarg = grow_argv(argv, ret, 1);
+        *argv = newarg;
+        newarg[ret++] = xstrdup(tok);
+    }
+    free(release_tok);
+    return ret;
+}
+
+static int
 construct_dpdk_options(const struct ovsrec_open_vswitch *ovs_cfg,
                        char ***argv, const int initial_size)
 {
@@ -2875,8 +2893,14 @@ static int
 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);
+
+    extra_configuration = smap_get(&ovs_cfg->other_config, "dpdk-extra");
+    if (extra_configuration) {
+        i = extra_dpdk_args(extra_configuration, argv, i);
+    }
     return i;
 }
 
@@ -2899,7 +2923,7 @@ dpdk_init__(const struct ovsrec_open_vswitch *ovs_cfg)
 {
     char **argv = NULL;
     int result;
-    int argc, argc_tmp;
+    int argc = 0, argc_tmp;
     bool auto_determine = true;
     int err;
     cpu_set_t cpuset;
@@ -2974,6 +2998,19 @@ dpdk_init__(const struct ovsrec_open_vswitch *ovs_cfg)
 
     optind = 1;
 
+    if (VLOG_IS_INFO_ENABLED()) {
+        struct ds eal_args;
+        int opt;
+        ds_init(&eal_args);
+        ds_put_cstr(&eal_args, "EAL ARGS:");
+        for (opt = 0; opt < argc; ++opt) {
+            ds_put_cstr(&eal_args, " ");
+            ds_put_cstr(&eal_args, argv[opt]);
+        }
+        VLOG_INFO("%s", ds_cstr_ro(&eal_args));
+        ds_destroy(&eal_args);
+    }
+
     /* Make sure things are initialized ... */
     result = rte_eal_init(argc, argv);
     if (result < 0) {
diff --git a/utilities/ovs-dev.py b/utilities/ovs-dev.py
index a74b528..524f574 100755
--- a/utilities/ovs-dev.py
+++ b/utilities/ovs-dev.py
@@ -267,6 +267,8 @@ def run():
     if options.dpdk:
         _sh("ovs-vsctl --no-wait set Open_vSwitch %s " \
             "other_config:dpdk-init=true" % root_uuid)
+        _sh("ovs-vsctl --no-wait set Open_vSwitch %s other_config:" \
+            "dpdk-extra=\"%s\"" % (root_uuid, ' '.join(options.dpdk)))
     else:
         _sh("ovs-vsctl --no-wait set Open_vSwitch %s " \
             "other_config:dpdk-init=false" % root_uuid)
@@ -423,8 +425,9 @@ def main():
                      help="run ovs-vswitchd under gdb")
     group.add_option("--valgrind", dest="valgrind", action="store_true",
                      help="run ovs-vswitchd under valgrind")
-    group.add_option("--dpdk", dest="dpdk", action="store_true",
-                     help="run ovs-vswitchd with dpdk")
+    group.add_option("--dpdk", dest="dpdk", action="callback",
+                     callback=parse_subargs,
+                     help="run ovs-vswitchd with dpdk subopts (ended by --)")
     group.add_option("--clang", dest="clang", action="store_true",
                      help="Use binaries built by clang")
     group.add_option("--user", dest="user", action="store", default="",
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index 2a5f8fa..9ce3c3e 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -296,6 +296,17 @@
         </p>
       </column>
 
+      <column name="other_config" key="dpdk-extra"
+              type='{"type": "string"}'>
+        <p>
+          Specifies additional eal command line arguments for DPDK.
+        </p>
+        <p>
+          The default is empty. Changing this value requires restarting the
+          daemon
+        </p>
+      </column>
+
       <column name="other_config" key="cuse-dev-name"
               type='{"type": "string"}'>
         <p>
-- 
2.5.5



More information about the dev mailing list