From: Petri Savolainen <petri.savolai...@nokia.com>

Added default cpumask functions for worker and control threads.
These will replace odph_linux_cpumask_default() helper. CPU masks
and IDs are system specific, API is generic.

Signed-off-by: Petri Savolainen <petri.savolai...@nokia.com>
Reviewed-by: Christophe Milard <christophe.mil...@linaro.org>
Signed-off-by: Maxim Uvarov <maxim.uva...@linaro.org>
---
 include/odp/api/cpumask.h            | 24 +++++++++++++++++++++++
 platform/linux-generic/odp_cpumask.c | 38 ++++++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+)

diff --git a/include/odp/api/cpumask.h b/include/odp/api/cpumask.h
index 1fdbfb4..02fd131 100644
--- a/include/odp/api/cpumask.h
+++ b/include/odp/api/cpumask.h
@@ -194,6 +194,30 @@ int odp_cpumask_last(const odp_cpumask_t *mask);
 int odp_cpumask_next(const odp_cpumask_t *mask, int cpu);
 
 /**
+ * Default cpumask for worker threads
+ *
+ * Initializes cpumask with CPUs available for worker threads. Sets up to 'num'
+ * CPUs and returns the count actually set. Use zero for all available CPUs.
+ *
+ * @param[out] mask      CPU mask to initialize
+ * @param      num       Number of worker threads, zero for all available CPUs
+ * @return Actual number of CPUs used to create the mask
+ */
+int odp_cpumask_def_worker(odp_cpumask_t *mask, int num);
+
+/**
+ * Default cpumask for control threads
+ *
+ * Initializes cpumask with CPUs available for control threads. Sets up to 
'num'
+ * CPUs and returns the count actually set. Use zero for all available CPUs.
+ *
+ * @param[out] mask      CPU mask to initialize
+ * @param      num       Number of control threads, zero for all available CPUs
+ * @return Actual number of CPUs used to create the mask
+ */
+int odp_cpumask_def_control(odp_cpumask_t *mask, int num);
+
+/**
  * @}
  */
 
diff --git a/platform/linux-generic/odp_cpumask.c 
b/platform/linux-generic/odp_cpumask.c
index a89c3b6..1ea7dcb 100644
--- a/platform/linux-generic/odp_cpumask.c
+++ b/platform/linux-generic/odp_cpumask.c
@@ -8,6 +8,7 @@
 #define _GNU_SOURCE
 #endif
 #include <sched.h>
+#include <pthread.h>
 
 #include <odp/cpumask.h>
 #include <odp_debug_internal.h>
@@ -204,3 +205,40 @@ int odp_cpumask_next(const odp_cpumask_t *mask, int cpu)
                        return cpu;
        return -1;
 }
+
+int odp_cpumask_def_worker(odp_cpumask_t *mask, int num)
+{
+       int ret, cpu, i;
+       cpu_set_t cpuset;
+
+       ret = pthread_getaffinity_np(pthread_self(),
+                                    sizeof(cpu_set_t), &cpuset);
+       if (ret != 0)
+               ODP_ABORT("failed to read CPU affinity value\n");
+
+       odp_cpumask_zero(mask);
+
+       /*
+        * If no user supplied number or it's too large, then attempt
+        * to use all CPUs
+        */
+       if (0 == num || CPU_SETSIZE < num)
+               num = CPU_COUNT(&cpuset);
+
+       /* build the mask, allocating down from highest numbered CPU */
+       for (cpu = 0, i = CPU_SETSIZE - 1; i >= 0 && cpu < num; --i) {
+               if (CPU_ISSET(i, &cpuset)) {
+                       odp_cpumask_set(mask, i);
+                       cpu++;
+               }
+       }
+
+       return cpu;
+}
+
+int odp_cpumask_def_control(odp_cpumask_t *mask, int num ODP_UNUSED)
+{
+       /* By default all control threads on CPU 0 */
+       odp_cpumask_set(mask, 0);
+       return 1;
+}
-- 
1.9.1

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to