2003-05-06 01:17:51

by Matthew Dobson

[permalink] [raw]
Subject: [patch] Re: Bug 619 - sched_best_cpu does not pick best cpu (1/2)

diff -Nur --exclude-from=/home/mcd/.dontdiff linux-2.5.69-vanilla/drivers/base/cpu.c linux-2.5.69-add_linux_topo/drivers/base/cpu.c
--- linux-2.5.69-vanilla/drivers/base/cpu.c Sun May 4 16:53:09 2003
+++ linux-2.5.69-add_linux_topo/drivers/base/cpu.c Mon May 5 17:17:39 2003
@@ -6,8 +6,7 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/cpu.h>
-
-#include <asm/topology.h>
+#include <linux/topology.h>


struct class cpu_class = {
diff -Nur --exclude-from=/home/mcd/.dontdiff linux-2.5.69-vanilla/drivers/base/memblk.c linux-2.5.69-add_linux_topo/drivers/base/memblk.c
--- linux-2.5.69-vanilla/drivers/base/memblk.c Sun May 4 16:53:57 2003
+++ linux-2.5.69-add_linux_topo/drivers/base/memblk.c Mon May 5 17:17:39 2003
@@ -7,8 +7,7 @@
#include <linux/init.h>
#include <linux/memblk.h>
#include <linux/node.h>
-
-#include <asm/topology.h>
+#include <linux/topology.h>


static struct class memblk_class = {
diff -Nur --exclude-from=/home/mcd/.dontdiff linux-2.5.69-vanilla/drivers/base/node.c linux-2.5.69-add_linux_topo/drivers/base/node.c
--- linux-2.5.69-vanilla/drivers/base/node.c Sun May 4 16:53:02 2003
+++ linux-2.5.69-add_linux_topo/drivers/base/node.c Mon May 5 17:17:39 2003
@@ -7,8 +7,7 @@
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/node.h>
-
-#include <asm/topology.h>
+#include <linux/topology.h>


static struct class node_class = {
diff -Nur --exclude-from=/home/mcd/.dontdiff linux-2.5.69-vanilla/include/asm-i386/cpu.h linux-2.5.69-add_linux_topo/include/asm-i386/cpu.h
--- linux-2.5.69-vanilla/include/asm-i386/cpu.h Sun May 4 16:53:35 2003
+++ linux-2.5.69-add_linux_topo/include/asm-i386/cpu.h Mon May 5 17:17:39 2003
@@ -3,8 +3,8 @@

#include <linux/device.h>
#include <linux/cpu.h>
+#include <linux/topology.h>

-#include <asm/topology.h>
#include <asm/node.h>

struct i386_cpu {
diff -Nur --exclude-from=/home/mcd/.dontdiff linux-2.5.69-vanilla/include/asm-i386/memblk.h linux-2.5.69-add_linux_topo/include/asm-i386/memblk.h
--- linux-2.5.69-vanilla/include/asm-i386/memblk.h Sun May 4 16:53:31 2003
+++ linux-2.5.69-add_linux_topo/include/asm-i386/memblk.h Mon May 5 17:17:39 2003
@@ -4,8 +4,8 @@
#include <linux/device.h>
#include <linux/mmzone.h>
#include <linux/memblk.h>
+#include <linux/topology.h>

-#include <asm/topology.h>
#include <asm/node.h>

struct i386_memblk {
diff -Nur --exclude-from=/home/mcd/.dontdiff linux-2.5.69-vanilla/include/asm-i386/node.h linux-2.5.69-add_linux_topo/include/asm-i386/node.h
--- linux-2.5.69-vanilla/include/asm-i386/node.h Sun May 4 16:53:08 2003
+++ linux-2.5.69-add_linux_topo/include/asm-i386/node.h Mon May 5 17:17:39 2003
@@ -4,8 +4,7 @@
#include <linux/device.h>
#include <linux/mmzone.h>
#include <linux/node.h>
-
-#include <asm/topology.h>
+#include <linux/topology.h>

struct i386_node {
struct node node;
diff -Nur --exclude-from=/home/mcd/.dontdiff linux-2.5.69-vanilla/include/linux/mmzone.h linux-2.5.69-add_linux_topo/include/linux/mmzone.h
--- linux-2.5.69-vanilla/include/linux/mmzone.h Sun May 4 16:53:31 2003
+++ linux-2.5.69-add_linux_topo/include/linux/mmzone.h Mon May 5 17:17:39 2003
@@ -255,7 +255,7 @@
#define MAX_NR_MEMBLKS 1
#endif /* CONFIG_NUMA */

-#include <asm/topology.h>
+#include <linux/topology.h>
/* Returns the number of the current Node. */
#define numa_node_id() (cpu_to_node(smp_processor_id()))

diff -Nur --exclude-from=/home/mcd/.dontdiff linux-2.5.69-vanilla/include/linux/topology.h linux-2.5.69-add_linux_topo/include/linux/topology.h
--- linux-2.5.69-vanilla/include/linux/topology.h Wed Dec 31 16:00:00 1969
+++ linux-2.5.69-add_linux_topo/include/linux/topology.h Mon May 5 17:43:35 2003
@@ -0,0 +1,32 @@
+/*
+ * include/linux/topology.h
+ *
+ * Written by: Matthew Dobson, IBM Corporation
+ *
+ * Copyright (C) 2002, IBM Corp.
+ *
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Send feedback to <[email protected]>
+ */
+#ifndef _LINUX_TOPOLOGY_H
+#define _LINUX_TOPOLOGY_H
+
+#include <asm/topology.h>
+
+#endif /* _LINUX_TOPOLOGY_H */
diff -Nur --exclude-from=/home/mcd/.dontdiff linux-2.5.69-vanilla/mm/page_alloc.c linux-2.5.69-add_linux_topo/mm/page_alloc.c
--- linux-2.5.69-vanilla/mm/page_alloc.c Sun May 4 16:53:01 2003
+++ linux-2.5.69-add_linux_topo/mm/page_alloc.c Mon May 5 17:17:39 2003
@@ -28,8 +28,7 @@
#include <linux/blkdev.h>
#include <linux/slab.h>
#include <linux/notifier.h>
-
-#include <asm/topology.h>
+#include <linux/topology.h>

DECLARE_BITMAP(node_online_map, MAX_NUMNODES);
DECLARE_BITMAP(memblk_online_map, MAX_NR_MEMBLKS);
diff -Nur --exclude-from=/home/mcd/.dontdiff linux-2.5.69-vanilla/mm/vmscan.c linux-2.5.69-add_linux_topo/mm/vmscan.c
--- linux-2.5.69-vanilla/mm/vmscan.c Sun May 4 16:53:02 2003
+++ linux-2.5.69-add_linux_topo/mm/vmscan.c Mon May 5 17:17:39 2003
@@ -28,10 +28,10 @@
#include <linux/pagevec.h>
#include <linux/backing-dev.h>
#include <linux/rmap-locking.h>
+#include <linux/topology.h>

#include <asm/pgalloc.h>
#include <asm/tlbflush.h>
-#include <asm/topology.h>
#include <asm/div64.h>

#include <linux/swapops.h>


Attachments:
add_linux_topo.patch (5.72 kB)

2003-05-15 01:12:56

by Andrew Theurer

[permalink] [raw]
Subject: [patch] Re: Bug 619 - sched_best_cpu does not pick best cpu (1/1)

I believe this will work for ppc64:

[root@hearse root]# diffstat patch-nr_cpus_node-ppc64-2.5.69
arch/ppc64/mm/numa.c | 6 +++++-
include/asm-ppc64/mmzone.h | 1 +
include/asm-ppc64/topology.h | 5 +++++
3 files changed, 11 insertions(+), 1 deletion(-)


diff -Naur 2.5.69-bk-5-8-2003-numa/arch/ppc64/mm/numa.c
2.5.69-bk-5-8-2003-numa-nrcpusnode/arch/ppc64/mm/numa.c
--- 2.5.69-bk-5-8-2003-numa/arch/ppc64/mm/numa.c 2003-05-14 18:11:35.000000000
-0700
+++ 2.5.69-bk-5-8-2003-numa-nrcpusnode/arch/ppc64/mm/numa.c 2003-05-14
18:18:06.000000000 -0700
@@ -25,6 +25,7 @@
int numa_memory_lookup_table[MAX_MEMORY >> MEMORY_INCREMENT_SHIFT] =
{ [ 0 ... ((MAX_MEMORY >> MEMORY_INCREMENT_SHIFT) - 1)] = -1};
unsigned long numa_cpumask_lookup_table[MAX_NUMNODES];
+int nr_cpus_in_node[MAX_NUMNODES] = { [0 ... (MAX_NUMNODES -1)] = 0};

struct pglist_data node_data[MAX_NUMNODES];
bootmem_data_t plat_node_bdata[MAX_NUMNODES];
@@ -33,7 +34,10 @@
{
dbg("cpu %d maps to domain %d\n", cpu, node);
numa_cpu_lookup_table[cpu] = node;
- numa_cpumask_lookup_table[node] |= 1UL << cpu;
+ if (!(numa_cpumask_lookup_table[node] & 1UL << cpu)) {
+ numa_cpumask_lookup_table[node] |= 1UL << cpu;
+ nr_cpus_in_node[node]++;
+ }
}

static int __init parse_numa_properties(void)
diff -Naur 2.5.69-bk-5-8-2003-numa/include/asm-ppc64/mmzone.h
2.5.69-bk-5-8-2003-numa-nrcpusnode/include/asm-ppc64/mmzone.h
--- 2.5.69-bk-5-8-2003-numa/include/asm-ppc64/mmzone.h 2003-04-24
14:17:14.000000000 -0700
+++ 2.5.69-bk-5-8-2003-numa-nrcpusnode/include/asm-ppc64/mmzone.h 2003-05-14
18:07:35.000000000 -0700
@@ -21,6 +21,7 @@
extern int numa_cpu_lookup_table[];
extern int numa_memory_lookup_table[];
extern unsigned long numa_cpumask_lookup_table[];
+extern int nr_cpus_in_node[];

#define MAX_MEMORY (1UL << 41)
/* 256MB regions */
diff -Naur 2.5.69-bk-5-8-2003-numa/include/asm-ppc64/topology.h
2.5.69-bk-5-8-2003-numa-nrcpusnode/include/asm-ppc64/topology.h
--- 2.5.69-bk-5-8-2003-numa/include/asm-ppc64/topology.h 2003-05-14
11:03:10.000000000 -0700
+++ 2.5.69-bk-5-8-2003-numa-nrcpusnode/include/asm-ppc64/topology.h 2003-05-14
18:08:38.000000000 -0700
@@ -6,6 +6,11 @@

#ifdef CONFIG_NUMA

+static inline int nr_cpus_node(int node)
+{
+ return nr_cpus_in_node[node];
+}
+
static inline int cpu_to_node(int cpu)
{
int node;

2003-05-15 01:22:56

by Zwane Mwaikambo

[permalink] [raw]
Subject: Re: [patch] Re: Bug 619 - sched_best_cpu does not pick best cpu (1/1)

On Wed, 14 May 2003, Andrew Theurer wrote:

> +int nr_cpus_in_node[MAX_NUMNODES] = { [0 ... (MAX_NUMNODES -1)] = 0};
[snip...]
> +static inline int nr_cpus_node(int node)
> +{
> + return nr_cpus_in_node[node];
> +}
> +
> static inline int cpu_to_node(int cpu)
> {
> int node;

How about an hweight() on node_to_cpumask?

Zwane
--
function.linuxpower.ca

2003-05-15 01:31:56

by Andrew Theurer

[permalink] [raw]
Subject: Re: [patch] Re: Bug 619 - sched_best_cpu does not pick best cpu (1/1)

On Wednesday 14 May 2003 20:26, Zwane Mwaikambo wrote:
> On Wed, 14 May 2003, Andrew Theurer wrote:
> > +int nr_cpus_in_node[MAX_NUMNODES] = { [0 ... (MAX_NUMNODES -1)] = 0};
>
> [snip...]
>
> > +static inline int nr_cpus_node(int node)
> > +{
> > + return nr_cpus_in_node[node];
> > +}
> > +
> > static inline int cpu_to_node(int cpu)
> > {
> > int node;
>
> How about an hweight() on node_to_cpumask?

I'd rather cache it. I believe hweight() will be the asm-generic routine.

-Andrew