The user has control over the DPDK internal lcore coremask, but this parameter can be autofilled with a bit more intelligence. If the user does not fill this parameter in, we use the lowest set bit in the current task CPU affinity.
Signed-off-by: Aaron Conole <acon...@redhat.com> Cc: Kevin Traynor <kevin.tray...@intel.com> --- lib/netdev-dpdk.c | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 2a81058..696430f 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -65,6 +65,8 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); #define OVS_CACHE_LINE_SIZE CACHE_LINE_SIZE #define OVS_VPORT_DPDK "ovs_dpdk" +#define MAX_BUFSIZ 256 + /* * need to reserve tons of extra space in the mbufs so we can align the * DMA addresses to 4KB. @@ -2147,7 +2149,8 @@ grow_argv(char ***argv, size_t cur_siz, size_t grow_by) } static int -get_dpdk_args(const struct ovsrec_open_vswitch *ovs_cfg, char ***argv) +get_dpdk_args(const struct ovsrec_open_vswitch *ovs_cfg, char ***argv, + int argc) { struct dpdk_options_map { const char *ovs_configuration; @@ -2155,13 +2158,13 @@ get_dpdk_args(const struct ovsrec_open_vswitch *ovs_cfg, char ***argv) bool default_enabled; const char *default_value; } opts[] = { - {"dpdk_lcore_mask", "-c", true, "0x1"}, + {"dpdk_lcore_mask", "-c", false, NULL}, {"dpdk_mem_channels", "-n", true, "4"}, {"dpdk_alloc_mem", "-m", false, NULL}, {"dpdk_socket_mem", "--socket-mem", true, "1024,0"}, {"dpdk_hugepage_dir", "--huge-dir", false, NULL}, }; - int i, ret = 1; + int i, ret = argc; for(i = 0; i < (sizeof(opts) / sizeof(opts[0])); ++i) { const char *lookup = smap_get(&ovs_cfg->other_config, @@ -2203,7 +2206,8 @@ __dpdk_init(const struct ovsrec_open_vswitch *ovs_cfg) { char **argv = NULL; int result; - int argc; + int argc = 0, argc_tmp; + bool auto_determine = true; int err; cpu_set_t cpuset; @@ -2236,12 +2240,41 @@ __dpdk_init(const struct ovsrec_open_vswitch *ovs_cfg) ovs_abort(0, "Thread getaffinity error %d.", err); } - argv = grow_argv(&argv, 0, 1); + argv = grow_argv(&argv, argc, argc+1); if (!argv) { ovs_abort(0, "Unable to allocate an initial argv."); } - argv[0] = strdup("ovs"); /* TODO use prctl to get process name */ - argc = get_dpdk_args(ovs_cfg, &argv); + argv[argc++] = strdup("ovs"); /* TODO use prctl to get process name */ + + argc_tmp = get_dpdk_args(ovs_cfg, &argv, argc); + + while(argc_tmp != argc) { + if (!strcmp("-c", argv[argc++])) { + auto_determine = false; + } + } + + /** + * NOTE: This is an unsophisticated mechanism for determining the DPDK + * lcore for the DPDK Master. + */ + if (auto_determine) + { + int i; + for (i = 0; i < CPU_SETSIZE; i++) { + if (CPU_ISSET(i, &cpuset)) { + char buf[MAX_BUFSIZ]; + snprintf(buf, MAX_BUFSIZ, "0x%08llX", (1ULL<<i)); + argv = grow_argv(&argv, argc, argc+2); + if (!argv) { + ovs_abort(0, "Unable to grow argv for coremask"); + } + argv[argc++] = strdup("-c"); + argv[argc++] = strdup(buf); + i = CPU_SETSIZE; + } + } + } argv = grow_argv(&argv, argc, argc+1); if (!argv) { -- 2.6.1.133.gf5b6079 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev