From: Andreas Herrmann <andreas.herrmann3@amd.com>
To: Peter Zijlstra <peterz@infradead.org>, Ingo Molnar <mingo@elte.hu>
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH 11/15] sched: Pass unlimited __cpu_power information to upper domain level groups
Date: Thu, 20 Aug 2009 15:41:55 +0200 [thread overview]
Message-ID: <20090820134155.GZ29327@alberich.amd.com> (raw)
In-Reply-To: <20090820131243.GO29327@alberich.amd.com>
For performance reasons __cpu_power in a sched_group might be limited
such that the group can handle only one task. To correctly calculate
the capacity in upper domain level groups the unlimited power
information is required. This patch stores unlimited __cpu_power
information in sched_groups.orig_power and uses this when calculating
__cpu_power in upper domain level groups.
Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
---
include/linux/sched.h | 8 +++++++-
kernel/sched.c | 36 ++++++++++++++++++++++++------------
2 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index c53bdd8..d230717 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -890,7 +890,13 @@ struct sched_group {
* (see include/linux/reciprocal_div.h)
*/
u32 reciprocal_cpu_power;
-
+ /*
+ * Backup of original power for this group.
+ * It is used to pass correct power information to upper
+ * domain level groups in case __cpu_power is limited for
+ * performance reasons.
+ */
+ unsigned int orig_power;
/*
* The CPUs this group covers.
*
diff --git a/kernel/sched.c b/kernel/sched.c
index 7a0d710..464b6ba 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -8376,6 +8376,7 @@ static void init_numa_sched_groups_power(struct sched_group *group_head)
sg_inc_cpu_power(sg, sd->groups->__cpu_power);
}
+ sg->orig_power = sg->__cpu_power;
sg = sg->next;
} while (sg != group_head);
}
@@ -8514,18 +8515,9 @@ static void init_sched_groups_power(int cpu, struct sched_domain *sd)
child = sd->child;
sd->groups->__cpu_power = 0;
-
- /*
- * For perf policy, if the groups in child domain share resources
- * (for example cores sharing some portions of the cache hierarchy
- * or SMT), then set this domain groups cpu_power such that each group
- * can handle only one task, when there are other idle groups in the
- * same sched domain.
- */
- if (!child || (!(sd->flags & SD_POWERSAVINGS_BALANCE) &&
- (child->flags &
- (SD_SHARE_CPUPOWER | SD_SHARE_PKG_RESOURCES)))) {
+ if (!child) {
sg_inc_cpu_power(sd->groups, SCHED_LOAD_SCALE);
+ sd->groups->orig_power = sd->groups->__cpu_power;
return;
}
@@ -8534,9 +8526,29 @@ static void init_sched_groups_power(int cpu, struct sched_domain *sd)
*/
group = child->groups;
do {
- sg_inc_cpu_power(sd->groups, group->__cpu_power);
+ sg_inc_cpu_power(sd->groups, group->orig_power);
group = group->next;
} while (group != child->groups);
+ sd->groups->orig_power = sd->groups->__cpu_power;
+
+ /*
+ * For perf policy, if the groups in child domain share resources
+ * (for example cores sharing some portions of the cache hierarchy
+ * or SMT), then set this domain groups cpu_power such that each group
+ * can handle only one task, when there are other idle groups in the
+ * same sched domain.
+ * Note: Unmodified power information is kept in orig_power and
+ * can be used in higher domain levels to calculate
+ * and reflect the correct capacity of a sched_group.
+ * This is required for power_savings scheduling.
+ */
+ if (!(sd->flags & SD_POWERSAVINGS_BALANCE) &&
+ ((child->flags &
+ (SD_SHARE_CPUPOWER | SD_SHARE_PKG_RESOURCES)))) {
+ sd->groups->__cpu_power = 0;
+ sg_inc_cpu_power(sd->groups, SCHED_LOAD_SCALE);
+ }
+
}
/*
--
1.6.0.4
next prev parent reply other threads:[~2009-08-20 13:42 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-20 13:12 [RFC][PATCH 0/15] sched: Fix scheduling for multi-node processors Andreas Herrmann
2009-08-20 13:15 ` [PATCH 1/15] x86, sched: Add config option for multi-node CPU scheduling Andreas Herrmann
2009-08-21 13:50 ` Valdis.Kletnieks
2009-08-24 8:49 ` Andreas Herrmann
2009-08-20 13:34 ` [PATCH 2/15] sched, x86: Provide initializer for MN scheduling domain, define MN level Andreas Herrmann
2009-08-20 13:34 ` [PATCH 3/15] sched: Add cpumask to be used when building MN domain Andreas Herrmann
2009-08-20 13:35 ` [PATCH 4/15] sched: Define per CPU variables and cpu_to_group function for " Andreas Herrmann
2009-08-20 13:36 ` [PATCH 5/15] sched: Add function to build MN sched domain Andreas Herrmann
2009-08-20 13:37 ` [PATCH 6/15] sched: Add support for MN domain in build_sched_groups Andreas Herrmann
2009-08-20 13:38 ` [PATCH 7/15] sched: Activate build of MN domains Andreas Herrmann
2009-08-20 13:39 ` [PATCH 8/15] sched: Add parameter sched_mn_power_savings to control MN domain sched policy Andreas Herrmann
2009-08-24 14:56 ` Peter Zijlstra
2009-08-24 15:32 ` Vaidyanathan Srinivasan
2009-08-24 15:45 ` Peter Zijlstra
2009-08-25 7:52 ` Andreas Herrmann
2009-08-25 7:50 ` Andreas Herrmann
2009-08-25 6:24 ` Andreas Herrmann
2009-08-25 6:41 ` Peter Zijlstra
2009-08-25 8:38 ` Andreas Herrmann
2009-08-26 9:30 ` Gautham R Shenoy
2009-08-27 12:47 ` Andreas Herrmann
2009-08-20 13:40 ` [PATCH 9/15] sched: Check sched_mn_power_savings when setting flags for CPU and MN domains Andreas Herrmann
2009-08-24 14:57 ` Peter Zijlstra
2009-08-25 9:34 ` Gautham R Shenoy
2009-08-26 10:01 ` Gautham R Shenoy
2009-08-20 13:41 ` [PATCH 10/15] sched: Check for sched_mn_power_savings when doing load balancing Andreas Herrmann
2009-08-24 15:03 ` Peter Zijlstra
2009-08-24 15:40 ` Vaidyanathan Srinivasan
2009-08-25 8:00 ` Andreas Herrmann
2009-08-20 13:41 ` Andreas Herrmann [this message]
2009-08-24 15:21 ` [PATCH 11/15] sched: Pass unlimited __cpu_power information to upper domain level groups Peter Zijlstra
2009-08-24 16:44 ` Balbir Singh
2009-08-24 17:26 ` Peter Zijlstra
2009-08-24 18:19 ` Balbir Singh
2009-08-25 7:11 ` Peter Zijlstra
2009-08-25 8:04 ` Balbir Singh
2009-08-25 8:30 ` Peter Zijlstra
2009-08-25 8:51 ` Andreas Herrmann
2009-08-20 13:42 ` [PATCH 12/15] sched: Allow NODE domain to be parent of MC instead of CPU domain Andreas Herrmann
2009-08-24 15:32 ` Peter Zijlstra
2009-08-25 8:55 ` Andreas Herrmann
2009-08-20 13:43 ` [PATCH 13/15] sched: Detect child domain of NUMA (aka NODE) domain Andreas Herrmann
2009-08-24 15:34 ` Peter Zijlstra
2009-08-25 9:13 ` Andreas Herrmann
2009-08-20 13:45 ` [PATCH 14/15] sched: Conditionally limit __cpu_power when child sched domain has type NODE Andreas Herrmann
2009-08-24 15:35 ` Peter Zijlstra
2009-08-25 9:19 ` Andreas Herrmann
2009-08-20 13:46 ` [PATCH 15/15] x86: Fix cpu_coregroup_mask to return correct cpumask on multi-node processors Andreas Herrmann
2009-08-24 15:36 ` Peter Zijlstra
2009-08-24 18:21 ` Ingo Molnar
2009-08-25 10:13 ` Andreas Herrmann
2009-08-25 10:36 ` Ingo Molnar
2009-08-27 13:18 ` Andreas Herrmann
2009-08-25 9:31 ` Andreas Herrmann
2009-08-25 9:55 ` Peter Zijlstra
2009-08-25 10:20 ` Ingo Molnar
2009-08-25 10:24 ` Andreas Herrmann
2009-08-25 10:28 ` Ingo Molnar
2009-08-25 10:35 ` Peter Zijlstra
2009-08-27 15:42 ` Andreas Herrmann
2009-08-27 15:25 ` Andreas Herrmann
2009-08-28 10:39 ` Peter Zijlstra
2009-08-28 12:03 ` Andreas Herrmann
2009-08-28 12:50 ` Peter Zijlstra
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=20090820134155.GZ29327@alberich.amd.com \
--to=andreas.herrmann3@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
/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.