On 14/12/15 17:35, Traynor, Kevin wrote:
How about letting the control threads just float on the non-isolcpu'd cores. We could then potentially remove the -c argument which would simplify setup as the user would only need to think about one mask - pmd-cpu-mask (which of course we could also default). Strawman for it would be something like this...
Seems good, assuming that the thread affinity at the time dpdk_init() was called reflects what cores are allowed for non-PMD threads. And what if the user wants to change that later?
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index e3a0771..031f405 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -2135,12 +2135,15 @@ process_vhost_flags(char *flag, char *default_val, int size, int dpdk_init(int argc, char **argv) { int result; int base = 0; char *pragram_name = argv[0]; + int err; + int isset; + cpu_set_t cpuset; if (argc < 2 || strcmp(argv[1], "--dpdk")) return 0; /* Remove the --dpdk argument from arg list.*/ argc--; @@ -2176,23 +2179,51 @@ dpdk_init(int argc, char **argv) */ argc -= 2; argv += 2; /* Increment by two to bypass the vhost flag arguments */ base = 2; } + /*NOTE: Assumes -c option removed from cmdline/db etc. */ + + /* Get the main thread affinity */ + CPU_ZERO(&cpuset); + err = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (err) { + VLOG_ERR("Thread getaffinity error %d",err); + return err; + } + + /* Extract lowest core affinity and set the -c */ + for (i = 0; i < CPU_SETSIZE; i++) { + isset = CPU_ISSET(i, &cpuset); + if (isset) { + /* TODO: check for any numa inconsistencies with memory and embedded -c + * option in argv for rte_eal_init() */ + break; + } + } + /* Keep the program name argument as this is needed for call to * rte_eal_init() */ argv[0] = pragram_name; /* Make sure things are initialized ... */ result = rte_eal_init(argc, argv); if (result < 0) { ovs_abort(result, "Cannot init EAL"); } + /* Set the main thread affinity back to pre rte_eal_init() value */ + err = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (err) { + VLOG_ERR("Thread setaffinity error %d",err); + return err; + }
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev