diff options
Diffstat (limited to 'kernel/sched_cpupri.c')
| -rw-r--r-- | kernel/sched_cpupri.c | 15 | 
1 files changed, 14 insertions, 1 deletions
diff --git a/kernel/sched_cpupri.c b/kernel/sched_cpupri.c index e6c251790dd..d014efbf947 100644 --- a/kernel/sched_cpupri.c +++ b/kernel/sched_cpupri.c @@ -81,8 +81,21 @@ int cpupri_find(struct cpupri *cp, struct task_struct *p,  		if (cpumask_any_and(&p->cpus_allowed, vec->mask) >= nr_cpu_ids)  			continue; -		if (lowest_mask) +		if (lowest_mask) {  			cpumask_and(lowest_mask, &p->cpus_allowed, vec->mask); + +			/* +			 * We have to ensure that we have at least one bit +			 * still set in the array, since the map could have +			 * been concurrently emptied between the first and +			 * second reads of vec->mask.  If we hit this +			 * condition, simply act as though we never hit this +			 * priority level and continue on. +			 */ +			if (cpumask_any(lowest_mask) >= nr_cpu_ids) +				continue; +		} +  		return 1;  	}  |