All of lore.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 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.