public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
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 */

_

  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