Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1263949 > unrolled thread
| Started by | Arseniy Krasnov <a.krasnov@samsung.com> |
|---|---|
| First post | 2015-11-06 13:10 +0100 |
| Last post | 2015-11-06 13:40 +0100 |
| 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 11/13] hperf_hmp: task CPU selection logic. Arseniy Krasnov <a.krasnov@samsung.com> - 2015-11-06 13:10 +0100
Re: [PATCH 11/13] hperf_hmp: task CPU selection logic. kbuild test robot <lkp@intel.com> - 2015-11-06 13:40 +0100
| From | Arseniy Krasnov <a.krasnov@samsung.com> |
|---|---|
| Date | 2015-11-06 13:10 +0100 |
| Subject | [PATCH 11/13] hperf_hmp: task CPU selection logic. |
| Message-ID | <qrO09-4jL-9@gated-at.bofh.it> |
Adds new runqueue selection logic. If task is newly woken(fork or exec)
or it is not WF_SYNC wakeup, idlest CPU from both clusters is selected. Else,
default wake up logic is used('want_affine'). If it fails, idlest CPU from both
clusters is selected.
Signed-off-by: Tarek Dakhran <t.dakhran@samsung.com>
Signed-off-by: Sergey Dyasly <s.dyasly@samsung.com>
Signed-off-by: Dmitriy Safonov <d.safonov@partner.samsung.com>
Signed-off-by: Arseniy Krasnov <a.krasnov@samsung.com>
Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
---
kernel/sched/fair.c | 132 ++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 101 insertions(+), 31 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index fd16729..79be023 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -4798,6 +4798,62 @@ static int wake_affine(struct sched_domain *sd, struct task_struct *p, int sync)
return 1;
}
+#ifdef CONFIG_HPERF_HMP
+/**
+ * hmp_select_task_rq_fair(): selects cpu for task.
+ * @p: task which needs cpu
+ *
+ * Returns cpu for task.
+ *
+ * Selects idlest cpu for task @p.
+ */
+static int
+hmp_select_task_rq_fair(struct task_struct *p)
+{
+ int cpu;
+ int new_cpu;
+ unsigned long load;
+ unsigned long scaled_load;
+
+ new_cpu = task_cpu(p);
+
+ load = ULONG_MAX;
+ /* First check primary cpus */
+ for_each_cpu_and(cpu, cpu_online_mask, cpu_fastest_mask) {
+ if (cpumask_test_cpu(cpu, tsk_cpus_allowed(p))) {
+ /* Select idle cpu if it exists */
+ if (idle_cpu(cpu))
+ return cpu;
+ /* Otherwise select the least loaded cpu */
+ scaled_load = (weighted_cpuload(cpu) *
+ SCHED_CAPACITY_SCALE) /
+ freq_scale_cpu_power[cpu];
+ if (scaled_load < load) {
+ new_cpu = cpu;
+ load = scaled_load;
+ }
+ }
+ }
+
+ /* Then check secondary cpus */
+ for_each_cpu_and(cpu, cpu_online_mask, cpu_slowest_mask) {
+ if (cpumask_test_cpu(cpu, tsk_cpus_allowed(p))) {
+ if (idle_cpu(cpu))
+ return cpu;
+ scaled_load = (weighted_cpuload(cpu) *
+ SCHED_CAPACITY_SCALE) /
+ freq_scale_cpu_power[cpu];
+ if (scaled_load < load) {
+ new_cpu = cpu;
+ load = scaled_load;
+ }
+ }
+ }
+
+ return new_cpu;
+}
+
+#else /* CONFIG_HPERF_HMP */
/*
* find_idlest_group finds and returns the least busy CPU group within the
* domain.
@@ -4905,6 +4961,7 @@ find_idlest_cpu(struct sched_group *group, struct task_struct *p, int this_cpu)
return shallowest_idle_cpu != -1 ? shallowest_idle_cpu : least_loaded_cpu;
}
+#endif /* CONFIG_HPERF_HMP */
/*
* Try and locate an idle CPU in the sched_domain.
*/
@@ -4998,6 +5055,11 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int sd_flag, int wake_f
int want_affine = 0;
int sync = wake_flags & WF_SYNC;
+#ifdef CONFIG_HPERF_HMP
+ if (!(sd_flag & SD_BALANCE_WAKE) || !sync)
+ return hmp_select_task_rq_fair(p);
+#endif
+
if (sd_flag & SD_BALANCE_WAKE)
want_affine = !wake_wide(p) && cpumask_test_cpu(cpu, tsk_cpus_allowed(p));
@@ -5030,41 +5092,49 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int sd_flag, int wake_f
if (!sd) {
if (sd_flag & SD_BALANCE_WAKE) /* XXX always ? */
- new_cpu = select_idle_sibling(p, new_cpu);
-
- } else while (sd) {
- struct sched_group *group;
- int weight;
+ if (IS_ENABLED(CONFIG_HPERF_HMP) && sync)
+ new_cpu = prev_cpu;
+ else
+ new_cpu = select_idle_sibling(p, prev_cpu);
+ } else {
+#ifdef CONFIG_HPERF_HMP
+ new_cpu = hmp_select_task_rq_fair(p);
+#else
+ while (sd) {
+ struct sched_group *group;
+ int weight;
- if (!(sd->flags & sd_flag)) {
- sd = sd->child;
- continue;
- }
+ if (!(sd->flags & sd_flag)) {
+ sd = sd->child;
+ continue;
+ }
- group = find_idlest_group(sd, p, cpu, sd_flag);
- if (!group) {
- sd = sd->child;
- continue;
- }
+ group = find_idlest_group(sd, p, cpu, sd_flag);
+ if (!group) {
+ sd = sd->child;
+ continue;
+ }
- new_cpu = find_idlest_cpu(group, p, cpu);
- if (new_cpu == -1 || new_cpu == cpu) {
- /* Now try balancing at a lower domain level of cpu */
- sd = sd->child;
- continue;
- }
+ new_cpu = find_idlest_cpu(group, p, cpu);
+ if (new_cpu == -1 || new_cpu == cpu) {
+ /* Now try balancing at a lower domain level of cpu */
+ sd = sd->child;
+ continue;
+ }
- /* Now try balancing at a lower domain level of new_cpu */
- cpu = new_cpu;
- weight = sd->span_weight;
- sd = NULL;
- for_each_domain(cpu, tmp) {
- if (weight <= tmp->span_weight)
- break;
- if (tmp->flags & sd_flag)
- sd = tmp;
- }
- /* while loop will break here if sd == NULL */
+ /* Now try balancing at a lower domain level of new_cpu */
+ cpu = new_cpu;
+ weight = sd->span_weight;
+ sd = NULL;
+ for_each_domain(cpu, tmp) {
+ if (weight <= tmp->span_weight)
+ break;
+ if (tmp->flags & sd_flag)
+ sd = tmp;
+ }
+ /* while loop will break here if sd == NULL */
+ }
+#endif
}
rcu_read_unlock();
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2015-11-06 13:40 +0100 |
| Message-ID | <qrOtc-4v4-33@gated-at.bofh.it> |
| In reply to | #1263949 |
[Multipart message — attachments visible in raw view] — view raw
Hi Arseniy,
[auto build test WARNING on tip/sched/core]
[also build test WARNING on v4.3 next-20151106]
url: https://github.com/0day-ci/linux/commits/Arseniy-Krasnov/High-performance-balancing-logic-for-big-LITTLE/20151106-200901
config: x86_64-randconfig-x018-11051832 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All warnings (new ones prefixed by >>):
kernel/sched/fair.c: In function 'select_task_rq_fair':
>> kernel/sched/fair.c:5159:6: warning: suggest explicit braces to avoid ambiguous 'else' [-Wparentheses]
if (sd_flag & SD_BALANCE_WAKE) /* XXX always ? */
^
vim +/else +5159 kernel/sched/fair.c
29cd8bae kernel/sched_fair.c Peter Zijlstra 2009-09-17 5143 break;
f03542a7 kernel/sched/fair.c Alex Shi 2012-07-26 5144 }
29cd8bae kernel/sched_fair.c Peter Zijlstra 2009-09-17 5145
f03542a7 kernel/sched/fair.c Alex Shi 2012-07-26 5146 if (tmp->flags & sd_flag)
c88d5910 kernel/sched_fair.c Peter Zijlstra 2009-09-10 5147 sd = tmp;
63b0e9ed kernel/sched/fair.c Mike Galbraith 2015-07-14 5148 else if (!want_affine)
63b0e9ed kernel/sched/fair.c Mike Galbraith 2015-07-14 5149 break;
c88d5910 kernel/sched_fair.c Peter Zijlstra 2009-09-10 5150 }
4ae7d5ce kernel/sched_fair.c Ingo Molnar 2008-03-19 5151
63b0e9ed kernel/sched/fair.c Mike Galbraith 2015-07-14 5152 if (affine_sd) {
63b0e9ed kernel/sched/fair.c Mike Galbraith 2015-07-14 5153 sd = NULL; /* Prefer wake_affine over balance flags */
63b0e9ed kernel/sched/fair.c Mike Galbraith 2015-07-14 5154 if (cpu != prev_cpu && wake_affine(affine_sd, p, sync))
63b0e9ed kernel/sched/fair.c Mike Galbraith 2015-07-14 5155 new_cpu = cpu;
8b911acd kernel/sched_fair.c Mike Galbraith 2010-03-11 5156 }
3b640894 kernel/sched_fair.c Peter Zijlstra 2009-09-16 5157
63b0e9ed kernel/sched/fair.c Mike Galbraith 2015-07-14 5158 if (!sd) {
63b0e9ed kernel/sched/fair.c Mike Galbraith 2015-07-14 @5159 if (sd_flag & SD_BALANCE_WAKE) /* XXX always ? */
9b7aaf11 kernel/sched/fair.c Arseniy Krasnov 2015-11-06 5160 if (IS_ENABLED(CONFIG_HPERF_HMP) && sync)
9b7aaf11 kernel/sched/fair.c Arseniy Krasnov 2015-11-06 5161 new_cpu = prev_cpu;
9b7aaf11 kernel/sched/fair.c Arseniy Krasnov 2015-11-06 5162 else
9b7aaf11 kernel/sched/fair.c Arseniy Krasnov 2015-11-06 5163 new_cpu = select_idle_sibling(p, prev_cpu);
9b7aaf11 kernel/sched/fair.c Arseniy Krasnov 2015-11-06 5164 } else {
9b7aaf11 kernel/sched/fair.c Arseniy Krasnov 2015-11-06 5165 #ifdef CONFIG_HPERF_HMP
9b7aaf11 kernel/sched/fair.c Arseniy Krasnov 2015-11-06 5166 new_cpu = hmp_select_task_rq_fair(p);
9b7aaf11 kernel/sched/fair.c Arseniy Krasnov 2015-11-06 5167 #else
:::::: The code at line 5159 was first introduced by commit
:::::: 63b0e9edceec10fa41ec33393a1515a5ff444277 sched/fair: Beef up wake_wide()
:::::: TO: Mike Galbraith <umgwanakikbuti@gmail.com>
:::::: CC: Ingo Molnar <mingo@kernel.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web