Messages in this thread | | | Date | Tue, 26 May 2015 10:17:01 +0800 | From | Wanpeng Li <> | Subject | Re: [PATCH v2 1/7] sched/deadline: fix try to pull pinned dl tasks in pull algorithm |
| |
Ping, On Tue, May 19, 2015 at 08:23:15AM +0800, Wanpeng Li wrote: >Ping Peterz for this patchset, :) >On Wed, May 13, 2015 at 02:01:01PM +0800, Wanpeng Li wrote: >>Function pick_next_earliest_dl_task is used to pick earliest and pushable >>dl task from overloaded cpus in pull algorithm, however, it traverses >>runqueue rbtree instead of pushable task rbtree which is also ordered by >>tasks' deadlines. This will result in getting no candidates from overloaded >>cpus if all the dl tasks on the overloaded cpus are pinned. This patch fix >>it by traversing pushable task rbtree which is also ordered by tasks' >>deadlines. >> >>Signed-off-by: Wanpeng Li <wanpeng.li@linux.intel.com> >>--- >> kernel/sched/deadline.c | 29 ++++++++++++++++++++++++++++- >> 1 file changed, 28 insertions(+), 1 deletion(-) >> >>diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c >>index 890ce95..f09f3ad 100644 >>--- a/kernel/sched/deadline.c >>+++ b/kernel/sched/deadline.c >>@@ -1230,6 +1230,33 @@ next_node: >> return NULL; >> } >> >>+/* >>+ * Return the earliest pushable rq's task, which is suitable to be executed >>+ * on the cpu, NULL otherwse >>+ */ >>+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 +1541,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: >>-- >>1.9.1
| |