From 0b7a1e0d3463aa8aa4b7dcad0ec154e658d68036 Mon Sep 17 00:00:00 2001 From: Kurt Kanzenbach Date: Wed, 1 Apr 2020 20:15:24 +0200 Subject: [PATCH] all: Fix musl build There are a few problems: * pi stress: pthread_attr_setaffinity_np() is not supported * cyclictest: SIGEV_THREAD_ID is not supported * hackbench: Fix include, add missing casts * all: Fix sched_* calls With these changes applied, the rt-tests seem to run fine. Signed-off-by: Kurt Kanzenbach --- Makefile | 5 -- src/backfire/sendme.c | 1 src/cyclictest/cyclictest.c | 68 ++++------------------------------ src/hackbench/hackbench.c | 12 +++--- src/include/musl.h | 28 ++++++++++++++ src/lib/rt-utils.c | 1 src/pi_tests/tst-mutexpi10.c | 2 + src/pmqtest/pmqtest.c | 1 src/ptsematest/ptsematest.c | 1 src/rt-migrate-test/rt-migrate-test.c | 1 src/sched_deadline/cyclicdeadline.c | 1 11 files changed, 51 insertions(+), 70 deletions(-) create mode 100644 src/include/musl.h --- a/Makefile +++ b/Makefile @@ -8,7 +8,6 @@ OBJDIR = bld sources = cyclictest.c \ hackbench.c \ pip_stress.c \ - pi_stress.c \ pmqtest.c \ ptsematest.c \ rt-migrate-test.c \ @@ -43,7 +42,6 @@ ifeq (${PYLIB},) endif MANPAGES = src/cyclictest/cyclictest.8 \ - src/pi_tests/pi_stress.8 \ src/ptsematest/ptsematest.8 \ src/rt-migrate-test/rt-migrate-test.8 \ src/sigwaittest/sigwaittest.8 \ @@ -131,9 +129,6 @@ deadline_test: $(OBJDIR)/deadline_test.o signaltest: $(OBJDIR)/signaltest.o $(OBJDIR)/librttest.a $(OBJDIR)/librttestnuma.a $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(RTTESTLIB) $(RTTESTNUMA) -pi_stress: $(OBJDIR)/pi_stress.o $(OBJDIR)/librttest.a - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(RTTESTLIB) - hwlatdetect: src/hwlatdetect/hwlatdetect.py chmod +x src/hwlatdetect/hwlatdetect.py ln -s src/hwlatdetect/hwlatdetect.py hwlatdetect --- a/src/backfire/sendme.c +++ b/src/backfire/sendme.c @@ -16,6 +16,7 @@ #include #include #include +#include "musl.h" #include "rt-utils.h" #include "rt-get_cpu.h" --- a/src/cyclictest/cyclictest.c +++ b/src/cyclictest/cyclictest.c @@ -30,6 +30,7 @@ #include #include #include +#include "musl.h" #include "rt_numa.h" #include "rt-utils.h" @@ -469,12 +470,8 @@ static void *timerthread(void *param) { struct thread_param *par = param; struct sched_param schedp; - struct sigevent sigev; sigset_t sigset; - timer_t timer; struct timespec now, next, interval, stop = { 0 }; - struct itimerval itimer; - struct itimerspec tspec; struct thread_stat *stat = par->stats; int stopped = 0; cpu_set_t mask; @@ -503,14 +500,6 @@ static void *timerthread(void *param) sigaddset(&sigset, par->signal); sigprocmask(SIG_BLOCK, &sigset, NULL); - if (par->mode == MODE_CYCLIC) { - sigev.sigev_notify = SIGEV_THREAD_ID | SIGEV_SIGNAL; - sigev.sigev_signo = par->signal; - sigev.sigev_notify_thread_id = stat->tid; - timer_create(par->clock, &sigev, &timer); - tspec.it_interval = interval; - } - memset(&schedp, 0, sizeof(schedp)); schedp.sched_priority = par->prio; if (setscheduler(0, par->policy, &schedp)) @@ -564,20 +553,6 @@ static void *timerthread(void *param) stop = now; stop.tv_sec += duration; } - if (par->mode == MODE_CYCLIC) { - if (par->timermode == TIMER_ABSTIME) - tspec.it_value = next; - else - tspec.it_value = interval; - timer_settime(timer, par->timermode, &tspec, NULL); - } - - if (par->mode == MODE_SYS_ITIMER) { - itimer.it_interval.tv_sec = interval.tv_sec; - itimer.it_interval.tv_usec = interval.tv_nsec / 1000; - itimer.it_value = itimer.it_interval; - setitimer(ITIMER_REAL, &itimer, NULL); - } stat->threadstarted++; @@ -585,16 +560,10 @@ static void *timerthread(void *param) uint64_t diff; unsigned long diff_smi = 0; - int sigs, ret; + int ret; /* Wait for next period */ switch (par->mode) { - case MODE_CYCLIC: - case MODE_SYS_ITIMER: - if (sigwait(&sigset, &sigs) < 0) - goto out; - break; - case MODE_CLOCK_NANOSLEEP: if (par->timermode == TIMER_ABSTIME) { ret = clock_nanosleep(par->clock, TIMER_ABSTIME, @@ -708,11 +677,6 @@ static void *timerthread(void *param) next.tv_sec += interval.tv_sec; next.tv_nsec += interval.tv_nsec; - if (par->mode == MODE_CYCLIC) { - int overrun_count = timer_getoverrun(timer); - next.tv_sec += overrun_count * interval.tv_sec; - next.tv_nsec += overrun_count * interval.tv_nsec; - } tsnorm(&next); while (tsgreater(&now, &next)) { @@ -737,17 +701,6 @@ out: pthread_mutex_unlock(&refresh_on_max_lock); } - if (par->mode == MODE_CYCLIC) - timer_delete(timer); - - if (par->mode == MODE_SYS_ITIMER) { - itimer.it_value.tv_sec = 0; - itimer.it_value.tv_usec = 0; - itimer.it_interval.tv_sec = 0; - itimer.it_interval.tv_usec = 0; - setitimer(ITIMER_REAL, &itimer, NULL); - } - /* close msr file */ if (smi) close(par->msr_fd); @@ -1143,7 +1096,8 @@ static void process_options(int argc, ch case OPT_VERBOSE: verbose = 1; break; case 'x': case OPT_POSIX_TIMERS: - use_nanosleep = MODE_CYCLIC; break; + fatal("--posix_timers is not available on your libc\n"); + break; case '?': case OPT_HELP: display_help(0); break; @@ -1176,13 +1130,6 @@ static void process_options(int argc, ch } } - if ((use_system == MODE_SYS_OFFSET) && (use_nanosleep == MODE_CYCLIC)) { - warn("The system option requires clock_nanosleep\n"); - warn("and is not compatible with posix_timers\n"); - warn("Using clock_nanosleep\n"); - use_nanosleep = MODE_CLOCK_NANOSLEEP; - } - /* if smp wasn't requested, test for numa automatically */ if (!smp) { numa = numa_initialize(); @@ -1876,7 +1823,6 @@ int main(int argc, char **argv) } - mode = use_nanosleep + use_system; sigemptyset(&sigset); @@ -1931,6 +1877,7 @@ int main(int argc, char **argv) void *currstk; size_t stksize; int node_cpu = cpu; + int err; if (node_cpu == -1) node_cpu = cpu_for_thread_ua(i, max_cpus); @@ -1939,11 +1886,12 @@ int main(int argc, char **argv) node = rt_numa_numa_node_of_cpu(node_cpu); /* get the stack size set for this thread */ - if (pthread_attr_getstack(&attr, &currstk, &stksize)) + err = pthread_attr_getstack(&attr, &currstk, &stksize); + if (err != EINVAL) fatal("failed to get stack size for thread %d\n", i); /* if the stack size is zero, set a default */ - if (stksize == 0) + if (err == EINVAL || stksize == 0) stksize = PTHREAD_STACK_MIN * 2; /* allocate memory for a stack on appropriate node */ --- a/src/hackbench/hackbench.c +++ b/src/hackbench/hackbench.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -34,6 +34,8 @@ #include #include +#include "musl.h" + static unsigned int datasize = 100; static unsigned int loops = 100; static unsigned int num_groups = 10; @@ -128,9 +130,9 @@ static int inet_socketpair(int fds[2]) sin.sin_port = 0; sin.sin_addr.s_addr = inet_addr("127.0.0.1"); - if (bind(s1, &sin, len) < 0) + if (bind(s1, (struct sockaddr *)&sin, len) < 0) barf("bind"); - if (getsockname(s1, &sin, &len) < 0) + if (getsockname(s1, (struct sockaddr *)&sin, &len) < 0) barf("getsockname"); if (listen(s1, 10) < 0) barf("listen"); @@ -138,9 +140,9 @@ static int inet_socketpair(int fds[2]) barf("ioctl"); if (ioctl(s1, FIONBIO, &ul) < 0) barf("ioctl"); - if (connect(s2, &sin, len) < 0) + if (connect(s2, (struct sockaddr *)&sin, len) < 0) barf("connect"); - if ((fds[0] = accept(s1, &sin, &len)) < 0) + if ((fds[0] = accept(s1, (struct sockaddr *)&sin, &len)) < 0) barf("accept"); ul = 0; if (ioctl(s2, FIONBIO, &ul) < 0) --- /dev/null +++ b/src/include/musl.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2020 Kurt Kanzenbach + * Time-stamp: <2020-04-04 10:54:01 kurt> + */ + +#ifndef _MUSL_H_ +#define _MUSL_H_ + +#include +#include + +/* + * Musl someshow defines sched_* to ENOSYS which is not correct ... + * See commit 1e21e78bf7a5 ("add support for thread scheduling (POSIX TPS option)") + * + * Workaround: define them to syscall(...) + */ + +#define sched_getparam(pid, param) \ + syscall(SYS_sched_getparam, pid, param) +#define sched_setparam(pid, param) \ + syscall(SYS_sched_setparam, pid, param) +#define sched_getscheduler(pid) \ + syscall(SYS_sched_getscheduler, pid) +#define sched_setscheduler(pid, policy, param) \ + syscall(SYS_sched_setscheduler, pid, policy, param) + +#endif /* _MUSL_H_ */ --- a/src/lib/rt-utils.c +++ b/src/lib/rt-utils.c @@ -24,6 +24,7 @@ #include #include +#include "musl.h" #include "rt-utils.h" #include "rt-sched.h" #include "rt-error.h" --- a/src/pi_tests/tst-mutexpi10.c +++ b/src/pi_tests/tst-mutexpi10.c @@ -35,6 +35,8 @@ #include #include +#include "musl.h" + /* test timeout */ #define TIMEOUT 2 --- a/src/pmqtest/pmqtest.c +++ b/src/pmqtest/pmqtest.c @@ -24,6 +24,7 @@ #include #include +#include "musl.h" #include "rt-utils.h" #include "rt-get_cpu.h" #include "rt-error.h" --- a/src/ptsematest/ptsematest.c +++ b/src/ptsematest/ptsematest.c @@ -22,6 +22,7 @@ #include #include +#include "musl.h" #include "rt-utils.h" #include "rt-get_cpu.h" #include "rt-error.h" --- a/src/rt-migrate-test/rt-migrate-test.c +++ b/src/rt-migrate-test/rt-migrate-test.c @@ -27,6 +27,7 @@ #include +#include "musl.h" #include "rt-utils.h" int nr_tasks; --- a/src/sched_deadline/cyclicdeadline.c +++ b/src/sched_deadline/cyclicdeadline.c @@ -30,6 +30,7 @@ #include #include +#include "musl.h" #include "rt-utils.h" #include "rt-sched.h" #include "rt-error.h"