Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752883AbbDFJLp (ORCPT ); Mon, 6 Apr 2015 05:11:45 -0400 Received: from mga09.intel.com ([134.134.136.24]:8558 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752009AbbDFJLo (ORCPT ); Mon, 6 Apr 2015 05:11:44 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,530,1422950400"; d="scan'208";a="477167866" From: Wanpeng Li To: Ingo Molnar , Peter Zijlstra Cc: Juri Lelli , linux-kernel@vger.kernel.org, Wanpeng Li Subject: [PATCH 1/7] sched/deadline: fix try to pull pinned dl tasks in pull algorithm Date: Mon, 6 Apr 2015 16:53:13 +0800 Message-Id: <1428310399-13489-1-git-send-email-wanpeng.li@linux.intel.com> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2064 Lines: 68 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 --- 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 5e95145..b57ceba 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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/