> -----Original Message-----
> From: Aaron Conole [mailto:[email protected]]
> Sent: Friday, December 18, 2015 6:28 PM
> To: [email protected]
> Cc: Flavio Leitner; Traynor, Kevin
> Subject: [PATCH 3/5] netdev-dpdk: Autofill lcore coremask if absent
>
> 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 <[email protected]>
> Cc: Kevin Traynor <[email protected]>
> ---
> 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)
> + {
coding std if {
> + int i;
> + for (i = 0; i < CPU_SETSIZE; i++) {
> + if (CPU_ISSET(i, &cpuset)) {
I had been thinking we could put in a check here to ensure that the
core we have selected is suitable for the socket-mem but I'm not sure
if it's really needed. We could always add it later, it won't change
the user interface.
> + 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
[email protected]
http://openvswitch.org/mailman/listinfo/dev