examples/performance-thread: fix build on FreeBSD

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, 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

Fixes: 433ba6228f ("examples/performance-thread: add pthread_shim app")
Fixes: d48415e1fe ("examples/performance-thread: add l3fwd-thread app")
Cc: stable@dpdk.org

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
This commit is contained in:
Bruce Richardson 2017-04-21 14:50:23 +01:00 committed by Thomas Monjalon
parent b2f4f2e2a6
commit 4cde45f36f
4 changed files with 29 additions and 9 deletions

View File

@ -90,6 +90,10 @@
#define APP_LOOKUP_METHOD APP_LOOKUP_LPM #define APP_LOOKUP_METHOD APP_LOOKUP_LPM
#endif #endif
#ifndef __GLIBC__ /* sched_getcpu() is glibc specific */
#define sched_getcpu() rte_lcore_id()
#endif
static int static int
check_ptype(int portid) check_ptype(int portid)
{ {

View File

@ -59,6 +59,10 @@
#define DEBUG_APP 0 #define DEBUG_APP 0
#define HELLOW_WORLD_MAX_LTHREADS 10 #define HELLOW_WORLD_MAX_LTHREADS 10
#ifndef __GLIBC__ /* sched_getcpu() is glibc-specific */
#define sched_getcpu() rte_lcore_id()
#endif
__thread int print_count; __thread int print_count;
__thread pthread_mutex_t print_lock; __thread pthread_mutex_t print_lock;
@ -175,12 +179,12 @@ static void initial_lthread(void *args __attribute__((unused)))
* use an attribute to pass the desired lcore * use an attribute to pass the desired lcore
*/ */
pthread_attr_t attr; pthread_attr_t attr;
cpu_set_t cpuset; rte_cpuset_t cpuset;
CPU_ZERO(&cpuset); CPU_ZERO(&cpuset);
CPU_SET(lcore, &cpuset); CPU_SET(lcore, &cpuset);
pthread_attr_init(&attr); 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 */ /* create the thread */
pthread_create(&tid[i], &attr, helloworld_pthread, (void *) i); pthread_create(&tid[i], &attr, helloworld_pthread, (void *) i);

View File

@ -159,7 +159,7 @@ int (*f_pthread_setschedparam)
int (*f_pthread_yield) int (*f_pthread_yield)
(void); (void);
int (*f_pthread_setaffinity_np) 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) int (*f_nanosleep)
(const struct timespec *req, struct timespec *rem); (const struct timespec *req, struct timespec *rem);
} _sys_pthread_funcs = { } _sys_pthread_funcs = {
@ -390,11 +390,11 @@ pthread_create(pthread_t *__restrict tid,
if (attr != NULL) { if (attr != NULL) {
/* determine CPU being requested */ /* determine CPU being requested */
cpu_set_t cpuset; rte_cpuset_t cpuset;
CPU_ZERO(&cpuset); CPU_ZERO(&cpuset);
pthread_attr_getaffinity_np(attr, pthread_attr_getaffinity_np(attr,
sizeof(cpu_set_t), sizeof(rte_cpuset_t),
&cpuset); &cpuset);
if (CPU_COUNT(&cpuset) != 1) 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); return _sys_pthread_funcs.f_pthread_rwlock_wrlock(a);
} }
int pthread_yield(void) #ifdef RTE_EXEC_ENV_LINUXAPP
int
pthread_yield(void)
{ {
if (override) { if (override) {
lthread_yield(); lthread_yield();
return 0; return 0;
} }
return _sys_pthread_funcs.f_pthread_yield(); 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) pthread_t pthread_self(void)
{ {
@ -686,7 +697,7 @@ int nanosleep(const struct timespec *req, struct timespec *rem)
int int
pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
const cpu_set_t *cpuset) const rte_cpuset_t *cpuset)
{ {
if (override) { if (override) {
/* we only allow affinity with a single CPU */ /* we only allow affinity with a single CPU */

View File

@ -33,7 +33,8 @@
#ifndef _PTHREAD_SHIM_H_ #ifndef _PTHREAD_SHIM_H_
#define _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 * This pthread shim is an example that demonstrates how legacy code