• Oleg Nesterov's avatar
    [PATCH] sched_setscheduler: fix? policy checks · 8dc3e909
    Oleg Nesterov authored
    I am not sure this patch is correct: I can't understand what the current
    code does, and I don't know what it was supposed to do.
    
    The comment says:
    
    		 * can't change policy, except between SCHED_NORMAL
    		 * and SCHED_BATCH:
    
    The code:
    
    		if (((policy != SCHED_NORMAL && p->policy != SCHED_BATCH) &&
    			(policy != SCHED_BATCH && p->policy != SCHED_NORMAL)) &&
    
    But this is equivalent to:
    
    		if ( (is_rt_policy(policy) && has_rt_policy(p)) &&
    
    which means something different.  We can't _decrease_ the current
    ->rt_priority with such a check (if rlim[RLIMIT_RTPRIO] == 0).
    
    Probably, it was supposed to be:
    
    		if (	!(policy == SCHED_NORMAL && p->policy == SCHED_BATCH)  &&
    			!(policy == SCHED_BATCH  && p->policy == SCHED_NORMAL)
    
    this matches the comment, but strange: it doesn't allow to _drop_ the
    realtime priority when rlim[RLIMIT_RTPRIO] == 0.
    
    I think the right check would be:
    
    		/* can't set/change rt policy */
    		if (is_rt_policy(policy) &&
    				policy != p->policy &&
    				!rlim_rtprio)
    			return -EPERM;
    Signed-off-by: default avatarOleg Nesterov <oleg@tv-sign.ru>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Nick Piggin <nickpiggin@yahoo.com.au>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    8dc3e909
sched.c 173 KB