aboutsummaryrefslogtreecommitdiff
path: root/helper/test
diff options
context:
space:
mode:
authorYi He <yi.he@linaro.org>2016-05-26 07:10:19 +0000
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-05-27 18:48:00 +0300
commit2fadf477f2fb029b025ff2d3fdd620ee0c951af1 (patch)
treee2c42be49f8352c1e9ee539b13b1453e34597c62 /helper/test
parent396543b63de5d85dfb02aa203d2d9bcc62118206 (diff)
helper: linux: odp thread cpu affinity APIs
Provide helper APIs to set and get cpu affinity in ODP threads, and set cpu affinity to the 1st available control cpu for all odp test/validation programs in odp_cunit_common library. Signed-off-by: Yi He <yi.he@linaro.org> Reviewed-by: Christophe Milard <christophe.milard@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'helper/test')
-rw-r--r--helper/test/odpthreads.c83
1 files changed, 73 insertions, 10 deletions
diff --git a/helper/test/odpthreads.c b/helper/test/odpthreads.c
index bba4fa5e3..3d20eaada 100644
--- a/helper/test/odpthreads.c
+++ b/helper/test/odpthreads.c
@@ -10,17 +10,50 @@
* the option passed to the program (--odph_proc, --odph_thread or both)
*/
+#include <unistd.h>
+#include <stdlib.h>
+
#include <test_debug.h>
#include <odp_api.h>
#include <odp/helper/linux.h>
#define NUMBER_WORKERS 16
+
+/* register odp_term_local/global() calls atexit() */
+static void main_exit(void);
+
+/* ODP application instance */
+static odp_instance_t odp_instance;
+
static int worker_fn(void *arg TEST_UNUSED)
{
+ int cpu;
+ odp_cpumask_t workers;
+
/* depend on the odp helper to call odp_init_local */
printf("Worker thread on CPU %d\n", odp_cpu_id());
+ /* verify CPU affinity was already set and among the
+ * allowed worker cpu
+ */
+ odp_cpumask_zero(&workers);
+ odp_cpumask_default_worker(&workers, NUMBER_WORKERS);
+
+ cpu = odph_odpthread_getaffinity();
+ if ((cpu < 0) || !odp_cpumask_isset(&workers, cpu)) {
+ printf("Worker thread(%d)'s CPU "
+ "affinity was invalid.\n", odp_cpu_id());
+ return -1;
+ }
+
+ /* verify helper API is workable by re-configure the same */
+ if (odph_odpthread_setaffinity(cpu) != 0) {
+ printf("Re-configure worker thread(%d)'s "
+ "CPU affinity failed.\n", odp_cpu_id());
+ return -1;
+ }
+
/* depend on the odp helper to call odp_term_local */
return 0;
@@ -29,28 +62,55 @@ static int worker_fn(void *arg TEST_UNUSED)
/* Create additional dataplane opdthreads */
int main(int argc, char *argv[])
{
- odp_instance_t instance;
odph_odpthread_params_t thr_params;
odph_odpthread_t thread_tbl[NUMBER_WORKERS];
odp_cpumask_t cpu_mask;
int num_workers;
- int cpu;
+ int cpu, affinity;
int ret;
char cpumaskstr[ODP_CPUMASK_STR_SIZE];
/* let helper collect its own arguments (e.g. --odph_proc) */
odph_parse_options(argc, argv, NULL, NULL);
- if (odp_init_global(&instance, NULL, NULL)) {
+ if (odp_init_global(&odp_instance, NULL, NULL)) {
LOG_ERR("Error: ODP global init failed.\n");
exit(EXIT_FAILURE);
}
- if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
+ if (odp_init_local(odp_instance, ODP_THREAD_CONTROL)) {
LOG_ERR("Error: ODP local init failed.\n");
exit(EXIT_FAILURE);
}
+ /* register termination callback */
+ atexit(main_exit);
+
+ odp_cpumask_zero(&cpu_mask);
+ /* allocate the 1st available control cpu to main process */
+ if (odp_cpumask_default_control(&cpu_mask, 1) != 1) {
+ LOG_ERR("Allocate main process CPU core failed.\n");
+ exit(EXIT_FAILURE);
+ }
+
+ cpu = odp_cpumask_first(&cpu_mask);
+ if (odph_odpthread_setaffinity(cpu) != 0) {
+ LOG_ERR("Set main process affinify to "
+ "cpu(%d) failed.\n", cpu);
+ exit(EXIT_FAILURE);
+ }
+
+ /* read back affinity to verify */
+ affinity = odph_odpthread_getaffinity();
+ if ((affinity < 0) || (cpu != affinity)) {
+ LOG_ERR("Verify main process affinity failed: "
+ "set(%d) read(%d).\n", cpu, affinity);
+ exit(EXIT_FAILURE);
+ }
+ cpu = 0;
+ affinity = 0;
+ odp_cpumask_zero(&cpu_mask);
+
/* discover how many opdthreads this system can support */
num_workers = odp_cpumask_default_worker(&cpu_mask, NUMBER_WORKERS);
if (num_workers < NUMBER_WORKERS) {
@@ -78,7 +138,7 @@ int main(int argc, char *argv[])
thr_params.start = worker_fn;
thr_params.arg = NULL;
thr_params.thr_type = ODP_THREAD_WORKER;
- thr_params.instance = instance;
+ thr_params.instance = odp_instance;
odph_odpthreads_create(&thread_tbl[0], &cpu_mask, &thr_params);
@@ -86,15 +146,18 @@ int main(int argc, char *argv[])
if (ret < 0)
exit(EXIT_FAILURE);
+ return 0;
+}
+
+static void main_exit(void)
+{
if (odp_term_local()) {
LOG_ERR("Error: ODP local term failed.\n");
- exit(EXIT_FAILURE);
+ _exit(EXIT_FAILURE);
}
- if (odp_term_global(instance)) {
+ if (odp_term_global(odp_instance)) {
LOG_ERR("Error: ODP global term failed.\n");
- exit(EXIT_FAILURE);
+ _exit(EXIT_FAILURE);
}
-
- return 0;
}