• Omar Sandoval's avatar
    sched/core: Fix regression in cpuset_cpu_inactive() for suspend · 533445c6
    Omar Sandoval authored
    Commit 3c18d447 ("sched/core: Check for available DL bandwidth in
    cpuset_cpu_inactive()"), a SCHED_DEADLINE bugfix, had a logic error that
    caused a regression in setting a CPU inactive during suspend. I ran into
    this when a program was failing pthread_setaffinity_np() with EINVAL after
    a suspend+wake up.
    
    A simple reproducer:
    
    	$ ./a.out
    	sched_setaffinity: Success
    	$ systemctl suspend
    	$ ./a.out
    	sched_setaffinity: Invalid argument
    
    ... where ./a.out is:
    
    	#define _GNU_SOURCE
    	#include <errno.h>
    	#include <sched.h>
    	#include <stdio.h>
    	#include <stdlib.h>
    	#include <string.h>
    	#include <unistd.h>
    
    	int main(void)
    	{
    		long num_cores;
    		cpu_set_t cpu_set;
    		int ret;
    
    		num_cores = sysconf(_SC_NPROCESSORS_ONLN);
    		CPU_ZERO(&cpu_set);
    		CPU_SET(num_cores - 1, &cpu_set);
    		errno = 0;
    		ret = sched_setaffinity(getpid(), sizeof(cpu_set), &cpu_set);
    		perror("sched_setaffinity");
    		return ret ? EXIT_FAILURE : EXIT_SUCCESS;
    	}
    
    The mistake is that suspend is handled in the action ==
    CPU_DOWN_PREPARE_FROZEN case of the switch statement in
    cpuset_cpu_inactive().
    
    However, the commit in question masked out CPU_TASKS_FROZEN
    from the action, making this case dead.
    
    The fix is straightforward.
    Signed-off-by: default avatarOmar Sandoval <osandov@osandov.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Juri Lelli <juri.lelli@arm.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Fixes: 3c18d447 ("sched/core: Check for available DL bandwidth in cpuset_cpu_inactive()")
    Link: http://lkml.kernel.org/r/1cb5ecb3d6543c38cce5790387f336f54ec8e2bc.1430733960.git.osandov@osandov.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    533445c6
core.c 200 KB