|
@@ -127,21 +127,11 @@ void cpupri_set(struct cpupri *cp, int cpu, int newpri)
|
|
|
|
|
|
/*
|
|
|
* If the cpu was currently mapped to a different value, we
|
|
|
- * first need to unmap the old value
|
|
|
+ * need to map it to the new value then remove the old value.
|
|
|
+ * Note, we must add the new value first, otherwise we risk the
|
|
|
+ * cpu being cleared from pri_active, and this cpu could be
|
|
|
+ * missed for a push or pull.
|
|
|
*/
|
|
|
- if (likely(oldpri != CPUPRI_INVALID)) {
|
|
|
- struct cpupri_vec *vec = &cp->pri_to_cpu[oldpri];
|
|
|
-
|
|
|
- spin_lock_irqsave(&vec->lock, flags);
|
|
|
-
|
|
|
- vec->count--;
|
|
|
- if (!vec->count)
|
|
|
- clear_bit(oldpri, cp->pri_active);
|
|
|
- cpumask_clear_cpu(cpu, vec->mask);
|
|
|
-
|
|
|
- spin_unlock_irqrestore(&vec->lock, flags);
|
|
|
- }
|
|
|
-
|
|
|
if (likely(newpri != CPUPRI_INVALID)) {
|
|
|
struct cpupri_vec *vec = &cp->pri_to_cpu[newpri];
|
|
|
|
|
@@ -154,6 +144,18 @@ void cpupri_set(struct cpupri *cp, int cpu, int newpri)
|
|
|
|
|
|
spin_unlock_irqrestore(&vec->lock, flags);
|
|
|
}
|
|
|
+ if (likely(oldpri != CPUPRI_INVALID)) {
|
|
|
+ struct cpupri_vec *vec = &cp->pri_to_cpu[oldpri];
|
|
|
+
|
|
|
+ spin_lock_irqsave(&vec->lock, flags);
|
|
|
+
|
|
|
+ vec->count--;
|
|
|
+ if (!vec->count)
|
|
|
+ clear_bit(oldpri, cp->pri_active);
|
|
|
+ cpumask_clear_cpu(cpu, vec->mask);
|
|
|
+
|
|
|
+ spin_unlock_irqrestore(&vec->lock, flags);
|
|
|
+ }
|
|
|
|
|
|
*currpri = newpri;
|
|
|
}
|