* [PATCH 1/3] sched/deadline: fix try to pull pinned dl tasks in pull algorithm
@ 2015-04-02 8:23 Wanpeng Li
2015-04-02 8:23 ` [PATCH 2/3] sched/deadline: make init_sched_dl_class() __init Wanpeng Li
2015-04-02 8:23 ` [PATCH 3/3] sched/deadline: reduce rq lock contention by eliminating locking of non-feasible target Wanpeng Li
0 siblings, 2 replies; 3+ messages in thread
From: Wanpeng Li @ 2015-04-02 8:23 UTC (permalink / raw)
To: Ingo Molnar, Peter Zijlstra; +Cc: Juri Lelli, linux-kernel, Wanpeng Li
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 5e95145..04e3f5b 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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/3] sched/deadline: make init_sched_dl_class() __init
2015-04-02 8:23 [PATCH 1/3] sched/deadline: fix try to pull pinned dl tasks in pull algorithm Wanpeng Li
@ 2015-04-02 8:23 ` Wanpeng Li
2015-04-02 8:23 ` [PATCH 3/3] sched/deadline: reduce rq lock contention by eliminating locking of non-feasible target Wanpeng Li
1 sibling, 0 replies; 3+ messages in thread
From: Wanpeng Li @ 2015-04-02 8:23 UTC (permalink / raw)
To: Ingo Molnar, Peter Zijlstra; +Cc: Juri Lelli, linux-kernel, Wanpeng Li
It's a bootstrap function, make init_sched_dl_class() __init.
Signed-off-by: Wanpeng Li <wanpeng.li@linux.intel.com>
---
kernel/sched/deadline.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index 2313a4f..37425fd 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -1685,7 +1685,7 @@ static void rq_offline_dl(struct rq *rq)
cpudl_clear_freecpu(&rq->rd->cpudl, rq->cpu);
}
-void init_sched_dl_class(void)
+void __init init_sched_dl_class(void)
{
unsigned int i;
--
1.9.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 3/3] sched/deadline: reduce rq lock contention by eliminating locking of non-feasible target
2015-04-02 8:23 [PATCH 1/3] sched/deadline: fix try to pull pinned dl tasks in pull algorithm Wanpeng Li
2015-04-02 8:23 ` [PATCH 2/3] sched/deadline: make init_sched_dl_class() __init Wanpeng Li
@ 2015-04-02 8:23 ` Wanpeng Li
1 sibling, 0 replies; 3+ messages in thread
From: Wanpeng Li @ 2015-04-02 8:23 UTC (permalink / raw)
To: Ingo Molnar, Peter Zijlstra; +Cc: Juri Lelli, linux-kernel, Wanpeng Li
This patch adds check that prevents futile attempts to move dl tasks to
a CPU with active tasks of equal or earlier deadline. The same behavior as
commit 80e3d87b2c55 ("sched/rt: Reduce rq lock contention by eliminating
locking of non-feasible target") for rt class.
Signed-off-by: Wanpeng Li <wanpeng.li@linux.intel.com>
---
kernel/sched/deadline.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index 37425fd..e72194f 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -1012,7 +1012,9 @@ select_task_rq_dl(struct task_struct *p, int cpu, int sd_flag, int flags)
(p->nr_cpus_allowed > 1)) {
int target = find_later_rq(p);
- if (target != -1)
+ if (target != -1 &&
+ dl_time_before(p->dl.deadline,
+ cpu_rq(target)->dl.earliest_dl.curr))
cpu = target;
}
rcu_read_unlock();
--
1.9.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-04-02 8:42 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-02 8:23 [PATCH 1/3] sched/deadline: fix try to pull pinned dl tasks in pull algorithm Wanpeng Li
2015-04-02 8:23 ` [PATCH 2/3] sched/deadline: make init_sched_dl_class() __init Wanpeng Li
2015-04-02 8:23 ` [PATCH 3/3] sched/deadline: reduce rq lock contention by eliminating locking of non-feasible target Wanpeng Li
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.