* [PATCH v7 1/2] sched/deadline: Add support for SD_PREFER_SIBLING on find_later_rq()
2017-08-18 6:05 [PATCH v7 0/2] Make find_later_rq() choose a closer cpu in topology Byungchul Park
@ 2017-08-18 6:05 ` Byungchul Park
2017-08-18 7:21 ` Joel Fernandes (Google)
2017-08-18 6:05 ` [PATCH v7 2/2] sched/rt: Add support for SD_PREFER_SIBLING on find_lowest_rq() Byungchul Park
2017-08-18 6:38 ` [PATCH v7 0/2] Make find_later_rq() choose a closer cpu in topology Byungchul Park
2 siblings, 1 reply; 7+ messages in thread
From: Byungchul Park @ 2017-08-18 6:05 UTC (permalink / raw)
To: peterz, mingo
Cc: joel.opensrc, linux-kernel, juri.lelli, rostedt, kernel-team
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/deadline.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 52 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index 0223694..8f69a37 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -1319,12 +1319,35 @@ static struct task_struct *pick_earliest_pushable_dl_task(struct rq *rq, int cpu
static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask_dl);
+/*
+ * 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_later_rq(struct task_struct *task)
{
- struct sched_domain *sd;
+ struct sched_domain *sd, *prefer = NULL;
struct cpumask *later_mask = this_cpu_cpumask_var_ptr(local_cpu_mask_dl);
int this_cpu = smp_processor_id();
int cpu = task_cpu(task);
+ int fallback_cpu = -1;
/* Make sure the mask is initialized first */
if (unlikely(!later_mask))
@@ -1376,8 +1399,7 @@ static int find_later_rq(struct task_struct *task)
return this_cpu;
}
- best_cpu = cpumask_first_and(later_mask,
- sched_domain_span(sd));
+ best_cpu = find_cpu(later_mask, sd, prefer);
/*
* Last chance: if a cpu being in both later_mask
* and current sd span is valid, that becomes our
@@ -1385,6 +1407,26 @@ static int find_later_rq(struct task_struct *task)
* already under consideration through later_mask.
*/
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;
}
@@ -1393,6 +1435,13 @@ static int find_later_rq(struct task_struct *task)
rcu_read_unlock();
/*
+ * If fallback_cpu is valid, all our guesses failed *except* for
+ * SD_PREFER_SIBLING domain. Now, we can return the fallback cpu.
+ */
+ if (fallback_cpu != -1)
+ return fallback_cpu;
+
+ /*
* At this point, all our guesses failed, we just return
* 'something', and let the caller sort the things out.
*/
--
1.9.1
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v7 1/2] sched/deadline: Add support for SD_PREFER_SIBLING on find_later_rq()
2017-08-18 6:05 ` [PATCH v7 1/2] sched/deadline: Add support for SD_PREFER_SIBLING on find_later_rq() Byungchul Park
@ 2017-08-18 7:21 ` Joel Fernandes (Google)
2017-08-18 7:55 ` Byungchul Park
0 siblings, 1 reply; 7+ messages in thread
From: Joel Fernandes (Google) @ 2017-08-18 7:21 UTC (permalink / raw)
To: Byungchul Park
Cc: Peter Zijlstra, mingo, Linux Kernel Mailing List, juri.lelli,
rostedt, kernel-team, Joel Fernandes
Hi Byungchul,
On Thu, Aug 17, 2017 at 11:05 PM, 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>
> ---
> kernel/sched/deadline.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 52 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
> index 0223694..8f69a37 100644
> --- a/kernel/sched/deadline.c
> +++ b/kernel/sched/deadline.c
> @@ -1319,12 +1319,35 @@ static struct task_struct *pick_earliest_pushable_dl_task(struct rq *rq, int cpu
>
> static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask_dl);
>
> +/*
> + * 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) {
This can be simplified to for_each_cpu(cpu, mask) ?
thanks,
-Joel
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v7 1/2] sched/deadline: Add support for SD_PREFER_SIBLING on find_later_rq()
2017-08-18 7:21 ` Joel Fernandes (Google)
@ 2017-08-18 7:55 ` Byungchul Park
0 siblings, 0 replies; 7+ messages in thread
From: Byungchul Park @ 2017-08-18 7:55 UTC (permalink / raw)
To: Joel Fernandes (Google)
Cc: Peter Zijlstra, mingo, Linux Kernel Mailing List, juri.lelli,
rostedt, kernel-team, Joel Fernandes
On Fri, Aug 18, 2017 at 12:21:46AM -0700, Joel Fernandes (Google) wrote:
> Hi Byungchul,
>
> On Thu, Aug 17, 2017 at 11:05 PM, 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>
> > ---
> > kernel/sched/deadline.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++---
> > 1 file changed, 52 insertions(+), 3 deletions(-)
> >
> > diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
> > index 0223694..8f69a37 100644
> > --- a/kernel/sched/deadline.c
> > +++ b/kernel/sched/deadline.c
> > @@ -1319,12 +1319,35 @@ static struct task_struct *pick_earliest_pushable_dl_task(struct rq *rq, int cpu
> >
> > static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask_dl);
> >
> > +/*
> > + * 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) {
>
> This can be simplified to for_each_cpu(cpu, mask) ?
Indeed, exactly.
I will use that, thank you.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v7 2/2] sched/rt: Add support for SD_PREFER_SIBLING on find_lowest_rq()
2017-08-18 6:05 [PATCH v7 0/2] Make find_later_rq() choose a closer cpu in topology Byungchul Park
2017-08-18 6:05 ` [PATCH v7 1/2] sched/deadline: Add support for SD_PREFER_SIBLING on find_later_rq() Byungchul Park
@ 2017-08-18 6:05 ` Byungchul Park
2017-08-18 13:31 ` Steven Rostedt
2017-08-18 6:38 ` [PATCH v7 0/2] Make find_later_rq() choose a closer cpu in topology Byungchul Park
2 siblings, 1 reply; 7+ messages in thread
From: Byungchul Park @ 2017-08-18 6:05 UTC (permalink / raw)
To: peterz, mingo
Cc: joel.opensrc, linux-kernel, juri.lelli, rostedt, kernel-team
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
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v7 2/2] sched/rt: Add support for SD_PREFER_SIBLING on find_lowest_rq()
2017-08-18 6:05 ` [PATCH v7 2/2] sched/rt: Add support for SD_PREFER_SIBLING on find_lowest_rq() Byungchul Park
@ 2017-08-18 13:31 ` Steven Rostedt
0 siblings, 0 replies; 7+ messages in thread
From: Steven Rostedt @ 2017-08-18 13:31 UTC (permalink / raw)
To: Byungchul Park
Cc: peterz, mingo, joel.opensrc, linux-kernel, juri.lelli, kernel-team
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
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH v7 0/2] Make find_later_rq() choose a closer cpu in topology
2017-08-18 6:05 [PATCH v7 0/2] Make find_later_rq() choose a closer cpu in topology Byungchul Park
2017-08-18 6:05 ` [PATCH v7 1/2] sched/deadline: Add support for SD_PREFER_SIBLING on find_later_rq() Byungchul Park
2017-08-18 6:05 ` [PATCH v7 2/2] sched/rt: Add support for SD_PREFER_SIBLING on find_lowest_rq() Byungchul Park
@ 2017-08-18 6:38 ` Byungchul Park
2 siblings, 0 replies; 7+ messages in thread
From: Byungchul Park @ 2017-08-18 6:38 UTC (permalink / raw)
To: joel.opensrc, rostedt
Cc: linux-kernel, juri.lelli, kernel-team, peterz, mingo
From: Byungchul Park [mailto:byungchul.park@lge.com]
> Change from v6
> -. add a comment about selection of fallback_cpu incase more than one
> exist
> -. modify a comment explaining what we do wrt PREFER_SIBLING
I could add supplementary comments, thank to Steven and Joel.
Thank you very much.
^ permalink raw reply [flat|nested] 7+ messages in thread