did you use -M option to format-patch? Maxim.
On 12/12/16 17:52, Mike Holmes wrote: > Signed-off-by: Mike Holmes <mike.hol...@linaro.org> > --- > helper/Makefile.am | 2 +- > helper/include/odp/helper/threads.h | 83 +------------- > helper/test/Makefile.am | 6 - > helper/test/process.c | 92 --------------- > helper/test/thread.c | 87 --------------- > helper/{linux.c => thread.c} | 216 > ------------------------------------ > 6 files changed, 5 insertions(+), 481 deletions(-) > delete mode 100644 helper/test/process.c > delete mode 100644 helper/test/thread.c > rename helper/{linux.c => thread.c} (70%) > > diff --git a/helper/Makefile.am b/helper/Makefile.am > index 2153d70..942dd60 100644 > --- a/helper/Makefile.am > +++ b/helper/Makefile.am > @@ -35,7 +35,7 @@ __LIB__libodphelper_linux_la_SOURCES = \ > eth.c \ > ip.c \ > chksum.c \ > - linux.c \ > + thread.c \ > hashtable.c \ > lineartable.c > > diff --git a/helper/include/odp/helper/threads.h > b/helper/include/odp/helper/threads.h > index 238bcf8..7c4b68a 100644 > --- a/helper/include/odp/helper/threads.h > +++ b/helper/include/odp/helper/threads.h > @@ -8,15 +8,15 @@ > /** > * @file > * > - * ODP Linux helper API > + * ODP thread helper API > * > * This file is an optional helper to odp.h APIs. These functions are > provided > * to ease common setups in a Linux system. User is free to implement the > same > * setups in otherways (not via this API). > */ > > -#ifndef ODPH_LINUX_H_ > -#define ODPH_LINUX_H_ > +#ifndef ODPH_THREAD_H_ > +#define ODPH_THREAD_H_ > > #ifdef __cplusplus > extern "C" { > @@ -28,7 +28,7 @@ extern "C" { > #include <getopt.h> > #include <sys/types.h> > > -/** @addtogroup odph_linux ODPH LINUX > +/** @addtogroup odph_linux ODPH THREAD > * @{ > */ > > @@ -94,81 +94,6 @@ typedef struct { > }; > } odph_odpthread_t; > > -/** > - * Creates and launches pthreads > - * > - * Creates, pins and launches threads to separate CPU's based on the cpumask. > - * > - * @param[out] pthread_tbl Table of pthread state information records. Table > - * must have at least as many entries as there are > - * CPUs in the CPU mask. > - * @param mask CPU mask > - * @param thr_params Linux helper thread parameters > - * > - * @return Number of threads created > - */ > -int odph_linux_pthread_create(odph_linux_pthread_t *pthread_tbl, > - const odp_cpumask_t *mask, > - const odph_linux_thr_params_t *thr_params); > - > -/** > - * Waits pthreads to exit > - * > - * Returns when all threads have been exit. > - * > - * @param thread_tbl Thread table > - * @param num Number of threads to create > - * > - */ > -void odph_linux_pthread_join(odph_linux_pthread_t *thread_tbl, int num); > - > -/** > - * Fork a process > - * > - * Forks and sets CPU affinity for the child process. Ignores 'start' and > 'arg' > - * thread parameters. > - * > - * @param[out] proc Pointer to process state info (for output) > - * @param cpu Destination CPU for the child process > - * @param thr_params Linux helper thread parameters > - * > - * @return On success: 1 for the parent, 0 for the child > - * On failure: -1 for the parent, -2 for the child > - */ > -int odph_linux_process_fork(odph_linux_process_t *proc, int cpu, > - const odph_linux_thr_params_t *thr_params); > - > - > -/** > - * Fork a number of processes > - * > - * Forks and sets CPU affinity for child processes. Ignores 'start' and 'arg' > - * thread parameters. > - * > - * @param[out] proc_tbl Process state info table (for output) > - * @param mask CPU mask of processes to create > - * @param thr_params Linux helper thread parameters > - * > - * @return On success: 1 for the parent, 0 for the child > - * On failure: -1 for the parent, -2 for the child > - */ > -int odph_linux_process_fork_n(odph_linux_process_t *proc_tbl, > - const odp_cpumask_t *mask, > - const odph_linux_thr_params_t *thr_params); > - > - > -/** > - * Wait for a number of processes > - * > - * Waits for a number of child processes to terminate. Records process state > - * change status into the process state info structure. > - * > - * @param proc_tbl Process state info table (previously filled by fork) > - * @param num Number of processes to wait > - * > - * @return 0 on success, -1 on failure > - */ > -int odph_linux_process_wait_n(odph_linux_process_t *proc_tbl, int num); > > /** > * Creates and launches odpthreads (as linux threads or processes) > diff --git a/helper/test/Makefile.am b/helper/test/Makefile.am > index 545db73..361e45d 100644 > --- a/helper/test/Makefile.am > +++ b/helper/test/Makefile.am > @@ -6,9 +6,7 @@ AM_LDFLAGS += -static > TESTS_ENVIRONMENT += TEST_DIR=${builddir} > > EXECUTABLES = chksum$(EXEEXT) \ > - thread$(EXEEXT) \ > parse$(EXEEXT)\ > - process$(EXEEXT)\ > table$(EXEEXT) > > COMPILE_ONLY = odpthreads > @@ -29,9 +27,5 @@ EXTRA_DIST = odpthreads_as_processes odpthreads_as_pthreads > dist_chksum_SOURCES = chksum.c > dist_odpthreads_SOURCES = odpthreads.c > odpthreads_LDADD = $(LIB)/libodphelper-linux.la $(LIB)/libodp-linux.la > -dist_thread_SOURCES = thread.c > -thread_LDADD = $(LIB)/libodphelper-linux.la $(LIB)/libodp-linux.la > -dist_process_SOURCES = process.c > dist_parse_SOURCES = parse.c > -process_LDADD = $(LIB)/libodphelper-linux.la $(LIB)/libodp-linux.la > dist_table_SOURCES = table.c > diff --git a/helper/test/process.c b/helper/test/process.c > deleted file mode 100644 > index 0e04224..0000000 > --- a/helper/test/process.c > +++ /dev/null > @@ -1,92 +0,0 @@ > -/* Copyright (c) 2015, Linaro Limited > - * All rights reserved. > - * > - * SPDX-License-Identifier: BSD-3-Clause > - */ > - > -#include <test_debug.h> > -#include <odp_api.h> > -#include <odp/helper/linux.h> > - > -#define NUMBER_WORKERS 16 /* 0 = max */ > - > -static void *worker_fn(void *arg TEST_UNUSED) > -{ > - /* depend on the odp helper to call odp_init_local */ > - printf("Worker thread on CPU %d\n", odp_cpu_id()); > - > - return 0; > -} > - > -/* Create additional dataplane processes */ > -int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED) > -{ > - odp_cpumask_t cpu_mask; > - int num_workers; > - int cpu; > - char cpumaskstr[ODP_CPUMASK_STR_SIZE]; > - int ret; > - odph_linux_process_t proc[NUMBER_WORKERS]; > - odp_instance_t instance; > - odph_linux_thr_params_t thr_params; > - > - if (odp_init_global(&instance, NULL, NULL)) { > - LOG_ERR("Error: ODP global init failed.\n"); > - exit(EXIT_FAILURE); > - } > - > - if (odp_init_local(instance, ODP_THREAD_CONTROL)) { > - LOG_ERR("Error: ODP local init failed.\n"); > - exit(EXIT_FAILURE); > - } > - > - /* discover how many processes this system can support */ > - num_workers = odp_cpumask_default_worker(&cpu_mask, NUMBER_WORKERS); > - if (num_workers < NUMBER_WORKERS) { > - printf("System can only support %d processes and not the %d > requested\n", > - num_workers, NUMBER_WORKERS); > - } > - > - /* generate a summary for the user */ > - (void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr)); > - printf("default cpu mask: %s\n", cpumaskstr); > - printf("default num worker processes: %i\n", num_workers); > - > - cpu = odp_cpumask_first(&cpu_mask); > - printf("the first CPU: %i\n", cpu); > - > - /* reserve cpu 0 for the control plane so remove it from > - * the default mask */ > - odp_cpumask_clr(&cpu_mask, 0); > - num_workers = odp_cpumask_count(&cpu_mask); > - (void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr)); > - printf("new cpu mask: %s\n", cpumaskstr); > - printf("new num worker processes: %i\n\n", num_workers); > - > - memset(&thr_params, 0, sizeof(thr_params)); > - thr_params.thr_type = ODP_THREAD_WORKER; > - thr_params.instance = instance; > - > - /* Fork worker processes */ > - ret = odph_linux_process_fork_n(proc, &cpu_mask, &thr_params); > - > - if (ret < 0) { > - LOG_ERR("Fork workers failed %i\n", ret); > - return -1; > - } > - > - if (ret == 0) { > - /* Child process */ > - worker_fn(NULL); > - } else { > - /* Parent process */ > - odph_linux_process_wait_n(proc, num_workers); > - > - if (odp_term_global(instance)) { > - LOG_ERR("Error: ODP global term failed.\n"); > - exit(EXIT_FAILURE); > - } > - } > - > - return 0; > -} > diff --git a/helper/test/thread.c b/helper/test/thread.c > deleted file mode 100644 > index 8268d9f..0000000 > --- a/helper/test/thread.c > +++ /dev/null > @@ -1,87 +0,0 @@ > -/* Copyright (c) 2015, Linaro Limited > - * All rights reserved. > - * > - * SPDX-License-Identifier: BSD-3-Clause > - */ > - > -#include <test_debug.h> > -#include <odp_api.h> > -#include <odp/helper/linux.h> > - > -#define NUMBER_WORKERS 16 > -static void *worker_fn(void *arg TEST_UNUSED) > -{ > - /* depend on the odp helper to call odp_init_local */ > - > - printf("Worker thread on CPU %d\n", odp_cpu_id()); > - > - /* depend on the odp helper to call odp_term_local */ > - > - return NULL; > -} > - > -/* Create additional dataplane threads */ > -int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED) > -{ > - odph_linux_pthread_t thread_tbl[NUMBER_WORKERS]; > - odp_cpumask_t cpu_mask; > - int num_workers; > - int cpu; > - char cpumaskstr[ODP_CPUMASK_STR_SIZE]; > - odp_instance_t instance; > - odph_linux_thr_params_t thr_params; > - > - if (odp_init_global(&instance, NULL, NULL)) { > - LOG_ERR("Error: ODP global init failed.\n"); > - exit(EXIT_FAILURE); > - } > - > - if (odp_init_local(instance, ODP_THREAD_CONTROL)) { > - LOG_ERR("Error: ODP local init failed.\n"); > - exit(EXIT_FAILURE); > - } > - > - /* discover how many threads this system can support */ > - num_workers = odp_cpumask_default_worker(&cpu_mask, NUMBER_WORKERS); > - if (num_workers < NUMBER_WORKERS) { > - printf("System can only support %d threads and not the %d > requested\n", > - num_workers, NUMBER_WORKERS); > - } > - > - /* generate a summary for the user */ > - (void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr)); > - printf("default cpu mask: %s\n", cpumaskstr); > - printf("default num worker threads: %i\n", num_workers); > - > - cpu = odp_cpumask_first(&cpu_mask); > - printf("the first CPU: %i\n", cpu); > - > - /* reserve cpu 0 for the control plane so remove it from > - * the default mask */ > - odp_cpumask_clr(&cpu_mask, 0); > - num_workers = odp_cpumask_count(&cpu_mask); > - (void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr)); > - printf("new cpu mask: %s\n", cpumaskstr); > - printf("new num worker threads: %i\n\n", num_workers); > - > - memset(&thr_params, 0, sizeof(thr_params)); > - thr_params.start = worker_fn; > - thr_params.arg = NULL; > - thr_params.thr_type = ODP_THREAD_WORKER; > - thr_params.instance = instance; > - > - odph_linux_pthread_create(&thread_tbl[0], &cpu_mask, &thr_params); > - odph_linux_pthread_join(thread_tbl, num_workers); > - > - if (odp_term_local()) { > - LOG_ERR("Error: ODP local term failed.\n"); > - exit(EXIT_FAILURE); > - } > - > - if (odp_term_global(instance)) { > - LOG_ERR("Error: ODP global term failed.\n"); > - exit(EXIT_FAILURE); > - } > - > - return 0; > -} > diff --git a/helper/linux.c b/helper/thread.c > similarity index 70% > rename from helper/linux.c > rename to helper/thread.c > index d5215c2..f946f5a 100644 > --- a/helper/linux.c > +++ b/helper/thread.c > @@ -27,222 +27,6 @@ static struct { > int proc; /* true when process mode is required, false otherwise */ > } helper_options; > > -static void *odp_run_start_routine(void *arg) > -{ > - odph_linux_thr_params_t *thr_params = arg; > - > - /* ODP thread local init */ > - if (odp_init_local(thr_params->instance, thr_params->thr_type)) { > - ODPH_ERR("Local init failed\n"); > - return NULL; > - } > - > - void *ret_ptr = thr_params->start(thr_params->arg); > - int ret = odp_term_local(); > - > - if (ret < 0) > - ODPH_ERR("Local term failed\n"); > - else if (ret == 0 && odp_term_global(thr_params->instance)) > - ODPH_ERR("Global term failed\n"); > - > - return ret_ptr; > -} > - > -int odph_linux_pthread_create(odph_linux_pthread_t *pthread_tbl, > - const odp_cpumask_t *mask, > - const odph_linux_thr_params_t *thr_params) > -{ > - int i; > - int num; > - int cpu_count; > - int cpu; > - int ret; > - > - num = odp_cpumask_count(mask); > - > - memset(pthread_tbl, 0, num * sizeof(odph_linux_pthread_t)); > - > - cpu_count = odp_cpu_count(); > - > - if (num < 1 || num > cpu_count) { > - ODPH_ERR("Invalid number of threads:%d (%d cores available)\n", > - num, cpu_count); > - return 0; > - } > - > - cpu = odp_cpumask_first(mask); > - for (i = 0; i < num; i++) { > - cpu_set_t cpu_set; > - > - CPU_ZERO(&cpu_set); > - CPU_SET(cpu, &cpu_set); > - > - pthread_attr_init(&pthread_tbl[i].attr); > - > - pthread_tbl[i].cpu = cpu; > - > - pthread_attr_setaffinity_np(&pthread_tbl[i].attr, > - sizeof(cpu_set_t), &cpu_set); > - > - pthread_tbl[i].thr_params.start = thr_params->start; > - pthread_tbl[i].thr_params.arg = thr_params->arg; > - pthread_tbl[i].thr_params.thr_type = thr_params->thr_type; > - pthread_tbl[i].thr_params.instance = thr_params->instance; > - > - ret = pthread_create(&pthread_tbl[i].thread, > - &pthread_tbl[i].attr, > - odp_run_start_routine, > - &pthread_tbl[i].thr_params); > - if (ret != 0) { > - ODPH_ERR("Failed to start thread on cpu #%d\n", cpu); > - break; > - } > - > - cpu = odp_cpumask_next(mask, cpu); > - } > - > - return i; > -} > - > -void odph_linux_pthread_join(odph_linux_pthread_t *thread_tbl, int num) > -{ > - int i; > - int ret; > - > - for (i = 0; i < num; i++) { > - /* Wait thread to exit */ > - ret = pthread_join(thread_tbl[i].thread, NULL); > - if (ret != 0) { > - ODPH_ERR("Failed to join thread from cpu #%d\n", > - thread_tbl[i].cpu); > - } > - pthread_attr_destroy(&thread_tbl[i].attr); > - } > -} > - > -int odph_linux_process_fork_n(odph_linux_process_t *proc_tbl, > - const odp_cpumask_t *mask, > - const odph_linux_thr_params_t *thr_params) > -{ > - pid_t pid; > - int num; > - int cpu_count; > - int cpu; > - int i; > - > - num = odp_cpumask_count(mask); > - > - memset(proc_tbl, 0, num * sizeof(odph_linux_process_t)); > - > - cpu_count = odp_cpu_count(); > - > - if (num < 1 || num > cpu_count) { > - ODPH_ERR("Bad num\n"); > - return -1; > - } > - > - cpu = odp_cpumask_first(mask); > - for (i = 0; i < num; i++) { > - cpu_set_t cpu_set; > - > - CPU_ZERO(&cpu_set); > - CPU_SET(cpu, &cpu_set); > - > - pid = fork(); > - > - if (pid < 0) { > - ODPH_ERR("fork() failed\n"); > - return -1; > - } > - > - /* Parent continues to fork */ > - if (pid > 0) { > - proc_tbl[i].pid = pid; > - proc_tbl[i].cpu = cpu; > - > - cpu = odp_cpumask_next(mask, cpu); > - continue; > - } > - > - /* Child process */ > - > - /* Request SIGTERM if parent dies */ > - prctl(PR_SET_PDEATHSIG, SIGTERM); > - /* Parent died already? */ > - if (getppid() == 1) > - kill(getpid(), SIGTERM); > - > - if (sched_setaffinity(0, sizeof(cpu_set_t), &cpu_set)) { > - ODPH_ERR("sched_setaffinity() failed\n"); > - return -2; > - } > - > - if (odp_init_local(thr_params->instance, > - thr_params->thr_type)) { > - ODPH_ERR("Local init failed\n"); > - return -2; > - } > - > - return 0; > - } > - > - return 1; > -} > - > -int odph_linux_process_fork(odph_linux_process_t *proc, int cpu, > - const odph_linux_thr_params_t *thr_params) > -{ > - odp_cpumask_t mask; > - > - odp_cpumask_zero(&mask); > - odp_cpumask_set(&mask, cpu); > - return odph_linux_process_fork_n(proc, &mask, thr_params); > -} > - > -int odph_linux_process_wait_n(odph_linux_process_t *proc_tbl, int num) > -{ > - pid_t pid; > - int i, j; > - int status = 0; > - > - for (i = 0; i < num; i++) { > - pid = wait(&status); > - > - if (pid < 0) { > - ODPH_ERR("wait() failed\n"); > - return -1; > - } > - > - for (j = 0; j < num; j++) { > - if (proc_tbl[j].pid == pid) { > - proc_tbl[j].status = status; > - break; > - } > - } > - > - if (j == num) { > - ODPH_ERR("Bad pid:%d\n", (int)pid); > - return -1; > - } > - > - /* Examine the child process' termination status */ > - if (WIFEXITED(status) && WEXITSTATUS(status) != EXIT_SUCCESS) { > - ODPH_ERR("Child exit status:%d (pid:%d)\n", > - WEXITSTATUS(status), (int)pid); > - return -1; > - } > - if (WIFSIGNALED(status)) { > - int signo = WTERMSIG(status); > - > - ODPH_ERR("Child term signo:%d - %s (pid:%d)\n", > - signo, strsignal(signo), (int)pid); > - return -1; > - } > - } > - > - return 0; > -} > - > /* > * wrapper for odpthreads, either implemented as linux threads or processes. > * (in process mode, if start_routine returns NULL, the process return > FAILURE). >