From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751664AbbCJFnA (ORCPT ); Tue, 10 Mar 2015 01:43:00 -0400 Received: from mail-we0-f182.google.com ([74.125.82.182]:42246 "EHLO mail-we0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751254AbbCJFm5 (ORCPT ); Tue, 10 Mar 2015 01:42:57 -0400 Date: Tue, 10 Mar 2015 06:42:52 +0100 From: Ingo Molnar To: Brian Silverman Cc: mingo , peterz , Austin Schuh , linux-kernel , Peter Zijlstra , Thomas Gleixner , Mike Galbraith Subject: Re: [PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT Message-ID: <20150310054252.GA11485@gmail.com> References: <1424305436-6716-1-git-send-email-brian@peloton-tech.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org * Brian Silverman 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 #include #include #include #include #include #include #include #include #include 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; }