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

Reply via email to