On 3 February 2017 at 07:59, Sorin Vultureanu <sorin.vulture...@enea.com> wrote: > Hi Mike, > > My understanding is that you want to remove helper lib, so I have some points > why that would be a bad idea:
Not remove helpers, just remove the unused linux spcific API, the abstract one will remain. > > 1. We use these helpers as abstraction layer. The fact that you remove them > will add load to change things in OFP. Probably, we will be forced to reuse > your deleted code as it provides some abstractization ! That code is still > required to run on a platform. We use that abstractization that is right for > us and we will be forced to invent other abstractization if you remove yours > (if not reuse your code). But you are not useing the abstraction, you are using the original linux only API I think. > > 2. I strongly believe ODP should provide this process/thread abstractization > as the ODP application should be portable! (be it in main ODP lib, or as is > now in helper lib) It does, but you are not calling the abstract API I think > > 3. Backward compatibility of code and design (at major or concept level). > This means that you can't really remove things and expect ODP developers to > be happy with your design changes or the lack of commitment to maintain > backward compatibility of any API. Indeed, and at the same time we have to evolve and move towards a more cloud friendly configuration, thus the old API was made a compile option, I am thinking now that a lib to support th old api can remian, but I dont think it has a place in the general test/example/perfromance metrics applications, they all use the abstract helper api. > > So in conclusion, my point of view is that you need to make or keep some > concept of process/thread that are generic and still have multiple > implementations. > > I have added Janne and Jere that might have a different point of view, from > OFP perspective. > > BR, > Sorin Vultureanu > Software Engineer > Linux R&D > Email sorin.vulture...@enea.com > Phone +40 723.651.943 > > www.enea.com > > > > This message, including attachments, is CONFIDENTIAL. It may also be > privileged or otherwise protected by law. If you received this email by > mistake please let us know by reply and then delete it from your system; you > should not copy it or disclose its contents to anyone. All messages sent to > and from Enea may be monitored to ensure compliance with internal policies > and to protect our business. Emails are not secure and cannot be guaranteed > to be error free as they can be intercepted, a mended, lost or destroyed, or > contain viruses. The sender therefore does not accept liability for any > errors or omissions in the contents of this message, which arise as a result > of email transmission. Anyone who communicates with us by email accepts these > risks. > > >> -----Original Message----- >> From: Mike Holmes [mailto:mike.hol...@linaro.org] >> Sent: Friday, February 03, 2017 2:41 PM >> To: Christophe Milard <christophe.mil...@linaro.org> >> Cc: Petri Savolainen <petri.savolai...@linaro.org>; LNG ODP Mailman List >> <lng-odp@lists.linaro.org>; Sorin Vultureanu <sorin.vulture...@enea.com> >> Subject: Re: [lng-odp] [PATCH 1/2] helper: linux: renamed threads_extn to >> linux helpers >> >> On 3 February 2017 at 07:28, Christophe Milard >> <christophe.mil...@linaro.org> wrote: >> > On 3 February 2017 at 12:23, Petri Savolainen >> > <petri.savolai...@linaro.org> wrote: >> >> There's no platform specific helpers. Helpers may depend on >> >> Linux and make it easier to do common series of Linux system >> >> calls. These kind of helpers are grouped into helper/linux >> >> directory. >> > >> > This is getting really confusing to me! Haven't we defined a >> > "platform" as being a couple {OS, HW}? That is any change in this >> > couple makes a new platform... >> > If we hold to this definition, then linux-helpers becomes platform >> > helpers... >> > Now, my humble opinion is that no-one is using these linux-only >> > helpers and no one ever will unless to enforce their usage by example >> > that people could copy/paste: why would a programmer want to replace a >> > well known linux system call by an ODP helper call? to save a for >> > loop?. >> > We are hitting the same usual problem of lack of proper definition for >> > things, but in this special case, my proposal is called "deletion". >> > :-) >> > >> >> CC Sorin, I think OFP may be using them, but I am not sure that it >> needs to, if OFP wants to be Linux specific its not hard to call >> pthreads etc yourself. >> >> Have we established that these are not better off as tested examples / >> docs rather than actually in a helpers lib. Given that we do not use >> them in odp-linux at all it feels that they are just clutter. >> >> Another angle is that maybe this problem is due to having the tests >> for all platforms and OS'es in the same repo as a specific linux >> implimentation, perhaps with the tests all moved out it becomes much >> clearer and odp-linux the implimentation is free to be entirely Linux >> centric becasue the tests will use the agnostic API in a separate repo >> >> I am glad that we are finally digging though the helpers to get them right >> >> >> > Christophe >> > >> >> >> >> Use --enable-helper-linux configuration option to enable >> >> support for Linux helpers. >> >> >> >> Signed-off-by: Petri Savolainen <petri.savolai...@linaro.org> >> >> --- >> >> configure.ac | 17 +- >> >> example/Makefile.inc | 2 +- >> >> helper/Makefile.am | 18 +- >> >> helper/include/odp/helper/linux/process.h | 84 ++++++ >> >> helper/include/odp/helper/linux/pthread.h | 66 +++++ >> >> .../helper/platform/linux-generic/threads_extn.h | 112 -------- >> >> helper/linux/thread.c | 239 ++++++++++++++++ >> >> helper/m4/configure.m4 | 8 +- >> >> helper/platform/linux-generic/thread.c | 313 >> >> --------------------- >> >> helper/test/.gitignore | 1 + >> >> helper/test/Makefile.am | 9 +- >> >> helper/test/linux-generic/Makefile.am | 5 - >> >> helper/test/linux-generic/process.c | 92 ------ >> >> helper/test/linux-generic/thread.c | 87 ------ >> >> helper/test/linux/Makefile.am | 5 + >> >> helper/test/linux/process.c | 93 ++++++ >> >> helper/test/linux/pthread.c | 87 ++++++ >> >> test/Makefile.inc | 2 +- >> >> test/common_plat/validation/api/Makefile.inc | 2 +- >> >> test/linux-generic/Makefile.inc | 2 +- >> >> 20 files changed, 599 insertions(+), 645 deletions(-) >> >> create mode 100644 helper/include/odp/helper/linux/process.h >> >> create mode 100644 helper/include/odp/helper/linux/pthread.h >> >> delete mode 100644 helper/include/odp/helper/platform/linux- >> generic/threads_extn.h >> >> create mode 100644 helper/linux/thread.c >> >> delete mode 100644 helper/platform/linux-generic/thread.c >> >> delete mode 100644 helper/test/linux-generic/Makefile.am >> >> delete mode 100644 helper/test/linux-generic/process.c >> >> delete mode 100644 helper/test/linux-generic/thread.c >> >> create mode 100644 helper/test/linux/Makefile.am >> >> create mode 100644 helper/test/linux/process.c >> >> create mode 100644 helper/test/linux/pthread.c >> >> >> >> diff --git a/configure.ac b/configure.ac >> >> index daa9b31..b672a1a 100644 >> >> --- a/configure.ac >> >> +++ b/configure.ac >> >> @@ -138,18 +138,6 @@ AC_SUBST([with_platform]) >> >> AC_SUBST([platform_with_platform], ["platform/${with_platform}"]) >> >> >> >> >> ########################################################## >> ################ >> >> -# Determine which helper platform to build for >> >> - >> ########################################################## >> ################ >> >> -AC_ARG_WITH([helper_platform], >> >> - [AS_HELP_STRING([--with-helper_platform=platform], >> >> - [select helper platform to be used, default linux-generic])], >> >> - [], >> >> - [with_helper_platform=${with_platform} >> >> - ]) >> >> - >> >> -AC_SUBST([with_helper_platform]) >> >> - >> >> - >> ########################################################## >> ################ >> >> # Run platform specific checks and settings >> >> >> ########################################################## >> ################ >> >> IMPLEMENTATION_NAME="" >> >> @@ -214,7 +202,7 @@ AM_CONDITIONAL([test_example], [test >> x$test_example = xyes ]) >> >> AM_CONDITIONAL([HAVE_DOXYGEN], [test "x${DOXYGEN}" = >> "xdoxygen"]) >> >> AM_CONDITIONAL([user_guide], [test "x${user_guides}" = "xyes" ]) >> >> AM_CONDITIONAL([HAVE_MSCGEN], [test "x${MSCGEN}" = >> "xmscgen"]) >> >> -AM_CONDITIONAL([helper_extn], [test x$helper_extn = xyes ]) >> >> +AM_CONDITIONAL([helper_linux], [test x$helper_linux = xyes ]) >> >> >> >> >> ########################################################## >> ################ >> >> # Setup doxygen documentation >> >> @@ -345,8 +333,7 @@ AC_MSG_RESULT([ >> >> implementation_name: ${IMPLEMENTATION_NAME} >> >> ARCH_DIR ${ARCH_DIR} >> >> with_platform: ${with_platform} >> >> - with_helper_platform: ${with_helper_platform} >> >> - helper_extn: ${helper_extn} >> >> + helper_linux: ${helper_linux} >> >> prefix: ${prefix} >> >> sysconfdir: ${sysconfdir} >> >> libdir: ${libdir} >> >> diff --git a/example/Makefile.inc b/example/Makefile.inc >> >> index ea596d5..70e3758 100644 >> >> --- a/example/Makefile.inc >> >> +++ b/example/Makefile.inc >> >> @@ -1,6 +1,6 @@ >> >> include $(top_srcdir)/platform/@with_platform@/Makefile.inc >> >> LIB = $(top_builddir)/lib >> >> -LDADD = $(LIB)/libodp-linux.la $(LIB)/libodphelper- >> @with_helper_platform@.la >> >> +LDADD = $(LIB)/libodp-linux.la $(LIB)/libodphelper.la >> >> AM_CFLAGS += \ >> >> -I$(srcdir) \ >> >> -I$(top_srcdir)/example \ >> >> diff --git a/helper/Makefile.am b/helper/Makefile.am >> >> index d484679..9b6e3ce 100644 >> >> --- a/helper/Makefile.am >> >> +++ b/helper/Makefile.am >> >> @@ -30,16 +30,18 @@ helperinclude_HEADERS = \ >> >> $(srcdir)/include/odp/helper/threads.h \ >> >> $(srcdir)/include/odp/helper/udp.h >> >> >> >> -if helper_extn >> >> -helperinclude_HEADERS += \ >> >> - >> $(srcdir)/include/odp/helper/platform/@with_helper_platform@/threads_ >> extn.h >> >> +if helper_linux >> >> +helperlinuxincludedir = $(includedir)/odp/helper/linux >> >> +helperlinuxinclude_HEADERS = \ >> >> + $(srcdir)/include/odp/helper/linux/pthread.h \ >> >> + $(srcdir)/include/odp/helper/linux/process.h >> >> endif >> >> >> >> noinst_HEADERS = \ >> >> $(srcdir)/odph_debug.h \ >> >> $(srcdir)/odph_list_internal.h >> >> >> >> -__LIB__libodphelper_@with_platform@_la_SOURCES = \ >> >> +__LIB__libodphelper_la_SOURCES = \ >> >> eth.c \ >> >> ip.c \ >> >> chksum.c \ >> >> @@ -49,9 +51,9 @@ >> __LIB__libodphelper_@with_platform@_la_SOURCES = \ >> >> iplookuptable.c \ >> >> threads.c >> >> >> >> -if helper_extn >> >> -__LIB__libodphelper_@with_platform@_la_SOURCES += \ >> >> - >> >> platform/@with_helper_platform@/thread.c >> >> +if helper_linux >> >> +__LIB__libodphelper_la_SOURCES += \ >> >> + linux/thread.c >> >> endif >> >> >> >> -lib_LTLIBRARIES = $(LIB)/libodphelper-@with_platform@.la >> >> +lib_LTLIBRARIES = $(LIB)/libodphelper.la >> >> diff --git a/helper/include/odp/helper/linux/process.h >> b/helper/include/odp/helper/linux/process.h >> >> new file mode 100644 >> >> index 0000000..9d74146 >> >> --- /dev/null >> >> +++ b/helper/include/odp/helper/linux/process.h >> >> @@ -0,0 +1,84 @@ >> >> +/* Copyright (c) 2017, Linaro Limited >> >> + * All rights reserved. >> >> + * >> >> + * SPDX-License-Identifier: BSD-3-Clause >> >> + */ >> >> + >> >> +/** >> >> + * @file >> >> + * >> >> + * ODP Linux helper for processes >> >> + * >> >> + * This file is not part of ODP APIs, but can be optionally used to ease >> common >> >> + * setups in a Linux system. User is free to implement the same setups in >> >> + * otherways (not via this file). >> >> + */ >> >> + >> >> +#ifndef ODPH_LINUX_PROCESS_H_ >> >> +#define ODPH_LINUX_PROCESS_H_ >> >> + >> >> +#include <odp/helper/threads.h> >> >> + >> >> +#ifdef __cplusplus >> >> +extern "C" { >> >> +#endif >> >> + >> >> +/** @ingroup odph_linux >> >> + * @{ >> >> + */ >> >> + >> >> +/** >> >> + * 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); >> >> + >> >> +/** >> >> + * @} >> >> + */ >> >> + >> >> +#ifdef __cplusplus >> >> +} >> >> +#endif >> >> + >> >> +#endif >> >> diff --git a/helper/include/odp/helper/linux/pthread.h >> b/helper/include/odp/helper/linux/pthread.h >> >> new file mode 100644 >> >> index 0000000..feeda5e >> >> --- /dev/null >> >> +++ b/helper/include/odp/helper/linux/pthread.h >> >> @@ -0,0 +1,66 @@ >> >> +/* Copyright (c) 2017, Linaro Limited >> >> + * All rights reserved. >> >> + * >> >> + * SPDX-License-Identifier: BSD-3-Clause >> >> + */ >> >> + >> >> +/** >> >> + * @file >> >> + * >> >> + * ODP Linux helper for pthreads >> >> + * >> >> + * This file is not part of ODP APIs, but can be optionally used to ease >> common >> >> + * setups in a Linux system. User is free to implement the same setups in >> >> + * otherways (not via this file). >> >> + */ >> >> + >> >> +#ifndef ODPH_LINUX_PTHREAD_H_ >> >> +#define ODPH_LINUX_PTHREAD_H_ >> >> + >> >> +#include <odp/helper/threads.h> >> >> + >> >> +#ifdef __cplusplus >> >> +extern "C" { >> >> +#endif >> >> + >> >> +/** @ingroup odph_linux >> >> + * @{ >> >> + */ >> >> + >> >> +/** >> >> + * 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); >> >> + >> >> +/** >> >> + * @} >> >> + */ >> >> + >> >> +#ifdef __cplusplus >> >> +} >> >> +#endif >> >> + >> >> +#endif >> >> diff --git a/helper/include/odp/helper/platform/linux- >> generic/threads_extn.h b/helper/include/odp/helper/platform/linux- >> generic/threads_extn.h >> >> deleted file mode 100644 >> >> index 1d4036d..0000000 >> >> --- a/helper/include/odp/helper/platform/linux-generic/threads_extn.h >> >> +++ /dev/null >> >> @@ -1,112 +0,0 @@ >> >> -/* Copyright (c) 2016, Linaro Limited >> >> - * All rights reserved. >> >> - * >> >> - * SPDX-License-Identifier: BSD-3-Clause >> >> - */ >> >> - >> >> -/** >> >> - * @file >> >> - * >> >> - * ODP Linux helper extension 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_EXT_H_ >> >> -#define ODPH_LINUX_EXT_H_ >> >> - >> >> -#include <odp/helper/threads.h> >> >> - >> >> -#ifdef __cplusplus >> >> -extern "C" { >> >> -#endif >> >> - >> >> -/** @addtogroup odph_linux ODPH LINUX >> >> - * @{ >> >> - */ >> >> - >> >> -/** >> >> - * 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); >> >> - >> >> -/** >> >> - * @} >> >> - */ >> >> - >> >> -#ifdef __cplusplus >> >> -} >> >> -#endif >> >> - >> >> -#endif >> >> diff --git a/helper/linux/thread.c b/helper/linux/thread.c >> >> new file mode 100644 >> >> index 0000000..52d4efc >> >> --- /dev/null >> >> +++ b/helper/linux/thread.c >> >> @@ -0,0 +1,239 @@ >> >> +/* Copyright (c) 2016, Linaro Limited >> >> + * All rights reserved. >> >> + * >> >> + * SPDX-License-Identifier: BSD-3-Clause >> >> + */ >> >> + >> >> +#ifndef _GNU_SOURCE >> >> +#define _GNU_SOURCE >> >> +#endif >> >> +#include <sched.h> >> >> +#include <unistd.h> >> >> +#include <sys/types.h> >> >> +#include <sys/wait.h> >> >> +#include <sys/prctl.h> >> >> +#include <sys/syscall.h> >> >> + >> >> +#include <stdlib.h> >> >> +#include <string.h> >> >> +#include <stdio.h> >> >> +#include <stdbool.h> >> >> + >> >> +#include <odp_api.h> >> >> +#include <odp/helper/linux/pthread.h> >> >> +#include <odp/helper/linux/process.h> >> >> +#include "odph_debug.h" >> >> + >> >> +static void *_odph_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"); >> >> + >> >> + 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, >> >> + _odph_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; >> >> +} >> >> diff --git a/helper/m4/configure.m4 b/helper/m4/configure.m4 >> >> index 38c95d9..343f5e3 100644 >> >> --- a/helper/m4/configure.m4 >> >> +++ b/helper/m4/configure.m4 >> >> @@ -12,11 +12,11 @@ AC_ARG_ENABLE([test-helper], >> >> # Enable/disable helper-ext >> >> # platform specific non portable extensions >> >> >> ########################################################## >> ################ >> >> -helper_extn=no >> >> -AC_ARG_ENABLE([helper-extn], >> >> - [ --enable-helper-extn build helper platform extensions (not >> portable)], >> >> +helper_linux=no >> >> +AC_ARG_ENABLE([helper-linux], >> >> + [ --enable-helper-linux build helper platform extensions >> >> (not >> portable)], >> >> [if test "x$enableval" = "xyes"; then >> >> - helper_extn=yes >> >> + helper_linux=yes >> >> fi]) >> >> >> >> AC_CONFIG_FILES([helper/Makefile >> >> diff --git a/helper/platform/linux-generic/thread.c >> b/helper/platform/linux-generic/thread.c >> >> deleted file mode 100644 >> >> index 90fa42a..0000000 >> >> --- a/helper/platform/linux-generic/thread.c >> >> +++ /dev/null >> >> @@ -1,313 +0,0 @@ >> >> -/* Copyright (c) 2016, Linaro Limited >> >> - * All rights reserved. >> >> - * >> >> - * SPDX-License-Identifier: BSD-3-Clause >> >> - */ >> >> - >> >> -#ifndef _GNU_SOURCE >> >> -#define _GNU_SOURCE >> >> -#endif >> >> -#include <sched.h> >> >> -#include <unistd.h> >> >> -#include <sys/types.h> >> >> -#include <sys/wait.h> >> >> -#include <sys/prctl.h> >> >> -#include <sys/syscall.h> >> >> - >> >> -#include <stdlib.h> >> >> -#include <string.h> >> >> -#include <stdio.h> >> >> -#include <stdbool.h> >> >> - >> >> -#include <odp_api.h> >> >> -#include <odp/helper/platform/linux-generic/threads_extn.h> >> >> -#include "odph_debug.h" >> >> - >> >> -static void *_odph_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"); >> >> - >> >> - return ret_ptr; >> >> -} >> >> - >> >> -static void *_odph_thread_run_start_routine(void *arg) >> >> -{ >> >> - int status; >> >> - int ret; >> >> - odph_odpthread_params_t *thr_params; >> >> - >> >> - odph_odpthread_start_args_t *start_args = arg; >> >> - >> >> - thr_params = &start_args->thr_params; >> >> - >> >> - /* ODP thread local init */ >> >> - if (odp_init_local(thr_params->instance, thr_params->thr_type)) { >> >> - ODPH_ERR("Local init failed\n"); >> >> - if (start_args->linuxtype == ODPTHREAD_PROCESS) >> >> - _exit(EXIT_FAILURE); >> >> - return (void *)-1; >> >> - } >> >> - >> >> - ODPH_DBG("helper: ODP %s thread started as linux %s. (pid=%d)\n", >> >> - thr_params->thr_type == ODP_THREAD_WORKER ? >> >> - "worker" : "control", >> >> - (start_args->linuxtype == ODPTHREAD_PTHREAD) ? >> >> - "pthread" : "process", >> >> - (int)getpid()); >> >> - >> >> - status = thr_params->start(thr_params->arg); >> >> - ret = odp_term_local(); >> >> - >> >> - if (ret < 0) >> >> - ODPH_ERR("Local term failed\n"); >> >> - >> >> - /* for process implementation of odp threads, just return >> >> status... */ >> >> - if (start_args->linuxtype == ODPTHREAD_PROCESS) >> >> - _exit(status); >> >> - >> >> - /* threads implementation return void* pointers: cast status to >> >> that. >> */ >> >> - return (void *)(intptr_t)status; >> >> -} >> >> - >> >> -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, >> >> - _odph_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; >> >> -} >> >> - >> >> -/* >> >> - * Create a single ODPthread as a linux thread >> >> - */ >> >> -static int odph_linux_thread_create(odph_odpthread_t *thread_tbl, >> >> - int cpu, >> >> - const odph_odpthread_params_t >> >> *thr_params) >> >> -{ >> >> - int ret; >> >> - cpu_set_t cpu_set; >> >> - >> >> - CPU_ZERO(&cpu_set); >> >> - CPU_SET(cpu, &cpu_set); >> >> - >> >> - pthread_attr_init(&thread_tbl->thread.attr); >> >> - >> >> - thread_tbl->cpu = cpu; >> >> - >> >> - pthread_attr_setaffinity_np(&thread_tbl->thread.attr, >> >> - sizeof(cpu_set_t), &cpu_set); >> >> - >> >> - thread_tbl->start_args.thr_params = *thr_params; /* copy */ >> >> - thread_tbl->start_args.linuxtype = ODPTHREAD_PTHREAD; >> >> - >> >> - ret = pthread_create(&thread_tbl->thread.thread_id, >> >> - &thread_tbl->thread.attr, >> >> - _odph_thread_run_start_routine, >> >> - &thread_tbl->start_args); >> >> - if (ret != 0) { >> >> - ODPH_ERR("Failed to start thread on cpu #%d\n", cpu); >> >> - thread_tbl->start_args.linuxtype = ODPTHREAD_NOT_STARTED; >> >> - return ret; >> >> - } >> >> - >> >> - return 0; >> >> -} >> >> diff --git a/helper/test/.gitignore b/helper/test/.gitignore >> >> index e5b6a0f..1a81e00 100644 >> >> --- a/helper/test/.gitignore >> >> +++ b/helper/test/.gitignore >> >> @@ -8,3 +8,4 @@ parse >> >> process >> >> table >> >> thread >> >> +pthread >> >> diff --git a/helper/test/Makefile.am b/helper/test/Makefile.am >> >> index 1c50282..99b6df8 100644 >> >> --- a/helper/test/Makefile.am >> >> +++ b/helper/test/Makefile.am >> >> @@ -5,12 +5,11 @@ LIB = $(top_builddir)/lib >> >> #in the following line, the libs using the symbols should come before >> >> #the libs containing them! The includer is given a chance to add things >> >> #before libodp by setting PRE_LDADD before the inclusion. >> >> -LDADD = $(PRE_LDADD) $(LIB)/libodphelper- >> @with_helper_platform@.la $(LIB)/libodp-linux.la >> >> +LDADD = $(PRE_LDADD) $(LIB)/libodphelper.la $(LIB)/libodp-linux.la >> >> >> >> INCFLAGS = \ >> >> -I$(top_builddir)/platform/@with_platform@/include \ >> >> -I$(top_srcdir)/helper/include \ >> >> - -I$(top_srcdir)/helper/platform/@with_helper_platform@/include \ >> >> -I$(top_srcdir)/include \ >> >> -I$(top_srcdir)/platform/@with_platform@/include \ >> >> -I$(top_builddir)/include \ >> >> @@ -31,9 +30,9 @@ EXECUTABLES = chksum$(EXEEXT) \ >> >> #They are a convenience to app writers who have chosen to >> >> #restrict their application to Linux. >> >> >> >> -if helper_extn >> >> -EXECUTABLES += @with_helper_platform@/thread$(EXEEXT) \ >> >> - @with_helper_platform@/process$(EXEEXT) >> >> +if helper_linux >> >> +EXECUTABLES += linux/pthread$(EXEEXT) \ >> >> + linux/process$(EXEEXT) >> >> endif >> >> >> >> COMPILE_ONLY = odpthreads >> >> diff --git a/helper/test/linux-generic/Makefile.am b/helper/test/linux- >> generic/Makefile.am >> >> deleted file mode 100644 >> >> index 28d54a8..0000000 >> >> --- a/helper/test/linux-generic/Makefile.am >> >> +++ /dev/null >> >> @@ -1,5 +0,0 @@ >> >> - >> >> -thread_LDADD = $(LIB)/libodphelper-@with_helper_platform@.la >> $(LIB)/libodp-linux.la >> >> -dist_thread_SOURCES = thread.c >> >> -dist_process_SOURCES = process.c >> >> -process_LDADD = $(LIB)/libodphelper-@with_helper_platform@.la >> $(LIB)/libodp-linux.la >> >> diff --git a/helper/test/linux-generic/process.c b/helper/test/linux- >> generic/process.c >> >> deleted file mode 100644 >> >> index f9bdc3e..0000000 >> >> --- a/helper/test/linux-generic/process.c >> >> +++ /dev/null >> >> @@ -1,92 +0,0 @@ >> >> -/* Copyright (c) 2015, Linaro Limited >> >> - * All rights reserved. >> >> - * >> >> - * SPDX-License-Identifier: BSD-3-Clause >> >> - */ >> >> - >> >> -#include <odph_debug.h> >> >> -#include <odp_api.h> >> >> -#include <odp/helper/platform/linux-generic/threads_extn.h> >> >> - >> >> -#define NUMBER_WORKERS 16 /* 0 = max */ >> >> - >> >> -static void *worker_fn(void *arg ODPH_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 ODPH_UNUSED, char *argv[] ODPH_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)) { >> >> - ODPH_ERR("Error: ODP global init failed.\n"); >> >> - exit(EXIT_FAILURE); >> >> - } >> >> - >> >> - if (odp_init_local(instance, ODP_THREAD_CONTROL)) { >> >> - ODPH_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) { >> >> - ODPH_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)) { >> >> - ODPH_ERR("Error: ODP global term failed.\n"); >> >> - exit(EXIT_FAILURE); >> >> - } >> >> - } >> >> - >> >> - return 0; >> >> -} >> >> diff --git a/helper/test/linux-generic/thread.c b/helper/test/linux- >> generic/thread.c >> >> deleted file mode 100644 >> >> index 919f00e..0000000 >> >> --- a/helper/test/linux-generic/thread.c >> >> +++ /dev/null >> >> @@ -1,87 +0,0 @@ >> >> -/* Copyright (c) 2015, Linaro Limited >> >> - * All rights reserved. >> >> - * >> >> - * SPDX-License-Identifier: BSD-3-Clause >> >> - */ >> >> - >> >> -#include <odph_debug.h> >> >> -#include <odp_api.h> >> >> -#include <odp/helper/platform/linux-generic/threads_extn.h> >> >> - >> >> -#define NUMBER_WORKERS 16 >> >> -static void *worker_fn(void *arg ODPH_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 ODPH_UNUSED, char *argv[] ODPH_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)) { >> >> - ODPH_ERR("Error: ODP global init failed.\n"); >> >> - exit(EXIT_FAILURE); >> >> - } >> >> - >> >> - if (odp_init_local(instance, ODP_THREAD_CONTROL)) { >> >> - ODPH_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()) { >> >> - ODPH_ERR("Error: ODP local term failed.\n"); >> >> - exit(EXIT_FAILURE); >> >> - } >> >> - >> >> - if (odp_term_global(instance)) { >> >> - ODPH_ERR("Error: ODP global term failed.\n"); >> >> - exit(EXIT_FAILURE); >> >> - } >> >> - >> >> - return 0; >> >> -} >> >> diff --git a/helper/test/linux/Makefile.am >> b/helper/test/linux/Makefile.am >> >> new file mode 100644 >> >> index 0000000..f95e04d >> >> --- /dev/null >> >> +++ b/helper/test/linux/Makefile.am >> >> @@ -0,0 +1,5 @@ >> >> + >> >> +thread_LDADD = $(LIB)/libodphelper.la $(LIB)/libodp-linux.la >> >> +dist_thread_SOURCES = pthread.c >> >> +dist_process_SOURCES = process.c >> >> +process_LDADD = $(LIB)/libodphelper.la $(LIB)/libodp-linux.la >> >> diff --git a/helper/test/linux/process.c b/helper/test/linux/process.c >> >> new file mode 100644 >> >> index 0000000..e08ef86 >> >> --- /dev/null >> >> +++ b/helper/test/linux/process.c >> >> @@ -0,0 +1,93 @@ >> >> +/* Copyright (c) 2015, Linaro Limited >> >> + * All rights reserved. >> >> + * >> >> + * SPDX-License-Identifier: BSD-3-Clause >> >> + */ >> >> + >> >> +#include <odph_debug.h> >> >> +#include <odp_api.h> >> >> +#include <odp/helper/linux/pthread.h> >> >> +#include <odp/helper/linux/process.h> >> >> + >> >> +#define NUMBER_WORKERS 16 /* 0 = max */ >> >> + >> >> +static void *worker_fn(void *arg ODPH_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 ODPH_UNUSED, char *argv[] ODPH_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)) { >> >> + ODPH_ERR("Error: ODP global init failed.\n"); >> >> + exit(EXIT_FAILURE); >> >> + } >> >> + >> >> + if (odp_init_local(instance, ODP_THREAD_CONTROL)) { >> >> + ODPH_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) { >> >> + ODPH_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)) { >> >> + ODPH_ERR("Error: ODP global term failed.\n"); >> >> + exit(EXIT_FAILURE); >> >> + } >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> diff --git a/helper/test/linux/pthread.c b/helper/test/linux/pthread.c >> >> new file mode 100644 >> >> index 0000000..2bec0d1 >> >> --- /dev/null >> >> +++ b/helper/test/linux/pthread.c >> >> @@ -0,0 +1,87 @@ >> >> +/* Copyright (c) 2015, Linaro Limited >> >> + * All rights reserved. >> >> + * >> >> + * SPDX-License-Identifier: BSD-3-Clause >> >> + */ >> >> + >> >> +#include <odph_debug.h> >> >> +#include <odp_api.h> >> >> +#include <odp/helper/linux/pthread.h> >> >> + >> >> +#define NUMBER_WORKERS 16 >> >> +static void *worker_fn(void *arg ODPH_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 ODPH_UNUSED, char *argv[] ODPH_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)) { >> >> + ODPH_ERR("Error: ODP global init failed.\n"); >> >> + exit(EXIT_FAILURE); >> >> + } >> >> + >> >> + if (odp_init_local(instance, ODP_THREAD_CONTROL)) { >> >> + ODPH_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()) { >> >> + ODPH_ERR("Error: ODP local term failed.\n"); >> >> + exit(EXIT_FAILURE); >> >> + } >> >> + >> >> + if (odp_term_global(instance)) { >> >> + ODPH_ERR("Error: ODP global term failed.\n"); >> >> + exit(EXIT_FAILURE); >> >> + } >> >> + >> >> + return 0; >> >> +} >> >> diff --git a/test/Makefile.inc b/test/Makefile.inc >> >> index 243a616..1ad5d3a 100644 >> >> --- a/test/Makefile.inc >> >> +++ b/test/Makefile.inc >> >> @@ -4,7 +4,7 @@ LIB = $(top_builddir)/lib >> >> #in the following line, the libs using the symbols should come before >> >> #the libs containing them! The includer is given a chance to add things >> >> #before libodp by setting PRE_LDADD before the inclusion. >> >> -LDADD = $(PRE_LDADD) $(LIB)/libodphelper- >> @with_helper_platform@.la $(LIB)/libodp-linux.la >> >> +LDADD = $(PRE_LDADD) $(LIB)/libodphelper.la $(LIB)/libodp-linux.la >> >> >> >> INCFLAGS = \ >> >> -I$(top_builddir)/platform/@with_platform@/include \ >> >> diff --git a/test/common_plat/validation/api/Makefile.inc >> b/test/common_plat/validation/api/Makefile.inc >> >> index a0afd26..dda18ad 100644 >> >> --- a/test/common_plat/validation/api/Makefile.inc >> >> +++ b/test/common_plat/validation/api/Makefile.inc >> >> @@ -13,4 +13,4 @@ AM_LDFLAGS += -static >> >> LIBCUNIT_COMMON = $(COMMON_DIR)/libcunit_common.la >> >> LIBCPUMASK_COMMON = $(COMMON_DIR)/libcpumask_common.la >> >> LIBTHRMASK_COMMON = $(COMMON_DIR)/libthrmask_common.la >> >> -LIBODP = $(LIB)/libodphelper-@with_helper_platform@.la $(LIB)/libodp- >> linux.la >> >> +LIBODP = $(LIB)/libodphelper.la $(LIB)/libodp-linux.la >> >> diff --git a/test/linux-generic/Makefile.inc b/test/linux- >> generic/Makefile.inc >> >> index 2a49076..4b88b43 100644 >> >> --- a/test/linux-generic/Makefile.inc >> >> +++ b/test/linux-generic/Makefile.inc >> >> @@ -6,7 +6,7 @@ AM_LDFLAGS += -static >> >> >> >> LIBCUNIT_COMMON = >> $(top_builddir)/test/common_plat/common/libcunit_common.la >> >> LIB = $(top_builddir)/lib >> >> -LIBODP = $(LIB)/libodphelper-@with_helper_platform@.la $(LIB)/libodp- >> linux.la >> >> +LIBODP = $(LIB)/libodphelper.la $(LIB)/libodp-linux.la >> >> >> >> INCCUNIT_COMMON = -I$(top_srcdir)/test/common_plat/common >> >> INCODP = \ >> >> -- >> >> 2.8.1 >> >> >> >> >> >> -- >> Mike Holmes >> Program Manager - Linaro Networking Group >> Linaro.org │ Open source software for ARM SoCs >> "Work should be fun and collaborative, the rest follows" -- Mike Holmes Program Manager - Linaro Networking Group Linaro.org │ Open source software for ARM SoCs "Work should be fun and collaborative, the rest follows"