]> git.proxmox.com Git - mirror_ovs.git/commitdiff
netdev-dpdk: Allow arbitrary eal arguments
authorAaron Conole <aconole@redhat.com>
Fri, 29 Apr 2016 17:44:04 +0000 (13:44 -0400)
committerDaniele Di Proietto <diproiettod@vmware.com>
Fri, 29 Apr 2016 22:07:39 +0000 (15:07 -0700)
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@redhat.com>
Tested-by: Sean K Mooney <sean.k.mooney@intel.com>
Tested-by: RobertX Wojciechowicz <robertx.wojciechowicz@intel.com>
Tested-by: Kevin Traynor <kevin.traynor@intel.com>
Acked-by: Panu Matilainen <pmatilai@redhat.com>
Acked-by: Kevin Traynor <kevin.traynor@intel.com>
Acked-by: Flavio Leitner <fbl@sysclose.org>
Acked-by: Daniele Di Proietto <diproiettod@vmware.com>
INSTALL.DPDK.md
NEWS
lib/netdev-dpdk.c
utilities/ovs-dev.py
vswitchd/vswitch.xml

index f8c59672f2bd3b2ffcff0fd95b2f21ca1d3389bb..38da3bce8c7c23077d8a31cd69102fb2eb25c206 100644 (file)
@@ -169,6 +169,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/NEWS b/NEWS
index c20b64c223d7664cdaa10801f5d8c7961dd81078..4e81cad38eb4310d802bb9c32c171a4a1ad0d52b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -30,7 +30,8 @@ Post-v2.5.0
      * Sensible defaults have been introduced for many of the required
        configuration options
      * DB entries have been added for many of the DPDK EAL command line
-       arguments
+       arguments. Additional arguments can be passed via the dpdk-extra
+       entry.
    - ovs-benchmark: This utility has been removed due to lack of use and
      bitrot.
    - ovs-appctl:
index 2207266e2a36db95427f0b71013db8d98c717939..db411030c0389039f3d631504d1eeb3135547bcc 100644 (file)
@@ -39,6 +39,7 @@
 #include "netdev-provider.h"
 #include "netdev-vport.h"
 #include "odp-util.h"
+#include "openvswitch/dynamic-string.h"
 #include "openvswitch/list.h"
 #include "openvswitch/ofp-print.h"
 #include "openvswitch/vlog.h"
@@ -2772,6 +2773,23 @@ dpdk_option_extend(char ***argv, int argc, const char *option,
     newargv[argc+1] = xstrdup(value);
 }
 
+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 smap *ovs_other_config,
                        char ***argv, const int initial_size)
@@ -2869,8 +2887,14 @@ static int
 get_dpdk_args(const struct smap *ovs_other_config, char ***argv,
               int argc)
 {
+    const char *extra_configuration;
     int i = construct_dpdk_options(ovs_other_config, argv, argc);
     i = construct_dpdk_mutex_options(ovs_other_config, argv, i);
+
+    extra_configuration = smap_get(ovs_other_config, "dpdk-extra");
+    if (extra_configuration) {
+        i = extra_dpdk_args(extra_configuration, argv, i);
+    }
     return i;
 }
 
@@ -2981,6 +3005,19 @@ dpdk_init__(const struct smap *ovs_other_config)
 
     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) {
index a74b528b139699fafd87dacae329ff454ccaa9ed..524f574ff09274f1a537ecf8cb6eb8c872f439be 100755 (executable)
@@ -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="",
index 400428bbcb7a9da8dfefcf4d6cde59e4e07e0350..944d8ec92d8443d86d018b982965eec94dd0edd7 100644 (file)
         </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>