• Darren Hart's avatar
    sched: Allow users with sufficient RLIMIT_NICE to change from SCHED_IDLE policy · c02aa73b
    Darren Hart authored
    The current scheduler implementation returns -EPERM when trying to
    change from SCHED_IDLE to SCHED_OTHER or SCHED_BATCH. Since SCHED_IDLE
    is considered to be a nice 20 on steroids, changing to another policy
    should be allowed provided the RLIMIT_NICE is accounted for.
    
    This patch allows the following test-case to pass with RLIMIT_NICE=40,
    but still fail with RLIMIT_NICE=10 when the calling process is run
    from a typical shell (nice 0, or 20 in rlimit terms).
    
    int main()
    {
    	int ret;
    	struct sched_param sp;
    	sp.sched_priority = 0;
    
    	/* switch to SCHED_IDLE */
    	ret = sched_setscheduler(0, SCHED_IDLE, &sp);
    	printf("setscheduler IDLE: %d\n", ret);
    	if (ret) return ret;
    
    	/* switch back to SCHED_OTHER */
    	ret = sched_setscheduler(0, SCHED_OTHER, &sp);
    	printf("setscheduler OTHER: %d\n", ret);
    
    	return ret;
    }
    
     $ ulimit -e
     40
     $ ./test
     setscheduler IDLE: 0
     setscheduler OTHER: 0
    
     $ ulimit -e 10
     $ ulimit -e
     10
     $ ./test
     setscheduler IDLE: 0
     setscheduler OTHER: -1
    Signed-off-by: default avatarDarren Hart <dvhart@linux.intel.com>
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Richard Purdie <richard.purdie@linuxfoundation.org>
    LKML-Reference: <4D657BEE.4040608@linux.intel.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    c02aa73b
sched.c 229 KB