|
@@ -1230,6 +1230,32 @@ next_node:
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Return the earliest pushable rq's task, which is suitable to be executed
|
|
|
+ * on the CPU, NULL otherwise:
|
|
|
+ */
|
|
|
+static struct task_struct *pick_earliest_pushable_dl_task(struct rq *rq, int cpu)
|
|
|
+{
|
|
|
+ struct rb_node *next_node = rq->dl.pushable_dl_tasks_leftmost;
|
|
|
+ struct task_struct *p = NULL;
|
|
|
+
|
|
|
+ if (!has_pushable_dl_tasks(rq))
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+next_node:
|
|
|
+ if (next_node) {
|
|
|
+ p = rb_entry(next_node, struct task_struct, pushable_dl_tasks);
|
|
|
+
|
|
|
+ if (pick_dl_task(rq, p, cpu))
|
|
|
+ return p;
|
|
|
+
|
|
|
+ next_node = rb_next(next_node);
|
|
|
+ goto next_node;
|
|
|
+ }
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask_dl);
|
|
|
|
|
|
static int find_later_rq(struct task_struct *task)
|
|
@@ -1514,7 +1540,7 @@ static int pull_dl_task(struct rq *this_rq)
|
|
|
if (src_rq->dl.dl_nr_running <= 1)
|
|
|
goto skip;
|
|
|
|
|
|
- p = pick_next_earliest_dl_task(src_rq, this_cpu);
|
|
|
+ p = pick_earliest_pushable_dl_task(src_rq, this_cpu);
|
|
|
|
|
|
/*
|
|
|
* We found a task to be pulled if:
|