Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1714593 > unrolled thread
| Started by | Byungchul Park <byungchul.park@lge.com> |
|---|---|
| First post | 2017-08-18 08:10 +0200 |
| Last post | 2017-08-18 15:40 +0200 |
| Articles | 2 — 2 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH v7 2/2] sched/rt: Add support for SD_PREFER_SIBLING on find_lowest_rq() Byungchul Park <byungchul.park@lge.com> - 2017-08-18 08:10 +0200
Re: [PATCH v7 2/2] sched/rt: Add support for SD_PREFER_SIBLING on find_lowest_rq() Steven Rostedt <rostedt@goodmis.org> - 2017-08-18 15:40 +0200
| From | Byungchul Park <byungchul.park@lge.com> |
|---|---|
| Date | 2017-08-18 08:10 +0200 |
| Subject | [PATCH v7 2/2] sched/rt: Add support for SD_PREFER_SIBLING on find_lowest_rq() |
| Message-ID | <ufIDM-7Ok-19@gated-at.bofh.it> |
It would be better to avoid pushing tasks to other cpu within
a SD_PREFER_SIBLING domain, instead, get more chances to check other
siblings.
Signed-off-by: Byungchul Park <byungchul.park@lge.com>
---
kernel/sched/rt.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 53 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index 979b734..f185690 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -1618,12 +1618,35 @@ static struct task_struct *pick_highest_pushable_task(struct rq *rq, int cpu)
static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask);
+/*
+ * Find the first cpu in: mask & sd & ~prefer
+ */
+static int find_cpu(const struct cpumask *mask,
+ const struct sched_domain *sd,
+ const struct sched_domain *prefer)
+{
+ const struct cpumask *sds = sched_domain_span(sd);
+ const struct cpumask *ps = prefer ? sched_domain_span(prefer) : NULL;
+ int cpu = -1;
+
+ while ((cpu = cpumask_next(cpu, mask)) < nr_cpu_ids) {
+ if (!cpumask_test_cpu(cpu, sds))
+ continue;
+ if (ps && cpumask_test_cpu(cpu, ps))
+ continue;
+ break;
+ }
+
+ return cpu;
+}
+
static int find_lowest_rq(struct task_struct *task)
{
- struct sched_domain *sd;
+ struct sched_domain *sd, *prefer = NULL;
struct cpumask *lowest_mask = this_cpu_cpumask_var_ptr(local_cpu_mask);
int this_cpu = smp_processor_id();
int cpu = task_cpu(task);
+ int fallback_cpu = -1;
/* Make sure the mask is initialized first */
if (unlikely(!lowest_mask))
@@ -1668,9 +1691,29 @@ static int find_lowest_rq(struct task_struct *task)
return this_cpu;
}
- best_cpu = cpumask_first_and(lowest_mask,
- sched_domain_span(sd));
+ best_cpu = find_cpu(lowest_mask, sd, prefer);
+
if (best_cpu < nr_cpu_ids) {
+ /*
+ * If current domain is SD_PREFER_SIBLING
+ * flaged, we have to try to check other
+ * siblings first.
+ */
+ if (sd->flags & SD_PREFER_SIBLING) {
+ prefer = sd;
+
+ /*
+ * fallback_cpu should be one
+ * in the closest domain among
+ * SD_PREFER_SIBLING domains,
+ * in case that more than one
+ * SD_PREFER_SIBLING domains
+ * exist in the hierachy.
+ */
+ if (fallback_cpu == -1)
+ fallback_cpu = best_cpu;
+ continue;
+ }
rcu_read_unlock();
return best_cpu;
}
@@ -1679,6 +1722,13 @@ static int find_lowest_rq(struct task_struct *task)
rcu_read_unlock();
/*
+ * If fallback_cpu is valid, all our quesses failed *except* for
+ * SD_PREFER_SIBLING domain. Now, we can return the fallback cpu.
+ */
+ if (fallback_cpu != -1)
+ return fallback_cpu;
+
+ /*
* And finally, if there were no matches within the domains
* just give the caller *something* to work with from the compatible
* locations.
--
1.9.1
[toc] | [next] | [standalone]
| From | Steven Rostedt <rostedt@goodmis.org> |
|---|---|
| Date | 2017-08-18 15:40 +0200 |
| Subject | Re: [PATCH v7 2/2] sched/rt: Add support for SD_PREFER_SIBLING on find_lowest_rq() |
| Message-ID | <ufPFh-4ln-37@gated-at.bofh.it> |
| In reply to | #1714593 |
On Fri, 18 Aug 2017 15:05:13 +0900 Byungchul Park <byungchul.park@lge.com> wrote: > It would be better to avoid pushing tasks to other cpu within > a SD_PREFER_SIBLING domain, instead, get more chances to check other > siblings. > > Signed-off-by: Byungchul Park <byungchul.park@lge.com> Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Note, we really should consolidate the rt.c and deadline.c find lowest rqs code, especially since they should be aware of each other (rt and deadline tasks should take notice of other rt and deadline tasks, not just their own kind). -- Steve
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web