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:
parent
b2f4f2e2a6
commit
4cde45f36f
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user