diff mbox

[05/11] api: cpumask: added default masks

Message ID 1436449585-23252-6-git-send-email-maxim.uvarov@linaro.org
State Accepted
Commit f97e134e3c599d03d56dd6a9820442374ef2f5a3
Headers show

Commit Message

Maxim Uvarov July 9, 2015, 1:46 p.m. UTC
From: Petri Savolainen <petri.savolainen@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.savolainen@nokia.com>
Reviewed-by: Christophe Milard <christophe.milard@linaro.org>
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
---
 include/odp/api/cpumask.h            | 24 +++++++++++++++++++++++
 platform/linux-generic/odp_cpumask.c | 38 ++++++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+)
diff mbox

Patch

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;
+}