|
@@ -107,7 +107,9 @@ int cpudl_find(struct cpudl *cp, struct task_struct *p,
|
|
|
int best_cpu = -1;
|
|
|
const struct sched_dl_entity *dl_se = &p->dl;
|
|
|
|
|
|
- if (later_mask && cpumask_and(later_mask, later_mask, cp->free_cpus)) {
|
|
|
+ if (later_mask &&
|
|
|
+ cpumask_and(later_mask, cp->free_cpus, &p->cpus_allowed) &&
|
|
|
+ cpumask_and(later_mask, later_mask, cpu_active_mask)) {
|
|
|
best_cpu = cpumask_any(later_mask);
|
|
|
goto out;
|
|
|
} else if (cpumask_test_cpu(cpudl_maximum(cp), &p->cpus_allowed) &&
|
|
@@ -185,6 +187,26 @@ out:
|
|
|
raw_spin_unlock_irqrestore(&cp->lock, flags);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * cpudl_set_freecpu - Set the cpudl.free_cpus
|
|
|
+ * @cp: the cpudl max-heap context
|
|
|
+ * @cpu: rd attached cpu
|
|
|
+ */
|
|
|
+void cpudl_set_freecpu(struct cpudl *cp, int cpu)
|
|
|
+{
|
|
|
+ cpumask_set_cpu(cpu, cp->free_cpus);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * cpudl_clear_freecpu - Clear the cpudl.free_cpus
|
|
|
+ * @cp: the cpudl max-heap context
|
|
|
+ * @cpu: rd attached cpu
|
|
|
+ */
|
|
|
+void cpudl_clear_freecpu(struct cpudl *cp, int cpu)
|
|
|
+{
|
|
|
+ cpumask_clear_cpu(cpu, cp->free_cpus);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* cpudl_init - initialize the cpudl structure
|
|
|
* @cp: the cpudl max-heap context
|
|
@@ -203,7 +225,7 @@ int cpudl_init(struct cpudl *cp)
|
|
|
if (!cp->elements)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- if (!alloc_cpumask_var(&cp->free_cpus, GFP_KERNEL)) {
|
|
|
+ if (!zalloc_cpumask_var(&cp->free_cpus, GFP_KERNEL)) {
|
|
|
kfree(cp->elements);
|
|
|
return -ENOMEM;
|
|
|
}
|
|
@@ -211,8 +233,6 @@ int cpudl_init(struct cpudl *cp)
|
|
|
for_each_possible_cpu(i)
|
|
|
cp->elements[i].idx = IDX_INVALID;
|
|
|
|
|
|
- cpumask_setall(cp->free_cpus);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|