From: Anton Blanchard <anton@samba.org>
To: Nick Piggin <piggin@cyberone.com.au>
Cc: Andrew Morton <akpm@osdl.org>, linux-kernel@vger.kernel.org
Subject: Re: 2.6.4-mm1
Date: Fri, 12 Mar 2004 16:11:35 +1100 [thread overview]
Message-ID: <20040312051135.GI16751@krispykreme> (raw)
In-Reply-To: <40511A89.3040204@cyberone.com.au>
Hi,
> You need to be setting cpu_power for each of the CPU groups.
Thanks Nick, that fixed it. New patch attached, its basically the x86
version with cpumask fixes when compiling with NR_CPUS > 64.
Anton
---
gr25_work-anton/arch/ppc64/Kconfig | 10 +
gr25_work-anton/arch/ppc64/kernel/smp.c | 222 ++++++++++++++++++++++++++
gr25_work-anton/include/asm-ppc64/processor.h | 5
3 files changed, 237 insertions(+)
diff -puN arch/ppc64/Kconfig~sched-ppc64bits arch/ppc64/Kconfig
--- gr25_work/arch/ppc64/Kconfig~sched-ppc64bits 2004-03-11 21:27:02.655467583 -0600
+++ gr25_work-anton/arch/ppc64/Kconfig 2004-03-11 21:27:02.671465046 -0600
@@ -175,6 +175,16 @@ config NUMA
bool "NUMA support"
depends on DISCONTIGMEM
+config SCHED_SMT
+ bool "SMT (Hyperthreading) scheduler support"
+ depends on SMP
+ default off
+ help
+ SMT scheduler support improves the CPU scheduler's decision making
+ when dealing with Intel Pentium 4 chips with HyperThreading at a
+ cost of slightly increased overhead in some places. If unsure say
+ N here.
+
config PREEMPT
bool
help
diff -puN arch/ppc64/kernel/smp.c~sched-ppc64bits arch/ppc64/kernel/smp.c
--- gr25_work/arch/ppc64/kernel/smp.c~sched-ppc64bits 2004-03-11 21:27:02.660466790 -0600
+++ gr25_work-anton/arch/ppc64/kernel/smp.c 2004-03-11 21:57:09.897044235 -0600
@@ -890,3 +890,225 @@ static int __init topology_init(void)
return 0;
}
__initcall(topology_init);
+
+#ifdef CONFIG_SCHED_SMT
+#ifdef CONFIG_NUMA
+static struct sched_group sched_group_cpus[NR_CPUS];
+static struct sched_group sched_group_phys[NR_CPUS];
+static struct sched_group sched_group_nodes[MAX_NUMNODES];
+static DEFINE_PER_CPU(struct sched_domain, phys_domains);
+static DEFINE_PER_CPU(struct sched_domain, node_domains);
+__init void arch_init_sched_domains(void)
+{
+ int i;
+ struct sched_group *first_cpu = NULL, *last_cpu = NULL;
+
+ /* Set up domains */
+ for_each_cpu(i) {
+ struct sched_domain *cpu_domain = cpu_sched_domain(i);
+ struct sched_domain *phys_domain = &per_cpu(phys_domains, i);
+ struct sched_domain *node_domain = &per_cpu(node_domains, i);
+ int node = cpu_to_node(i);
+ cpumask_t nodemask = node_to_cpumask(node);
+ cpumask_t tmp1 = cpumask_of_cpu(i ^ 0x1);
+ cpumask_t tmp2 = cpumask_of_cpu(i);
+
+ *cpu_domain = SD_SIBLING_INIT;
+ cpus_or(cpu_domain->span, tmp1, tmp2);
+
+ *phys_domain = SD_CPU_INIT;
+ phys_domain->span = nodemask;
+
+ *node_domain = SD_NODE_INIT;
+ node_domain->span = cpu_possible_map;
+ }
+
+ /* Set up CPU (sibling) groups */
+ for_each_cpu(i) {
+ struct sched_domain *cpu_domain = cpu_sched_domain(i);
+ int j;
+ first_cpu = last_cpu = NULL;
+
+ if (i != first_cpu(cpu_domain->span)) {
+ cpu_sched_domain(i)->flags |= SD_FLAG_SHARE_CPUPOWER;
+ cpu_sched_domain(first_cpu(cpu_domain->span))->flags |=
+ SD_FLAG_SHARE_CPUPOWER;
+ continue;
+ }
+
+ for_each_cpu_mask(j, cpu_domain->span) {
+ struct sched_group *cpu = &sched_group_cpus[j];
+
+ cpus_clear(cpu->cpumask);
+ cpu_set(j, cpu->cpumask);
+ cpu->cpu_power = SCHED_LOAD_SCALE;
+
+ if (!first_cpu)
+ first_cpu = cpu;
+ if (last_cpu)
+ last_cpu->next = cpu;
+ last_cpu = cpu;
+ }
+ last_cpu->next = first_cpu;
+ }
+
+ for (i = 0; i < MAX_NUMNODES; i++) {
+ int j;
+ cpumask_t nodemask;
+ struct sched_group *node = &sched_group_nodes[i];
+ cpumask_t node_cpumask = node_to_cpumask(i);
+ cpus_and(nodemask, node_cpumask, cpu_online_map);
+
+ if (cpus_empty(nodemask))
+ continue;
+
+ first_cpu = last_cpu = NULL;
+ /* Set up physical groups */
+ for_each_cpu_mask(j, nodemask) {
+ struct sched_domain *cpu_domain = cpu_sched_domain(j);
+ struct sched_group *cpu = &sched_group_phys[j];
+
+ if (j != first_cpu(cpu_domain->span))
+ continue;
+
+ cpu->cpumask = cpu_domain->span;
+ /*
+ * Make each extra sibling increase power by 10% of
+ * the basic CPU. This is very arbitrary.
+ */
+ cpu->cpu_power = SCHED_LOAD_SCALE + SCHED_LOAD_SCALE*(cpus_weight(cpu->cpumask)-1) / 10;
+ node->cpu_power += cpu->cpu_power;
+
+ if (!first_cpu)
+ first_cpu = cpu;
+ if (last_cpu)
+ last_cpu->next = cpu;
+ last_cpu = cpu;
+ }
+ last_cpu->next = first_cpu;
+ }
+
+ /* Set up nodes */
+ first_cpu = last_cpu = NULL;
+ for (i = 0; i < MAX_NUMNODES; i++) {
+ struct sched_group *cpu = &sched_group_nodes[i];
+ cpumask_t nodemask;
+ cpumask_t node_cpumask = node_to_cpumask(i);
+ cpus_and(nodemask, node_cpumask, cpu_possible_map);
+
+ if (cpus_empty(nodemask))
+ continue;
+
+ cpu->cpumask = nodemask;
+ /* ->cpu_power already setup */
+
+ if (!first_cpu)
+ first_cpu = cpu;
+ if (last_cpu)
+ last_cpu->next = cpu;
+ last_cpu = cpu;
+ }
+ last_cpu->next = first_cpu;
+
+ mb();
+ for_each_cpu(i) {
+ int node = cpu_to_node(i);
+ struct sched_domain *cpu_domain = cpu_sched_domain(i);
+ struct sched_domain *phys_domain = &per_cpu(phys_domains, i);
+ struct sched_domain *node_domain = &per_cpu(node_domains, i);
+ struct sched_group *cpu_group = &sched_group_cpus[i];
+ struct sched_group *phys_group = &sched_group_phys[first_cpu(cpu_domain->span)];
+ struct sched_group *node_group = &sched_group_nodes[node];
+
+ cpu_domain->parent = phys_domain;
+ phys_domain->parent = node_domain;
+
+ node_domain->groups = node_group;
+ phys_domain->groups = phys_group;
+ cpu_domain->groups = cpu_group;
+ }
+}
+#else /* CONFIG_NUMA */
+static struct sched_group sched_group_cpus[NR_CPUS];
+static struct sched_group sched_group_phys[NR_CPUS];
+static DEFINE_PER_CPU(struct sched_domain, phys_domains);
+__init void arch_init_sched_domains(void)
+{
+ int i;
+ struct sched_group *first_cpu = NULL, *last_cpu = NULL;
+
+ /* Set up domains */
+ for_each_cpu(i) {
+ struct sched_domain *cpu_domain = cpu_sched_domain(i);
+ struct sched_domain *phys_domain = &per_cpu(phys_domains, i);
+
+ *cpu_domain = SD_SIBLING_INIT;
+ cpu_domain->span = cpu_sibling_map[i];
+
+ *phys_domain = SD_CPU_INIT;
+ phys_domain->span = cpu_possible_map;
+ }
+
+ /* Set up CPU (sibling) groups */
+ for_each_cpu(i) {
+ struct sched_domain *cpu_domain = cpu_sched_domain(i);
+ int j;
+ first_cpu = last_cpu = NULL;
+
+ if (i != first_cpu(cpu_domain->span)) {
+ cpu_sched_domain(i)->flags |= SD_FLAG_SHARE_CPUPOWER;
+ cpu_sched_domain(first_cpu(cpu_domain->span))->flags |=
+ SD_FLAG_SHARE_CPUPOWER;
+ continue;
+ }
+
+ for_each_cpu_mask(j, cpu_domain->span) {
+ struct sched_group *cpu = &sched_group_cpus[j];
+
+ cpus_clear(cpu->cpumask);
+ cpu_set(j, cpu->cpumask);
+ cpu->cpu_power = SCHED_LOAD_SCALE;
+
+ if (!first_cpu)
+ first_cpu = cpu;
+ if (last_cpu)
+ last_cpu->next = cpu;
+ last_cpu = cpu;
+ }
+ last_cpu->next = first_cpu;
+ }
+
+ first_cpu = last_cpu = NULL;
+ /* Set up physical groups */
+ for_each_cpu(i) {
+ struct sched_domain *cpu_domain = cpu_sched_domain(i);
+ struct sched_group *cpu = &sched_group_phys[i];
+
+ if (i != first_cpu(cpu_domain->span))
+ continue;
+
+ cpu->cpumask = cpu_domain->span;
+ /* See SMT+NUMA setup for comment */
+ cpu->cpu_power = SCHED_LOAD_SCALE + SCHED_LOAD_SCALE*(cpus_weight(cpu->cpumask)-1) / 10;
+
+ if (!first_cpu)
+ first_cpu = cpu;
+ if (last_cpu)
+ last_cpu->next = cpu;
+ last_cpu = cpu;
+ }
+ last_cpu->next = first_cpu;
+
+ mb();
+ for_each_cpu(i) {
+ struct sched_domain *cpu_domain = cpu_sched_domain(i);
+ struct sched_domain *phys_domain = &per_cpu(phys_domains, i);
+ struct sched_group *cpu_group = &sched_group_cpus[i];
+ struct sched_group *phys_group = &sched_group_phys[first_cpu(cpu_domain->span)];
+ cpu_domain->parent = phys_domain;
+ phys_domain->groups = phys_group;
+ cpu_domain->groups = cpu_group;
+ }
+}
+#endif /* CONFIG_NUMA */
+#endif /* CONFIG_SCHED_SMT */
diff -puN include/asm-ppc64/processor.h~sched-ppc64bits include/asm-ppc64/processor.h
--- gr25_work/include/asm-ppc64/processor.h~sched-ppc64bits 2004-03-11 21:27:02.665465998 -0600
+++ gr25_work-anton/include/asm-ppc64/processor.h 2004-03-11 21:27:02.677464095 -0600
@@ -631,6 +631,11 @@ static inline void prefetchw(const void
#define spin_lock_prefetch(x) prefetchw(x)
+#ifdef CONFIG_SCHED_SMT
+#define ARCH_HAS_SCHED_DOMAIN
+#define ARCH_HAS_SCHED_WAKE_BALANCE
+#endif
+
#endif /* ASSEMBLY */
#endif /* __ASM_PPC64_PROCESSOR_H */
_
next prev parent reply other threads:[~2004-03-12 5:14 UTC|newest]
Thread overview: 103+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-03-11 7:31 2.6.4-mm1 Andrew Morton
2004-03-11 8:26 ` 2.6.4-mm1 Jens Axboe
2004-03-11 8:30 ` 2.6.4-mm1 Andrew Morton
2004-03-11 9:34 ` 2.6.4-mm1 Matthias Urlichs
2004-03-11 9:17 ` 2.6.4-mm1 Mickael Marchand
2004-03-11 11:06 ` 2.6.4-mm1 Andrew Morton
2004-03-11 11:22 ` 2.6.4-mm1 Anton Blanchard
2004-03-11 12:23 ` 2.6.4-mm1 Mickael Marchand
2004-03-11 13:40 ` 2.6.4-mm1 jlnance
2004-03-11 19:25 ` 2.6.4-mm1 Mike Fedyk
2004-03-11 22:22 ` 2.6.4-mm1 Andrew Morton
2004-03-11 13:49 ` 2.6.4-mm1 Anton Blanchard
2004-03-11 23:29 ` 2.6.4-mm1 Nick Piggin
2004-03-12 2:03 ` 2.6.4-mm1 Nick Piggin
2004-03-12 2:12 ` 2.6.4-mm1 Anton Blanchard
2004-03-12 5:11 ` Anton Blanchard [this message]
2004-03-11 13:52 ` 2.6.4-mm1 Anton Blanchard
2004-03-11 15:23 ` 2.6.4-mm1 William Lee Irwin III
2004-03-11 15:54 ` 2.6.4-mm1 William Lee Irwin III
2004-03-11 17:06 ` 2.6.4-mm1 Redeeman
2004-03-11 17:53 ` 2.6.4-mm1 Norberto Bensa
2004-03-11 18:09 ` 2.6.4-mm1 Andrew Morton
2004-03-11 18:14 ` 2.6.4-mm1 Redeeman
2004-03-11 18:46 ` 2.6.4-mm1 Andrew Morton
2004-03-11 20:58 ` 2.6.4-mm1 Redeeman
2004-03-11 21:10 ` 2.6.4-mm1 Redeeman
2004-03-11 18:22 ` 2.6.4-mm1 Norberto Bensa
2004-03-11 20:29 ` 2.6.4-mm1 Felipe Alfaro Solana
2004-03-11 17:56 ` 2.6.4-mm1 boot Richard A Nelson
2004-03-12 20:08 ` swsusp (Re: 2.6.4-mm1 boot) Pavel Machek
2004-03-11 20:23 ` 2.6.4-mm1: modular quota needs unknown symbol Adrian Bunk
2004-03-12 8:51 ` Marc-Christian Petersen
2004-03-15 11:02 ` Jan Kara
2004-03-11 20:31 ` 2.6.4-mm1: unknown symbols cauased by remove-more-KERNEL_SYSCALLS.patch Adrian Bunk
2004-03-12 9:14 ` Arnd Bergmann
2004-03-12 9:29 ` Andrew Morton
2004-03-12 9:35 ` Arnd Bergmann
2004-03-12 9:48 ` Andrew Morton
2004-03-12 10:08 ` Dave Jones
2004-03-13 20:25 ` Francois Romieu
2004-03-12 10:11 ` Arjan van de Ven
2004-03-12 19:42 ` 2.6.4-mm1: unknown symbols cauased byremove-more-KERNEL_SYSCALLS.patch Adrian Bunk
2004-03-12 19:45 ` Arjan van de Ven
2004-03-12 1:03 ` 2.6.4-mm1 Neil Brown
2004-03-12 1:22 ` 2.6.4-mm1 Andrew Morton
2004-03-12 5:48 ` 2.6.4-mm1 Neil Brown
2004-03-12 7:50 ` 2.6.4-mm1 Andrew Morton
2004-03-13 10:25 ` 2.6.4-mm1 Neil Brown
2004-03-15 1:46 ` 2.6.4-mm1 - 4g patch breaks when X86_4G not selected Neil Brown
2004-03-15 8:09 ` Ingo Molnar
2004-03-15 22:19 ` Zwane Mwaikambo
2004-03-15 22:41 ` Andrew Morton
2004-03-15 9:19 ` Ingo Molnar
2004-03-16 1:35 ` Neil Brown
2004-03-16 4:52 ` Andrew Morton
2004-03-16 5:03 ` Neil Brown
2004-03-16 7:23 ` Ingo Molnar
2004-03-16 7:28 ` Andrew Morton
2004-03-16 7:24 ` Ingo Molnar
2004-04-04 9:07 ` [PATCH][2.6-mm] setup_identity_mappings depends on zone init Zwane Mwaikambo
2004-04-04 9:27 ` William Lee Irwin III
2004-03-12 9:04 ` 2.6.4-mm1 Helge Hafting
-- strict thread matches above, loose matches on Subject: below --
2004-03-11 18:46 2.6.4-mm1 Nakajima, Jun
2004-03-12 3:04 2.6.4-mm1 Nakajima, Jun
2004-03-12 3:14 ` 2.6.4-mm1 Andi Kleen
2004-03-12 4:24 ` 2.6.4-mm1 Nick Piggin
2004-03-12 14:14 ` 2.6.4-mm1 Andi Kleen
2004-03-12 14:38 ` 2.6.4-mm1 Nick Piggin
[not found] <A6974D8E5F98D511BB910002A50A6647615F4D9F@hdsmsx402.hd.intel.com>
2004-03-12 15:48 ` 2.6.4-mm1 Len Brown
2004-03-12 23:04 2.6.4-mm1 Subodh Shrivastava
2004-03-12 23:55 ` 2.6.4-mm1 Andrew Morton
2004-03-13 13:12 ` 2.6.4-mm1 SUBODH SHRIVASTAVA
2004-03-14 8:04 2.6.4-mm1 Nakajima, Jun
2004-03-14 8:31 ` 2.6.4-mm1 Andrew Morton
2004-03-14 16:13 2.6.4-mm1 Nakajima, Jun
2004-03-14 17:04 ` 2.6.4-mm1 Grzegorz Kulewski
[not found] <1ysXv-wm-11@gated-at.bofh.it>
[not found] ` <1yuG3-2XI-15@gated-at.bofh.it>
2004-03-17 23:21 ` 2.6.4-mm1 Andi Kleen
2004-03-11 19:28 ` 2.6.4-mm1 Andrew Morton
2004-03-11 20:21 ` 2.6.4-mm1 Andi Kleen
2004-03-11 20:48 ` 2.6.4-mm1 Andrew Morton
2004-03-11 23:37 ` 2.6.4-mm1 Nick Piggin
[not found] ` <1yxuq-6y6-13@gated-at.bofh.it>
2004-03-17 23:25 ` 2.6.4-mm1 Andi Kleen
2004-03-11 13:45 ` 2.6.4-mm1 Mickael Marchand
2004-03-11 14:48 ` 2.6.4-mm1 Andi Kleen
2004-03-11 15:10 ` 2.6.4-mm1 Mickael Marchand
2004-03-11 15:20 ` 2.6.4-mm1 Andi Kleen
2004-03-11 21:43 ` 2.6.4-mm1 Joe Thornber
2004-03-11 21:57 ` 2.6.4-mm1 Joe Thornber
2004-03-11 21:59 ` 2.6.4-mm1 Joel Becker
2004-03-11 22:02 ` 2.6.4-mm1 Joel Becker
2004-03-11 22:11 ` 2.6.4-mm1 Chris Friesen
2004-03-11 23:37 ` 2.6.4-mm1 Andi Kleen
2004-03-12 8:22 ` 2.6.4-mm1 Joe Thornber
2004-03-12 9:49 ` 2.6.4-mm1 Joe Thornber
2004-03-12 12:11 ` 2.6.4-mm1 Mickael Marchand
2004-03-12 12:35 ` 2.6.4-mm1 Joe Thornber
2004-03-12 22:48 ` 2.6.4-mm1 Hugo Mills
2004-03-11 21:38 ` 2.6.4-mm1 Joe Thornber
2004-03-11 23:33 ` 2.6.4-mm1 Andi Kleen
[not found] <1yygN-7Ut-65@gated-at.bofh.it>
[not found] ` <1yyqt-83X-23@gated-at.bofh.it>
[not found] ` <1yyqs-83X-17@gated-at.bofh.it>
[not found] ` <1yyJK-8mD-41@gated-at.bofh.it>
[not found] ` <1yzPs-1bI-21@gated-at.bofh.it>
[not found] ` <1yGe9-7Rk-23@gated-at.bofh.it>
[not found] ` <1yI6f-1Bj-3@gated-at.bofh.it>
[not found] ` <1yQdz-1Uf-7@gated-at.bofh.it>
[not found] ` <1yRCI-3lE-19@gated-at.bofh.it>
2004-03-19 5:58 ` 2.6.4-mm1 Andi Kleen
2004-03-12 13:49 ` 2.6.4-mm1 Joe Thornber
2004-03-12 14:03 ` 2.6.4-mm1 Andi Kleen
[not found] ` <1yTO6-5JU-25@gated-at.bofh.it>
[not found] ` <1yU7Z-624-11@gated-at.bofh.it>
2004-03-19 6:00 ` 2.6.4-mm1 Andi Kleen
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=20040312051135.GI16751@krispykreme \
--to=anton@samba.org \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=piggin@cyberone.com.au \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox