|
@@ -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)
|
|
if (cpumask_any_and(&p->cpus_allowed, vec->mask) >= nr_cpu_ids)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
- if (lowest_mask)
|
|
|
|
|
|
+ if (lowest_mask) {
|
|
cpumask_and(lowest_mask, &p->cpus_allowed, vec->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;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|