* Brian Silverman <br...@peloton-tech.com> wrote: > Here's my test code. Compile with `gcc -pthread -lrt test_pi.c`. It > requires permission to set a realtime scheduling policy of 2 when > running.
Mind sending a patch that sticks this testcase into tools/testing/selftests/sched/ or so, with the new 'sched' directory and new Makefile to be created by you as well? I've reformatted the testcase below, to kernel coding style. Note that I added a minimal license notification, you might want to add your copyright. Thanks, Ingo ==========================> /* * RLIMIT_RTTIME test code. Compile with: * * gcc -pthread -lrt test_pi.c * * It requires permission to set a realtime scheduling policy of 2 when running. * * License: GPLv2 */ #define _GNU_SOURCE #include <pthread.h> #include <unistd.h> #include <stdio.h> #include <time.h> #include <sched.h> #include <assert.h> #include <sys/resource.h> #include <string.h> #include <signal.h> #include <stdlib.h> static const struct timespec kSleepTime = { 0, 10000 }; static pthread_mutex_t mutex; extern void nop() { } void *nonrealtime(void *ignored_param) { while (1) { assert(pthread_mutex_lock(&mutex) == 0); assert(pthread_mutex_unlock(&mutex) == 0); assert(clock_nanosleep(CLOCK_MONOTONIC, 0, &kSleepTime, NULL) == 0); } } void *realtime(void *ignored_param) { struct sched_param param; memset(¶m, 0, sizeof(param)); param.sched_priority = 2; assert(sched_setscheduler(0, SCHED_FIFO, ¶m) == 0); while (1) { assert(pthread_mutex_lock(&mutex) == 0); assert(clock_nanosleep(CLOCK_MONOTONIC, 0, &kSleepTime, NULL) == 0); assert(pthread_mutex_unlock(&mutex) == 0); } } void signal_handler(int number) { printf("got signal %d, SIGXCPU=%d\n", number, SIGXCPU); exit(0); } int main() { struct sigaction action; memset(&action, 0, sizeof(action)); action.sa_handler = signal_handler; assert(sigaction(SIGXCPU, &action, NULL) == 0); struct rlimit rlim; rlim.rlim_cur = 500; rlim.rlim_max = 5000; assert(prlimit(0, RLIMIT_RTTIME, &rlim, NULL) == 0); pthread_mutexattr_t mutexattr; assert(pthread_mutexattr_init(&mutexattr) == 0); assert(pthread_mutexattr_setprotocol(&mutexattr, PTHREAD_PRIO_INHERIT) == 0); assert(pthread_mutex_init(&mutex, &mutexattr) == 0); assert(pthread_mutexattr_destroy(&mutexattr) == 0); pthread_t nrt, rt; assert(pthread_create(&nrt, NULL, nonrealtime, NULL) == 0); assert(pthread_create(&rt, NULL, realtime, NULL) == 0); assert(pthread_join(nrt, NULL) == 0); assert(pthread_join(rt, NULL) == 0); return 0; } -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/