@@ -173,6 +173,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.
@@ -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:
@@ -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"
@@ -2774,6 +2775,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)
{
@@ -2871,8 +2889,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;
}
@@ -2979,6 +3003,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) {
@@ -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="",
@@ -287,6 +287,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>