2019-08-30 17:57:01

by Subhra Mazumdar

[permalink] [raw]
Subject: [RFC PATCH 9/9] sched: rotate the cpu search window for better spread

Rotate the cpu search window for better spread of threads. This will ensure
an idle cpu will quickly be found if one exists.

Signed-off-by: subhra mazumdar <[email protected]>
---
kernel/sched/fair.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 94dd4a32..7419b47 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6188,7 +6188,7 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int t
u64 avg_cost, avg_idle;
u64 time, cost;
s64 delta;
- int cpu, floor, nr = INT_MAX;
+ int cpu, floor, target_tmp, nr = INT_MAX;

this_sd = rcu_dereference(*this_cpu_ptr(&sd_llc));
if (!this_sd)
@@ -6213,9 +6213,15 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int t
nr = floor;
}

+ if (per_cpu(next_cpu, target) != -1)
+ target_tmp = per_cpu(next_cpu, target);
+ else
+ target_tmp = target;
+
time = local_clock();

- for_each_cpu_wrap(cpu, sched_domain_span(sd), target) {
+ for_each_cpu_wrap(cpu, sched_domain_span(sd), target_tmp) {
+ per_cpu(next_cpu, target) = cpu;
if (!--nr)
return -1;
if (!cpumask_test_cpu(cpu, &p->cpus_allowed))
--
2.9.3


2019-09-05 07:37:44

by Parth Shah

[permalink] [raw]
Subject: Re: [RFC PATCH 9/9] sched: rotate the cpu search window for better spread



On 8/30/19 11:19 PM, subhra mazumdar wrote:
> Rotate the cpu search window for better spread of threads. This will ensure
> an idle cpu will quickly be found if one exists.
>
> Signed-off-by: subhra mazumdar <[email protected]>
> ---
> kernel/sched/fair.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 94dd4a32..7419b47 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -6188,7 +6188,7 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int t
> u64 avg_cost, avg_idle;
> u64 time, cost;
> s64 delta;
> - int cpu, floor, nr = INT_MAX;
> + int cpu, floor, target_tmp, nr = INT_MAX;
>
> this_sd = rcu_dereference(*this_cpu_ptr(&sd_llc));
> if (!this_sd)
> @@ -6213,9 +6213,15 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int t
> nr = floor;
> }
>
> + if (per_cpu(next_cpu, target) != -1)
> + target_tmp = per_cpu(next_cpu, target);
> + else
> + target_tmp = target;
> +
> time = local_clock();
>
> - for_each_cpu_wrap(cpu, sched_domain_span(sd), target) {
> + for_each_cpu_wrap(cpu, sched_domain_span(sd), target_tmp) {
> + per_cpu(next_cpu, target) = cpu;

Is it possible that two simultaneous select_idle_cpu call have the same target value?

> if (!--nr)
> return -1;
> if (!cpumask_test_cpu(cpu, &p->cpus_allowed))
>