fixes for FreeBSD compilation
cover fixes for FreeBSD compilation
Bruce Richardson (2):
examples/performance-thread: fix FreeBSD compilation net/ark: fix FreeBSD compilation
drivers/net/ark/Makefile | 2 ++ examples/performance-thread/l3fwd-thread/main.c | 4 ++++ examples/performance-thread/pthread_shim/main.c | 4 ++++ examples/performance-thread/pthread_shim/pthread_shim.c | 15 +++++++++++++-- examples/performance-thread/pthread_shim/pthread_shim.h | 9 +++++++++ 5 files changed, 32 insertions(+), 2 deletions(-)
Signature · 1 line
2.11.0
PATCH 1/2 examples/performance-thread: fix FreeBSD compilation
This set of sample apps did not compile on FreeBSD due to use of a number of Linux/glibc-specific APIs, or APIs which existed in different headers on FreeBSD. Specifically, the following APIs has problems:
* sched_getcpu() is a glibc extension
* pthread_yield() returns int on Linux, but void on FreeBSD
* APIs for managing cpu affinity are in pthread_np.h on FreeBSD, rather than in pthread.h
* the type for managing cpu sets is cpuset_t on FreeBSD rather than cpu_set_t as on Linux.
--- examples/performance-thread/l3fwd-thread/main.c | 4 ++++ examples/performance-thread/pthread_shim/main.c | 4 ++++ examples/performance-thread/pthread_shim/pthread_shim.c | 15 +++++++++++++-- examples/performance-thread/pthread_shim/pthread_shim.h | 9 +++++++++ 4 files changed, 30 insertions(+), 2 deletions(-)
examples/performance-thread/l3fwd-thread/main.c +4 -0
@@ -90,6 +90,10 @@#define APP_LOOKUP_METHOD APP_LOOKUP_LPM#endif +#ifndef __GLIBC__/* sched_getcpu() is glibc specific */ +#define sched_getcpu () rte_lcore_id() +#endif +static int check_ptype (int portid) {
examples/performance-thread/pthread_shim/main.c +4 -0
@@ -59,6 +59,10 @@#define DEBUG_APP 0#define HELLOW_WORLD_MAX_LTHREADS 10 +#ifndef __GLIBC__/* sched_getcpu() is glibc-specific */ +#define sched_getcpu () rte_lcore_id() +#endif + __threadint print_count; __threadpthread_mutex_t print_lock;
examples/performance-thread/pthread_shim/pthread_shim.c +13 -2
@@ -576,15 +576,26 @@ int pthread_rwlock_wrlock(pthread_rwlock_t *a)return _sys_pthread_funcs.f_pthread_rwlock_wrlock (a); } -int pthread_yield (void ) +#ifdef RTE_EXEC_ENV_LINUXAPP +int +pthread_yield (void ) {if (override) {lthread_yield ();return 0 ; }return _sys_pthread_funcs.f_pthread_yield (); - } +#else +void +pthread_yield (void ) +{ +if (override) +lthread_yield (); +else + _sys_pthread_funcs.f_pthread_yield (); +} +#endif pthread_t pthread_self (void ) {
examples/performance-thread/pthread_shim/pthread_shim.h +9 -0
@@ -36,6 +36,15 @@#include <pthread.h> /* +* on BSD, the non-std calls are in pthread_np.h, +* and cpuset_t has only one "_" rather than two. +*/ +#ifdef RTE_EXEC_ENV_BSDAPP +#include <pthread_np.h> +#define cpu_set_t cpuset_t +#endif + +/* * This pthread shim is an example that demonstrates how legacy code * that makes use of POSIX pthread services can make use of lthreads * with reduced porting effort.
Signature · 1 line
2.11.0
Re: [dpdk-stable] [PATCH 1/2] examples/performance-thread: fix FreeBSD compilation
20/04/2017 18:32, Bruce Richardson:
Quoted 9 lines
This set of sample apps did not compile on FreeBSD due to use of a number of Linux/glibc-specific APIs, or APIs which existed in different headers on FreeBSD. Specifically, the following APIs has problems:
*sched_getcpu()is a glibc extension
*pthread_yield()returns int on Linux, but void on FreeBSD
* APIs for managing cpu affinity are inpthread_np.hon FreeBSD, rather than inpthread.h
* the type for managing cpu sets iscpuset_ton FreeBSD rather thancpu_set_tas on Linux.
It can be fixed by using rte_cpuset_t defined inlib/librte_eal/common/include/rte_lcore.h
PATCH 2/2 net/ark: fix FreeBSD compilation
In reply to Bruce RichardsonOn FreeBSD it's not necessary to use -ldl to link apps which use dlopen. This error only showed up with a shared library gcc build, not standard build using static libs.
--- drivers/net/ark/Makefile | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ark/Makefile +2 -0
@@ -59,6 +59,8 @@ SRCS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark_udm.c # this lib depends upon: LDLIBS += -lpthread +ifdef CONFIG_RTE_EXEC_ENV_LINUXAPP LDLIBS += -ldl +endif include $(RTE_SDK)/mk/rte.lib.mk
Signature · 1 line
2.11.0
Re: [PATCH 2/2] net/ark: fix FreeBSD compilation
Quoted 10 lines · Bruce Richardson
On FreeBSD it's not necessary to use -ldl to link apps which use dlopen. This error only showed up with a shared library gcc build, not standard build using static libs.
Fixes 1131cbf0fb2b ("net/ark: stub PMD for Atomic Rules Arkville")Signed-off-by Bruce Richardson <[email protected]>
Thanks Bruce.
v2 cover Fixes for BSD compilation
In reply to Bruce RichardsonFixes a number of issues with compiling on BSD, and a general fix to clean up the compilation of the performance-thread app.
V2 changes:
* adjust fix for perf thread compilation to use rte_lcore.h instead of extra #ifdefs.
* added in two extra patches, enabling examples_clean to run on BSD, and removing the "common" build dir in perf thread example.
Bruce Richardson (4):
net/ark: fix FreeBSD compilation
examples: fix examples_clean build target on FreeBSD examples/performance-thread: fix FreeBSD compilation examples/performance-thread: use a single build output dir
drivers/net/ark/Makefile | 2 ++ examples/exception_path/Makefile | 1 + examples/netmap_compat/bridge/Makefile | 1 + examples/performance-thread/common/common.mk | 20 ++++++++++--------- examples/performance-thread/l3fwd-thread/main.c | 4 ++++ examples/performance-thread/pthread_shim/main.c | 8 ++++++-- .../performance-thread/pthread_shim/pthread_shim.c | 23 ++++++++++++++++------ .../performance-thread/pthread_shim/pthread_shim.h | 3 ++- examples/qos_sched/Makefile | 1 + 9 files changed, 45 insertions(+), 18 deletions(-)
Signature · 1 line
2.11.0
PATCH v2 1/4 net/ark: fix FreeBSD compilation
On FreeBSD it's not necessary to use -ldl to link apps which use dlopen. This error only showed up with a shared library gcc build, not standard build using static libs.
--- drivers/net/ark/Makefile | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ark/Makefile +2 -0
@@ -59,6 +59,8 @@ SRCS-$(CONFIG_RTE_LIBRTE_ARK_PMD) += ark_udm.c # this lib depends upon: LDLIBS += -lpthread +ifdef CONFIG_RTE_EXEC_ENV_LINUXAPP LDLIBS += -ldl +endif include $(RTE_SDK)/mk/rte.lib.mk
Signature · 1 line
2.11.0
PATCH v2 2/4 examples: fix examples_clean build target on FreeBSD
In reply to Bruce RichardsonThe "examples_clean" top-level build target calls "make clean" for each individual example. However, for a number of those which were linux-only examples, the "if" condition only had a dummy "all" target i.e. no "clean" target, causing an error with examples_clean.
--- examples/exception_path/Makefile | 1 + examples/netmap_compat/bridge/Makefile | 1 + examples/qos_sched/Makefile | 1 + 3 files changed, 3 insertions(+)
examples/exception_path/Makefile +1 -0
@@ -42,6 +42,7 @@ ifneq ($(CONFIG_RTE_EXEC_ENV),"linuxapp") $(info This application can only operate in a linuxapp environment, \ please change the definition of the RTE_TARGET environment variable) all: +clean: else # binary name
examples/netmap_compat/bridge/Makefile +1 -0
@@ -42,6 +42,7 @@ ifneq ($(CONFIG_RTE_EXEC_ENV),"linuxapp") $(info This application can only operate in a linuxapp environment, \ please change the definition of the RTE_TARGET environment variable) all: +clean: else # binary name
examples/qos_sched/Makefile +1 -0
@@ -42,6 +42,7 @@ ifneq ($(CONFIG_RTE_EXEC_ENV),"linuxapp") $(info This application can only operate in a linuxapp environment, \ please change the definition of the RTE_TARGET environment variable) all: +clean: else # binary name
Signature · 1 line
2.11.0
PATCH v2 3/4 examples/performance-thread: fix FreeBSD compilation
In reply to Bruce RichardsonThis set of sample apps did not compile on FreeBSD due to use of a number of Linux/glibc-specific APIs, or APIs which existed in different headers on FreeBSD. Specifically, the following APIs has problems:
* sched_getcpu() is a glibc extension, so use rte_lcore_id() on BSD
* pthread_yield() returns int on Linux, but void on FreeBSD, so we have to create two slightly different copies of the function.
* the type for managing cpu sets is cpuset_t on FreeBSD rather than cpu_set_t as on Linux, so use rte_cpuset_t from rte_lcore.h.
* APIs for managing cpu affinity are in pthread_np.h on FreeBSD, rather than in pthread.h, also fixed by including rte_lcore.h
---
V2: use rte_lcore.h to fix cpu_set_t type and pthread_np.h inclusion, rather than ifdefs in the app itself.
--- examples/performance-thread/l3fwd-thread/main.c | 4 ++++ examples/performance-thread/pthread_shim/main.c | 8 ++++++-- .../performance-thread/pthread_shim/pthread_shim.c | 23 ++++++++++++++++------ .../performance-thread/pthread_shim/pthread_shim.h | 3 ++- 4 files changed, 29 insertions(+), 9 deletions(-)
examples/performance-thread/l3fwd-thread/main.c +4 -0
@@ -90,6 +90,10 @@#define APP_LOOKUP_METHOD APP_LOOKUP_LPM#endif +#ifndef __GLIBC__/* sched_getcpu() is glibc specific */ +#define sched_getcpu () rte_lcore_id() +#endif +static int check_ptype (int portid) {
examples/performance-thread/pthread_shim/main.c +6 -2
@@ -59,6 +59,10 @@#define DEBUG_APP 0#define HELLOW_WORLD_MAX_LTHREADS 10 +#ifndef __GLIBC__/* sched_getcpu() is glibc-specific */ +#define sched_getcpu () rte_lcore_id() +#endif + __threadint print_count; __threadpthread_mutex_t print_lock;
@@ -175,12 +179,12 @@ static void initial_lthread(void *args __attribute__((unused)))* use an attribute to pass the desired lcore */ pthread_attr_t attr; -cpu_set_t cpuset; +rte_cpuset_t cpuset;CPU_ZERO (&cpuset);CPU_SET (lcore, &cpuset);pthread_attr_init (&attr); -pthread_attr_setaffinity_np (&attr,sizeof (cpu_set_t), &cpuset); +pthread_attr_setaffinity_np (&attr,sizeof (rte_cpuset_t), &cpuset);/* create the thread */ pthread_create (&tid[i], &attr, helloworld_pthread, (void *) i);
examples/performance-thread/pthread_shim/pthread_shim.c +17 -6
@@ -159,7 +159,7 @@ int (*f_pthread_setschedparam)int (*f_pthread_yield) (void );int (*f_pthread_setaffinity_np) - (pthread_t thread,size_t cpusetsize,const cpu_set_t *cpuset); + (pthread_t thread,size_t cpusetsize,const rte_cpuset_t *cpuset);int (*f_nanosleep) (const struct timespec *req,struct timespec *rem); } _sys_pthread_funcs = {
@@ -390,11 +390,11 @@ pthread_create(pthread_t *__restrict tid,if (attr !=NULL ) {/* determine CPU being requested */ -cpu_set_t cpuset; +rte_cpuset_t cpuset;CPU_ZERO (&cpuset);pthread_attr_getaffinity_np (attr, -sizeof (cpu_set_t), +sizeof (rte_cpuset_t), &cpuset);if (CPU_COUNT (&cpuset) !=1 )
@@ -576,15 +576,26 @@ int pthread_rwlock_wrlock(pthread_rwlock_t *a)return _sys_pthread_funcs.f_pthread_rwlock_wrlock (a); } -int pthread_yield (void ) +#ifdef RTE_EXEC_ENV_LINUXAPP +int +pthread_yield (void ) {if (override) {lthread_yield ();return 0 ; }return _sys_pthread_funcs.f_pthread_yield (); - } +#else +void +pthread_yield (void ) +{ +if (override) +lthread_yield (); +else + _sys_pthread_funcs.f_pthread_yield (); +} +#endif pthread_t pthread_self (void ) {
@@ -686,7 +697,7 @@ int nanosleep(const struct timespec *req, struct timespec *rem)int pthread_setaffinity_np (pthread_t thread,size_t cpusetsize, -const cpu_set_t *cpuset) +const rte_cpuset_t *cpuset) {if (override) {/* we only allow affinity with a single CPU */
examples/performance-thread/pthread_shim/pthread_shim.h +2 -1
@@ -33,7 +33,8 @@#ifndef _PTHREAD_SHIM_H_#define _PTHREAD_SHIM_H_ -#include <pthread.h> + +#include <rte_lcore.h> /* * This pthread shim is an example that demonstrates how legacy code
Signature · 1 line
2.11.0
PATCH v2 4/4 examples/performance-thread: use a single build output dir
In reply to Bruce RichardsonWhen building any of the perf-thread examples, the output .o files were placed in two separate directories for each app: the regular build dir and a "common" build directory. This was due to the way the files to be built were specified, using a relative path. Switching to use VPATH to find the files causes Make to put all .o's into the one build directory.
--- examples/performance-thread/common/common.mk | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
examples/performance-thread/common/common.mk +11 -9
@@ -30,13 +30,15 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# list the C files belonhing to the lthread subsystem, these are common to all lthread apps -SRCS-y += ../common/lthread.c \ - ../common/lthread_sched.c \ - ../common/lthread_cond.c \ - ../common/lthread_tls.c \ - ../common/lthread_mutex.c \ - ../common/lthread_diag.c \ - ../common/arch/x86/ctx.c +# list the C files belonging to the lthread subsystem, these are common to all +# lthread apps. Any makefile including this should set VPATH to include this +# directory path +# + +MKFILE_PATH=$(abspath $(dir $(lastword $(MAKEFILE_LIST)))) + +VPATH := $(MKFILE_PATH) $(MKFILE_PATH)/arch/x86 + +SRCS-y += lthread.c lthread_sched.c lthread_cond.c lthread_tls.c lthread_mutex.c lthread_diag.c ctx.c -INCLUDES += -I$(RTE_SDK)/examples/performance-thread/common/ -I$(RTE_SDK)/examples/performance-thread/common/arch/x86/ +INCLUDES += -I$(MKFILE_PATH) -I$(MKFILE_PATH)/arch/x86/
Signature · 1 line
2.11.0
Thomas Monjalon
AppliedRe: [PATCH v2 0/4] Fixes for BSD compilation
In reply to Bruce Richardson21/04/2017 15:50, Bruce Richardson:
Quoted 10 lines
Fixes a number of issues with compiling on BSD, and a general fix to clean up the compilation of the performance-thread app.
V2 changes:
* adjust fix for perf thread compilation to userte_lcore.hinstead of extra #ifdefs.
* added in two extra patches, enablingexamples_cleanto run on BSD, and removing the "common" build dir in perf thread example.
Quoted 5 lines
Bruce Richardson (4):
net/ark: fix FreeBSD compilation
examples: fixexamples_cleanbuild target on FreeBSD examples/performance-thread: fix FreeBSD compilation examples/performance-thread: use a single build output dir
Applied, thanks