LKML Archive on lore.kernel.org help / color / mirror / Atom feed
From: tip-bot for Xunlei Pang <tipbot@zytor.com> To: linux-tip-commits@vger.kernel.org Cc: juri.lelli@gmail.com, linux-kernel@vger.kernel.org, pang.xunlei@linaro.org, mingo@kernel.org, tglx@linutronix.de, hpa@zytor.com, torvalds@linux-foundation.org, peterz@infradead.org Subject: [tip:sched/core] sched/deadline: Modify cpudl:: free_cpus to reflect rd->online Date: Sun, 1 Feb 2015 09:53:21 -0800 [thread overview] Message-ID: <tip-16b269436b7213ebc01dcfcc9dafa8535b676ccb@git.kernel.org> (raw) In-Reply-To: <1421642980-10045-1-git-send-email-pang.xunlei@linaro.org> Commit-ID: 16b269436b7213ebc01dcfcc9dafa8535b676ccb Gitweb: http://git.kernel.org/tip/16b269436b7213ebc01dcfcc9dafa8535b676ccb Author: Xunlei Pang <pang.xunlei@linaro.org> AuthorDate: Mon, 19 Jan 2015 04:49:36 +0000 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Fri, 30 Jan 2015 19:39:16 +0100 sched/deadline: Modify cpudl::free_cpus to reflect rd->online Currently, cpudl::free_cpus contains all CPUs during init, see cpudl_init(). When calling cpudl_find(), we have to add rd->span to avoid selecting the cpu outside the current root domain, because cpus_allowed cannot be depended on when performing clustered scheduling using the cpuset, see find_later_rq(). This patch adds cpudl_set_freecpu() and cpudl_clear_freecpu() for changing cpudl::free_cpus when doing rq_online_dl()/rq_offline_dl(), so we can avoid the rd->span operation when calling cpudl_find() in find_later_rq(). Signed-off-by: Xunlei Pang <pang.xunlei@linaro.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Juri Lelli <juri.lelli@gmail.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Link: http://lkml.kernel.org/r/1421642980-10045-1-git-send-email-pang.xunlei@linaro.org Signed-off-by: Ingo Molnar <mingo@kernel.org> --- kernel/sched/cpudeadline.c | 28 ++++++++++++++++++++++++---- kernel/sched/cpudeadline.h | 2 ++ kernel/sched/deadline.c | 5 ++--- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/kernel/sched/cpudeadline.c b/kernel/sched/cpudeadline.c index 539ca3c..fd9d3fb 100644 --- a/kernel/sched/cpudeadline.c +++ b/kernel/sched/cpudeadline.c @@ -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) && @@ -186,6 +188,26 @@ out: } /* + * 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; } diff --git a/kernel/sched/cpudeadline.h b/kernel/sched/cpudeadline.h index 020039b..1a0a6ef 100644 --- a/kernel/sched/cpudeadline.h +++ b/kernel/sched/cpudeadline.h @@ -24,6 +24,8 @@ int cpudl_find(struct cpudl *cp, struct task_struct *p, struct cpumask *later_mask); void cpudl_set(struct cpudl *cp, int cpu, u64 dl, int is_valid); int cpudl_init(struct cpudl *cp); +void cpudl_set_freecpu(struct cpudl *cp, int cpu); +void cpudl_clear_freecpu(struct cpudl *cp, int cpu); void cpudl_cleanup(struct cpudl *cp); #endif /* CONFIG_SMP */ diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index b52092f..e7b2722 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -1165,9 +1165,6 @@ static int find_later_rq(struct task_struct *task) * We have to consider system topology and task affinity * first, then we can look for a suitable cpu. */ - cpumask_copy(later_mask, task_rq(task)->rd->span); - cpumask_and(later_mask, later_mask, cpu_active_mask); - cpumask_and(later_mask, later_mask, &task->cpus_allowed); best_cpu = cpudl_find(&task_rq(task)->rd->cpudl, task, later_mask); if (best_cpu == -1) @@ -1562,6 +1559,7 @@ static void rq_online_dl(struct rq *rq) if (rq->dl.overloaded) dl_set_overload(rq); + cpudl_set_freecpu(&rq->rd->cpudl, rq->cpu); if (rq->dl.dl_nr_running > 0) cpudl_set(&rq->rd->cpudl, rq->cpu, rq->dl.earliest_dl.curr, 1); } @@ -1573,6 +1571,7 @@ static void rq_offline_dl(struct rq *rq) dl_clear_overload(rq); cpudl_set(&rq->rd->cpudl, rq->cpu, 0, 0); + cpudl_clear_freecpu(&rq->rd->cpudl, rq->cpu); } void init_sched_dl_class(void)
prev parent reply other threads:[~2015-02-01 17:53 UTC|newest] Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-01-19 4:49 [PATCH 1/5] sched/deadline: Modify cpudl::free_cpus to reflect rd->online Xunlei Pang 2015-01-19 4:49 ` [PATCH 2/5] sched/deadline: Remove cpu_active_mask from cpudl_find() Xunlei Pang 2015-01-27 15:04 ` Peter Zijlstra 2015-02-04 14:36 ` [tip:sched/core] " tip-bot for Xunlei Pang 2015-01-19 4:49 ` [PATCH 3/5] sched/deadline: Fix wrong cpudl_find() in check_preempt_equal_dl() Xunlei Pang 2015-01-27 12:48 ` Peter Zijlstra 2015-01-27 14:15 ` Peter Zijlstra 2015-01-27 16:47 ` Peter Zijlstra 2015-01-28 15:18 ` Xunlei Pang 2015-01-19 4:49 ` [PATCH 4/5] sched/rt: Consider deadline tasks in cpupri_find() Xunlei Pang 2015-01-27 12:58 ` Peter Zijlstra 2015-01-27 14:18 ` Peter Zijlstra 2015-01-27 23:04 ` Steven Rostedt 2015-01-28 15:21 ` Xunlei Pang 2015-01-19 4:49 ` [PATCH 5/5] sched/rt: Optimize find_lowest_rq() to select a cache hot cpu Xunlei Pang 2015-01-27 14:21 ` Peter Zijlstra 2015-01-27 14:56 ` Steven Rostedt 2015-01-27 16:28 ` Peter Zijlstra 2015-01-29 16:42 ` Xunlei Pang 2015-01-29 17:17 ` Steven Rostedt 2015-01-29 19:23 ` Peter Zijlstra 2015-02-04 13:07 ` Xunlei Pang 2015-01-23 18:09 ` [PATCH 1/5] sched/deadline: Modify cpudl::free_cpus to reflect rd->online Xunlei Pang 2015-02-01 17:53 ` tip-bot for Xunlei Pang [this message]
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=tip-16b269436b7213ebc01dcfcc9dafa8535b676ccb@git.kernel.org \ --to=tipbot@zytor.com \ --cc=hpa@zytor.com \ --cc=juri.lelli@gmail.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-tip-commits@vger.kernel.org \ --cc=mingo@kernel.org \ --cc=pang.xunlei@linaro.org \ --cc=peterz@infradead.org \ --cc=tglx@linutronix.de \ --cc=torvalds@linux-foundation.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).