From: Yuyang Du <yuyang.du@intel.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: mingo@kernel.org, linux-kernel@vger.kernel.org, clm@fb.com,
matt@codeblueprint.co.uk, mgalbraith@suse.de, tglx@linutronix.de,
fweisbec@gmail.com
Subject: Re: [RFC][PATCH 5/7] sched: Rewrite select_idle_siblings()
Date: Wed, 11 May 2016 05:05:50 +0800 [thread overview]
Message-ID: <20160510210550.GB4870@intel.com> (raw)
In-Reply-To: <20160509105210.703304637@infradead.org>
On Mon, May 09, 2016 at 12:48:12PM +0200, Peter Zijlstra wrote:
> +/*
> + * Scan the LLC domain for idle CPUs; this is dynamically regulated by
> + * comparing the average scan cost (tracked in sd->avg_scan_cost) against the
tracked in this_sd->avg_scan_cost
> + * average idle time for this rq (as found in rq->avg_idle).
> + */
> +static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int target)
> +{
> + struct sched_domain *this_sd = rcu_dereference(*this_cpu_ptr(&sd_llc));
> + u64 avg_idle = this_rq()->avg_idle;
> + u64 avg_cost = this_sd->avg_scan_cost;
> + u64 time, cost;
> + s64 delta;
> + int cpu, wrap;
> +
> + /*
> + * Due to large variance we need a large fuzz factor; hackbench in
> + * particularly is sensitive here.
> + */
> + if ((avg_idle / 512) < avg_cost)
> + return -1;
> +
> + time = local_clock();
> +
> + for_each_cpu_wrap(cpu, sched_domain_span(sd), target, wrap) {
> + if (!cpumask_test_cpu(cpu, tsk_cpus_allowed(p)))
> + continue;
> + if (idle_cpu(cpu))
> + break;
> + }
> +
> + time = local_clock() - time;
> + cost = this_sd->avg_scan_cost;
> + delta = (s64)(time - cost) / 8;
> + this_sd->avg_scan_cost += delta;
> +
> + return cpu;
> +}
[snip]
> +
> + i = select_idle_core(p, sd, target);
> + if ((unsigned)i < nr_cpumask_bits)
> + return i;
> +
> + i = select_idle_cpu(p, sd, target);
> + if ((unsigned)i < nr_cpumask_bits)
> + return i;
> +
> + i = select_idle_smt(p, sd, target);
> + if ((unsigned)i < nr_cpumask_bits)
> + return i;
First, on smt, these three scans have a lot of overlap, but it also has an
effect of opportunistic-spinning if it was intended, which is good. Anyway,
maybe you should write something about it, and why only consider cost for cpu,
not core.
Then, I am still considering combining them a bit, like the following patch.
And if you want, more might be combined.
P.S., The idle_smt_cpu may not be the first idle, but one more i++ can make
it.
---
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 25bd5b0..648a15c 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -5281,7 +5281,7 @@ unlock:
static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int target)
{
struct cpumask *cpus = this_cpu_cpumask_var_ptr(select_idle_mask);
- int core, cpu, wrap;
+ int core, cpu, wrap, i = 0, idle_smt_cpu = -1;
if (!static_branch_likely(&sched_smt_present))
return -1;
@@ -5298,8 +5298,14 @@ static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int
cpumask_clear_cpu(cpu, cpus);
if (!idle_cpu(cpu))
idle = false;
+ /*
+ * First smt must be target's smt, and any cpu here is allowed
+ */
+ else if (i == 0)
+ idle_smt_cpu = cpu;
}
+ i++;
if (idle)
return core;
}
next prev parent reply other threads:[~2016-05-11 4:47 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-09 10:48 [RFC][PATCH 0/7] sched: select_idle_siblings rewrite Peter Zijlstra
2016-05-09 10:48 ` [RFC][PATCH 1/7] sched: Remove unused @cpu argument from destroy_sched_domain*() Peter Zijlstra
2016-05-09 10:48 ` [RFC][PATCH 2/7] sched: Restructure destroy_sched_domain() Peter Zijlstra
2016-05-09 14:46 ` Peter Zijlstra
2016-05-09 10:48 ` [RFC][PATCH 3/7] sched: Introduce struct sched_domain_shared Peter Zijlstra
2016-05-09 10:48 ` [RFC][PATCH 4/7] sched: Replace sd_busy/nr_busy_cpus with sched_domain_shared Peter Zijlstra
2016-05-11 11:55 ` Matt Fleming
2016-05-11 12:33 ` Peter Zijlstra
2016-05-11 18:11 ` Peter Zijlstra
2016-05-11 18:24 ` Peter Zijlstra
2016-05-12 2:05 ` Michael Neuling
2016-05-12 5:07 ` Peter Zijlstra
2016-05-12 11:07 ` Michael Neuling
2016-05-12 11:33 ` Peter Zijlstra
2016-05-13 0:12 ` Michael Neuling
2016-05-16 14:00 ` Peter Zijlstra
2016-05-17 10:20 ` Peter Zijlstra
2016-05-17 10:52 ` Srikar Dronamraju
2016-05-17 11:15 ` Peter Zijlstra
2016-05-11 17:37 ` Peter Zijlstra
2016-05-11 18:04 ` Matt Fleming
2016-05-16 15:31 ` Dietmar Eggemann
2016-05-16 17:02 ` Peter Zijlstra
2016-05-16 17:26 ` Dietmar Eggemann
2016-05-09 10:48 ` [RFC][PATCH 5/7] sched: Rewrite select_idle_siblings() Peter Zijlstra
2016-05-10 21:05 ` Yuyang Du [this message]
2016-05-11 7:00 ` Peter Zijlstra
2016-05-10 23:42 ` Yuyang Du
2016-05-11 7:43 ` Mike Galbraith
2016-05-09 10:48 ` [RFC][PATCH 6/7] sched: Optimize SCHED_SMT Peter Zijlstra
2016-05-09 10:48 ` [RFC][PATCH 7/7] sched: debug muck -- not for merging Peter Zijlstra
2016-05-10 0:50 ` [RFC][PATCH 0/7] sched: select_idle_siblings rewrite Chris Mason
2016-05-11 14:19 ` Chris Mason
2016-05-18 5:51 ` [RFC][PATCH 8/7] sched/fair: Use utilization distance to filter affine sync wakeups Mike Galbraith
2016-05-19 21:43 ` Rik van Riel
2016-05-20 2:52 ` Mike Galbraith
2016-05-25 14:51 ` [RFC][PATCH 0/7] sched: select_idle_siblings rewrite Chris Mason
2016-05-25 16:24 ` Peter Zijlstra
2016-05-25 17:11 ` Chris Mason
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=20160510210550.GB4870@intel.com \
--to=yuyang.du@intel.com \
--cc=clm@fb.com \
--cc=fweisbec@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=matt@codeblueprint.co.uk \
--cc=mgalbraith@suse.de \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.