All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch] (1/5) Core driverfs Topology 2.5.44
       [not found]   ` <3DB5FCC5.E54808E@digeo.com>
@ 2002-10-23 20:55     ` Matthew Dobson
  2002-10-23 20:59       ` [patch] (2/5) i386 " Matthew Dobson
  0 siblings, 1 reply; 5+ messages in thread
From: Matthew Dobson @ 2002-10-23 20:55 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Patrick Mochel, Martin J. Bligh, linux-kernel, Michael Hohnbaum

[-- Attachment #1: Type: text/plain, Size: 417 bytes --]

Update/Create core files for DriverFS Topology.

This patch creates the generic structures that are (will be) embedded in 
the per-arch structures.  Also creates calls to register these generic 
structures (CPUs, MemBlks, & Nodes).

Note that without arch-specific structures in which to embed these 
structures, and an arch-specific initialization routine, these 
functions/structures remain unused.

Cheers!

-Matt

[-- Attachment #2: 00-core_additions.patch --]
[-- Type: text/plain, Size: 11223 bytes --]

diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/arch/i386/kernel/cpu/common.c linux-2.5.44-core_additions/arch/i386/kernel/cpu/common.c
--- linux-2.5.44-base/arch/i386/kernel/cpu/common.c	Fri Oct 18 21:01:09 2002
+++ linux-2.5.44-core_additions/arch/i386/kernel/cpu/common.c	Wed Oct 23 12:00:19 2002
@@ -1,7 +1,6 @@
 #include <linux/init.h>
 #include <linux/string.h>
 #include <linux/delay.h>
-#include <linux/cpu.h>
 #include <linux/smp.h>
 #include <asm/semaphore.h>
 #include <asm/processor.h>
@@ -507,37 +506,3 @@
 	current->used_math = 0;
 	stts();
 }
-
-/*
- * Bulk registration of the cpu devices with the system.
- * Some of this stuff could possibly be moved into a shared 
- * location..
- * Also, these devices should be integrated with other CPU data..
- */
-
-static struct cpu cpu_devices[NR_CPUS];
-
-static struct device_driver cpu_driver = {
-	.name		= "cpu",
-	.bus		= &system_bus_type,
-	.devclass	= &cpu_devclass,
-};
-
-static int __init register_cpus(void)
-{
-	int i;
-
-	driver_register(&cpu_driver);
-
-	for (i = 0; i < NR_CPUS; i++) {
-		struct sys_device * sysdev = &cpu_devices[i].sysdev;
-		sysdev->name = "cpu";
-		sysdev->id = i;
-		sysdev->dev.driver = &cpu_driver;
-		if (cpu_possible(i))
-			sys_device_register(sysdev);
-	}
-	return 0;
-}
-
-subsys_initcall(register_cpus);
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/drivers/base/Makefile linux-2.5.44-core_additions/drivers/base/Makefile
--- linux-2.5.44-base/drivers/base/Makefile	Fri Oct 18 21:01:19 2002
+++ linux-2.5.44-core_additions/drivers/base/Makefile	Wed Oct 23 12:00:19 2002
@@ -4,11 +4,13 @@
 			driver.o class.o intf.o platform.o \
 			cpu.o
 
+obj-$(CONFIG_NUMA)	+= node.o  memblk.o
+
 obj-y		+= fs/
 
 obj-$(CONFIG_HOTPLUG)	+= hotplug.o
 
 export-objs	:= core.o power.o sys.o bus.o driver.o \
-			class.o intf.o platform.o cpu.o 
+			class.o intf.o platform.o
 
 include $(TOPDIR)/Rules.make
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/drivers/base/cpu.c linux-2.5.44-core_additions/drivers/base/cpu.c
--- linux-2.5.44-base/drivers/base/cpu.c	Fri Oct 18 21:01:21 2002
+++ linux-2.5.44-core_additions/drivers/base/cpu.c	Wed Oct 23 12:00:19 2002
@@ -1,5 +1,5 @@
 /*
- * cpu.c - basic cpu class support
+ * drivers/base/cpu.c - basic CPU class support
  */
 
 #include <linux/device.h>
@@ -7,22 +7,48 @@
 #include <linux/init.h>
 #include <linux/cpu.h>
 
+#include <asm/topology.h>
+
+
 static int cpu_add_device(struct device * dev)
 {
 	return 0;
 }
-
 struct device_class cpu_devclass = {
 	.name		= "cpu",
 	.add_device	= cpu_add_device,
 };
 
 
-static int __init cpu_devclass_init(void)
+struct device_driver cpu_driver = {
+	.name		= "cpu",
+	.bus		= &system_bus_type,
+	.devclass	= &cpu_devclass,
+};
+
+
+/*
+ * register_cpu - Setup a driverfs device for a CPU.
+ * @num - CPU number to use when creating the device.
+ *
+ * Initialize and register the CPU device.
+ */
+void __init register_cpu(struct cpu *cpu, int num, struct node *root)
 {
-	return devclass_register(&cpu_devclass);
+	cpu->node_id = __cpu_to_node(num);
+	cpu->sysdev.name = "cpu";
+	cpu->sysdev.id = num;
+	if (root)
+		cpu->sysdev.root = &root->sysroot;
+	snprintf(cpu->sysdev.dev.name, DEVICE_NAME_SIZE, "CPU %u", num);
+	cpu->sysdev.dev.driver = &cpu_driver;
+	sys_device_register(&cpu->sysdev);
 }
 
-postcore_initcall(cpu_devclass_init);
 
-EXPORT_SYMBOL(cpu_devclass);
+static int __init register_cpu_type(void)
+{
+	driver_register(&cpu_driver);
+	return devclass_register(&cpu_devclass);
+}
+postcore_initcall(register_cpu_type);
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/drivers/base/memblk.c linux-2.5.44-core_additions/drivers/base/memblk.c
--- linux-2.5.44-base/drivers/base/memblk.c	Wed Dec 31 16:00:00 1969
+++ linux-2.5.44-core_additions/drivers/base/memblk.c	Wed Oct 23 12:00:19 2002
@@ -0,0 +1,55 @@
+/*
+ * drivers/base/memblk.c - basic Memory Block class support
+ */
+
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/memblk.h>
+#include <linux/node.h>
+
+#include <asm/topology.h>
+
+
+static int memblk_add_device(struct device * dev)
+{
+	return 0;
+}
+struct device_class memblk_devclass = {
+	.name		= "memblk",
+	.add_device	= memblk_add_device,
+};
+
+
+struct device_driver memblk_driver = {
+	.name		= "memblk",
+	.bus		= &system_bus_type,
+	.devclass	= &memblk_devclass,
+};
+
+
+/*
+ * register_memblk - Setup a driverfs device for a MemBlk
+ * @num - MemBlk number to use when creating the device.
+ *
+ * Initialize and register the MemBlk device.
+ */
+void __init register_memblk(struct memblk *memblk, int num, struct node *root)
+{
+	memblk->node_id = __memblk_to_node(num);
+	memblk->sysdev.name = "memblk";
+	memblk->sysdev.id = num;
+	if (root)
+		memblk->sysdev.root = &root->sysroot;
+	snprintf(memblk->sysdev.dev.name, DEVICE_NAME_SIZE, "Memory Block %u", num);
+	memblk->sysdev.dev.driver = &memblk_driver;
+	sys_device_register(&memblk->sysdev);
+}
+
+
+static int __init register_memblk_type(void)
+{
+	driver_register(&memblk_driver);
+	return devclass_register(&memblk_devclass);
+}
+postcore_initcall(register_memblk_type);
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/drivers/base/node.c linux-2.5.44-core_additions/drivers/base/node.c
--- linux-2.5.44-base/drivers/base/node.c	Wed Dec 31 16:00:00 1969
+++ linux-2.5.44-core_additions/drivers/base/node.c	Wed Oct 23 12:01:20 2002
@@ -0,0 +1,66 @@
+/*
+ * drivers/base/node.c - basic Node class support
+ */
+
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/node.h>
+
+#include <asm/topology.h>
+
+
+static int node_add_device(struct device * dev)
+{
+	return 0;
+}
+struct device_class node_devclass = {
+	.name		= "node",
+	.add_device	= node_add_device,
+};
+
+
+struct device_driver node_driver = {
+	.name		= "node",
+	.bus		= &system_bus_type,
+	.devclass	= &node_devclass,
+};
+
+
+static ssize_t node_read_cpumap(struct device * dev, char * buf, size_t count, loff_t off)
+{
+	struct node *node_dev = to_node(to_root(dev));
+        return off ? 0 : sprintf(buf,"%lx\n",node_dev->cpumap);
+}
+static DEVICE_ATTR(cpumap,S_IRUGO,node_read_cpumap,NULL);
+
+
+/*
+ * register_node - Setup a driverfs device for a node.
+ * @num - Node number to use when creating the device.
+ *
+ * Initialize and register the node device.
+ */
+void __init register_node(struct node *node, int num, struct node *parent)
+{
+	node->cpumap = __node_to_cpu_mask(num);
+	node->sysroot.id = num;
+	if (parent)
+		node->sysroot.dev.parent = &parent->sysroot.sysdev;
+	snprintf(node->sysroot.dev.name, DEVICE_NAME_SIZE, "Node %u", num);
+	snprintf(node->sysroot.dev.bus_id, BUS_ID_SIZE, "node%u", num);
+	node->sysroot.dev.driver = &node_driver;
+	node->sysroot.dev.bus = &system_bus_type;
+	if (!sys_register_root(&node->sysroot)){
+		device_create_file(&node->sysroot.dev, &dev_attr_cpumap);
+	}
+}
+
+
+static int __init register_node_type(void)
+{
+	driver_register(&node_driver);
+	return devclass_register(&node_devclass);
+}
+postcore_initcall(register_node_type);
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/drivers/base/sys.c linux-2.5.44-core_additions/drivers/base/sys.c
--- linux-2.5.44-base/drivers/base/sys.c	Fri Oct 18 21:00:42 2002
+++ linux-2.5.44-core_additions/drivers/base/sys.c	Wed Oct 23 12:00:19 2002
@@ -55,6 +55,9 @@
 	if (!root)
 		return -EINVAL;
 
+	if (!root->dev.parent)
+		root->dev.parent = &system_bus;
+
 	pr_debug("Registering system board %d\n",root->id);
 
 	error = device_register(&root->dev);
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/include/linux/cpu.h linux-2.5.44-core_additions/include/linux/cpu.h
--- linux-2.5.44-base/include/linux/cpu.h	Fri Oct 18 21:01:17 2002
+++ linux-2.5.44-core_additions/include/linux/cpu.h	Wed Oct 23 12:00:19 2002
@@ -1,5 +1,5 @@
 /*
- * cpu.h - generic cpu defition
+ * include/linux/cpu.h - generic cpu definition
  *
  * This is mainly for topological representation. We define the 
  * basic 'struct cpu' here, which can be embedded in per-arch 
@@ -15,14 +15,18 @@
  * See the following for how to do this: 
  * - drivers/base/intf.c 
  * - Documentation/driver-model/interface.txt
- *
  */
+#ifndef _LINUX_CPU_H_
+#define _LINUX_CPU_H_
 
 #include <linux/device.h>
-
-extern struct device_class cpu_devclass;
+#include <linux/node.h>
 
 struct cpu {
+	int node_id;		/* The node which contains the CPU */
 	struct sys_device sysdev;
 };
 
+extern void register_cpu(struct cpu *, int, struct node *);
+
+#endif /* _LINUX_CPU_H_ */
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/include/linux/memblk.h linux-2.5.44-core_additions/include/linux/memblk.h
--- linux-2.5.44-base/include/linux/memblk.h	Wed Dec 31 16:00:00 1969
+++ linux-2.5.44-core_additions/include/linux/memblk.h	Wed Oct 23 12:00:19 2002
@@ -0,0 +1,32 @@
+/*
+ * include/linux/memblk.h - generic memblk definition
+ *
+ * This is mainly for topological representation. We define the 
+ * basic 'struct memblk' here, which can be embedded in per-arch 
+ * definitions of memory blocks.
+ *
+ * Basic handling of the devices is done in drivers/base/memblk.c
+ * and system devices are handled in drivers/base/sys.c. 
+ *
+ * MemBlks are exported via driverfs in the class/memblk/devices/
+ * directory. 
+ *
+ * Per-memblk interfaces can be implemented using a struct device_interface. 
+ * See the following for how to do this: 
+ * - drivers/base/intf.c 
+ * - Documentation/driver-model/interface.txt
+ */
+#ifndef _LINUX_MEMBLK_H_
+#define _LINUX_MEMBLK_H_
+
+#include <linux/device.h>
+#include <linux/node.h>
+
+struct memblk {
+	int node_id;		/* The node which contains the MemBlk */
+	struct sys_device sysdev;
+};
+
+extern void register_memblk(struct memblk *, int, struct node *);
+
+#endif /* _LINUX_MEMBLK_H_ */
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/include/linux/node.h linux-2.5.44-core_additions/include/linux/node.h
--- linux-2.5.44-base/include/linux/node.h	Wed Dec 31 16:00:00 1969
+++ linux-2.5.44-core_additions/include/linux/node.h	Wed Oct 23 12:00:19 2002
@@ -0,0 +1,34 @@
+/*
+ * include/linux/node.h - generic node definition
+ *
+ * This is mainly for topological representation. We define the 
+ * basic 'struct node' here, which can be embedded in per-arch 
+ * definitions of processors.
+ *
+ * Basic handling of the devices is done in drivers/base/node.c
+ * and system devices are handled in drivers/base/sys.c. 
+ *
+ * Nodes are exported via driverfs in the class/node/devices/
+ * directory. 
+ *
+ * Per-node interfaces can be implemented using a struct device_interface. 
+ * See the following for how to do this: 
+ * - drivers/base/intf.c 
+ * - Documentation/driver-model/interface.txt
+ */
+#ifndef _LINUX_NODE_H_
+#define _LINUX_NODE_H_
+
+#include <linux/device.h>
+
+struct node {
+	unsigned long cpumap;	/* Bitmap of CPUs on the Node */
+	struct sys_root sysroot;
+};
+
+extern void register_node(struct node *, int, struct node *);
+
+#define to_node(_root) container_of(_root, struct node, sysroot)
+#define to_root(_dev) container_of(_dev, struct sys_root, dev)
+
+#endif /* _LINUX_NODE_H_ */

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [patch] (2/5) i386 driverfs Topology 2.5.44
  2002-10-23 20:55     ` [patch] (1/5) Core driverfs Topology 2.5.44 Matthew Dobson
@ 2002-10-23 20:59       ` Matthew Dobson
  2002-10-23 21:02         ` [patch] (3/5) NUMA meminfo for " Matthew Dobson
  0 siblings, 1 reply; 5+ messages in thread
From: Matthew Dobson @ 2002-10-23 20:59 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Patrick Mochel, Martin J. Bligh, linux-kernel, Michael Hohnbaum

[-- Attachment #1: Type: text/plain, Size: 348 bytes --]

Update/Create i386 specific files for DriverFS Topology.

This patch creates the i386 specific files/functions/structures to 
implement
driverfs Topology.  These structures have the generic CPU/MemBlk/Node 
structures
embedded in them.

This patch also creates the arch-specific initialization routine to 
instantiate the topology.

Cheers!

-Matt

[-- Attachment #2: 01-arch_additions.patch --]
[-- Type: text/plain, Size: 5430 bytes --]

diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/arch/i386/mach-generic/Makefile linux-2.5.44-arch_additions/arch/i386/mach-generic/Makefile
--- linux-2.5.44-base/arch/i386/mach-generic/Makefile	Fri Oct 18 21:01:19 2002
+++ linux-2.5.44-arch_additions/arch/i386/mach-generic/Makefile	Wed Oct 23 12:06:18 2002
@@ -4,6 +4,6 @@
 
 EXTRA_CFLAGS	+= -I../kernel
 
-obj-y				:= setup.o
+obj-y				:= setup.o topology.o
 
 include $(TOPDIR)/Rules.make
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/arch/i386/mach-generic/topology.c linux-2.5.44-arch_additions/arch/i386/mach-generic/topology.c
--- linux-2.5.44-base/arch/i386/mach-generic/topology.c	Wed Dec 31 16:00:00 1969
+++ linux-2.5.44-arch_additions/arch/i386/mach-generic/topology.c	Wed Oct 23 12:07:47 2002
@@ -0,0 +1,69 @@
+/*
+ * arch/i386/mach-generic/topology.c - Populate driverfs with topology information
+ *
+ * Written by: Matthew Dobson, IBM Corporation
+ * Original Code: Paul Dorwin, IBM Corporation, Patrick Mochel, OSDL
+ *
+ * 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 <colpatch@us.ibm.com>
+ */
+#include <linux/init.h>
+#include <asm/cpu.h>
+
+struct i386_cpu cpu_devices[NR_CPUS];
+
+#ifdef CONFIG_NUMA
+#include <linux/mmzone.h>
+#include <asm/node.h>
+#include <asm/memblk.h>
+
+struct i386_node node_devices[MAX_NUMNODES];
+struct i386_memblk memblk_devices[MAX_NR_MEMBLKS];
+
+extern int numnodes;
+
+static int __init topology_init(void)
+{
+	int i;
+
+	for (i = 0; i < numnodes; i++)
+		arch_register_node(i);
+	for (i = 0; i < num_online_cpus(); i++)
+		arch_register_cpu(i);
+	for (i = 0; i < numnodes; i++)
+		arch_register_memblk(i);
+	return 0;
+}
+
+#else /* !CONFIG_NUMA */
+
+static int __init topology_init(void)
+{
+	int i;
+
+	for (i = 0; i < num_online_cpus(); i++)
+		arch_register_cpu(i);
+	return 0;
+}
+
+#endif /* CONFIG_NUMA */
+
+subsys_initcall(topology_init);
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/include/asm-i386/cpu.h linux-2.5.44-arch_additions/include/asm-i386/cpu.h
--- linux-2.5.44-base/include/asm-i386/cpu.h	Wed Dec 31 16:00:00 1969
+++ linux-2.5.44-arch_additions/include/asm-i386/cpu.h	Wed Oct 23 12:06:18 2002
@@ -0,0 +1,30 @@
+#ifndef _ASM_I386_CPU_H_
+#define _ASM_I386_CPU_H_
+
+#include <linux/device.h>
+#include <linux/cpu.h>
+
+#include <asm/topology.h>
+#include <asm/node.h>
+
+struct i386_cpu {
+	struct cpu cpu;
+};
+extern struct i386_cpu cpu_devices[NR_CPUS];
+
+
+#ifdef CONFIG_NUMA
+static inline void arch_register_cpu(int num){
+	int p_node = __cpu_to_node(num);
+	
+	if (p_node >= 0 && p_node < NR_CPUS)
+		register_cpu(&cpu_devices[num].cpu, num, 
+			&node_devices[p_node].node);
+}
+#else /* !CONFIG_NUMA */
+static inline void arch_register_cpu(int num){
+	register_cpu(&cpu_devices[num].cpu, num, (struct node *) NULL);
+}
+#endif /* CONFIG_NUMA */
+
+#endif /* _ASM_I386_CPU_H_ */
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/include/asm-i386/memblk.h linux-2.5.44-arch_additions/include/asm-i386/memblk.h
--- linux-2.5.44-base/include/asm-i386/memblk.h	Wed Dec 31 16:00:00 1969
+++ linux-2.5.44-arch_additions/include/asm-i386/memblk.h	Wed Oct 23 12:06:18 2002
@@ -0,0 +1,24 @@
+#ifndef _ASM_I386_MEMBLK_H_
+#define _ASM_I386_MEMBLK_H_
+
+#include <linux/device.h>
+#include <linux/mmzone.h>
+#include <linux/memblk.h>
+
+#include <asm/topology.h>
+#include <asm/node.h>
+
+struct i386_memblk {
+	struct memblk memblk;
+};
+extern struct i386_memblk memblk_devices[MAX_NR_MEMBLKS];
+
+static inline void arch_register_memblk(int num){
+	int p_node = __memblk_to_node(num);
+
+	if (p_node >= 0 && p_node < MAX_NR_MEMBLKS)
+		register_memblk(&memblk_devices[num].memblk, num, 
+			&node_devices[p_node].node);
+}
+
+#endif /* _ASM_I386_MEMBLK_H_ */
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/include/asm-i386/node.h linux-2.5.44-arch_additions/include/asm-i386/node.h
--- linux-2.5.44-base/include/asm-i386/node.h	Wed Dec 31 16:00:00 1969
+++ linux-2.5.44-arch_additions/include/asm-i386/node.h	Wed Oct 23 12:06:18 2002
@@ -0,0 +1,26 @@
+#ifndef _ASM_I386_NODE_H_
+#define _ASM_I386_NODE_H_
+
+#include <linux/device.h>
+#include <linux/mmzone.h>
+#include <linux/node.h>
+
+#include <asm/topology.h>
+
+struct i386_node {
+	struct node node;
+};
+extern struct i386_node node_devices[MAX_NUMNODES];
+
+static inline void arch_register_node(int num){
+	int p_node = __parent_node(num);
+
+	if (p_node != num)
+		register_node(&node_devices[num].node, num, 
+			&node_devices[p_node].node);
+	else
+		register_node(&node_devices[num].node, num, 
+			(struct node *) NULL);
+}
+
+#endif /* _ASM_I386_NODE_H_ */

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [patch] (3/5) NUMA meminfo for driverfs Topology 2.5.44
  2002-10-23 20:59       ` [patch] (2/5) i386 " Matthew Dobson
@ 2002-10-23 21:02         ` Matthew Dobson
  2002-10-23 21:05           ` [patch] (4/5) create memblk_online_map 2.5.44 Matthew Dobson
  0 siblings, 1 reply; 5+ messages in thread
From: Matthew Dobson @ 2002-10-23 21:02 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Patrick Mochel, Martin J. Bligh, linux-kernel, Michael Hohnbaum

[-- Attachment #1: Type: text/plain, Size: 271 bytes --]

Create nodeX/meminfo files for DriverFS Topology.

This patch adds code to DriverFS Topology to expose per-node memory 
statistics.
This information is exposed via: cat nodeX/meminfo

The patch also adds 2 helper functions to gather per-node memory info.

Cheers!

-Matt

[-- Attachment #2: 02-meminfo_addition.patch --]
[-- Type: text/plain, Size: 3753 bytes --]

diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/drivers/base/node.c linux-2.5.44-meminfo_addition/drivers/base/node.c
--- linux-2.5.44-base/drivers/base/node.c	Wed Oct 23 12:01:20 2002
+++ linux-2.5.44-meminfo_addition/drivers/base/node.c	Wed Oct 23 12:10:57 2002
@@ -35,6 +35,34 @@
 }
 static DEVICE_ATTR(cpumap,S_IRUGO,node_read_cpumap,NULL);
 
+#define K(x) ((x) << (PAGE_SHIFT - 10))
+static ssize_t node_read_meminfo(struct device * dev, char * buf, size_t count, loff_t off)
+{
+	struct sys_root *node = to_root(dev);
+	int nid = node->id;
+	struct sysinfo i;
+	si_meminfo_node(&i, nid);
+	return off ? 0 : sprintf(buf, "\n"
+			"Node %d MemTotal:     %8lu kB\n"
+			"Node %d MemFree:      %8lu kB\n"
+			"Node %d MemUsed:      %8lu kB\n"
+			"Node %d HighTotal:    %8lu kB\n"
+			"Node %d HighFree:     %8lu kB\n"
+			"Node %d LowTotal:     %8lu kB\n"
+			"Node %d LowFree:      %8lu kB\n",
+			nid, K(i.totalram),
+			nid, K(i.freeram),
+			nid, K(i.totalram-i.freeram),
+			nid, K(i.totalhigh),
+			nid, K(i.freehigh),
+			nid, K(i.totalram-i.totalhigh),
+			nid, K(i.freeram-i.freehigh));
+
+	return 0;
+}
+#undef K 
+static DEVICE_ATTR(meminfo,S_IRUGO,node_read_meminfo,NULL);
+
 
 /*
  * register_node - Setup a driverfs device for a node.
@@ -54,6 +82,7 @@
 	node->sysroot.dev.bus = &system_bus_type;
 	if (!sys_register_root(&node->sysroot)){
 		device_create_file(&node->sysroot.dev, &dev_attr_cpumap);
+		device_create_file(&node->sysroot.dev, &dev_attr_meminfo);
 	}
 }
 
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/include/linux/mm.h linux-2.5.44-meminfo_addition/include/linux/mm.h
--- linux-2.5.44-base/include/linux/mm.h	Fri Oct 18 21:01:08 2002
+++ linux-2.5.44-meminfo_addition/include/linux/mm.h	Wed Oct 23 12:10:57 2002
@@ -450,6 +450,9 @@
 extern void mem_init(void);
 extern void show_mem(void);
 extern void si_meminfo(struct sysinfo * val);
+#ifdef CONFIG_NUMA
+extern void si_meminfo_node(struct sysinfo *val, int nid);
+#endif
 extern void swapin_readahead(swp_entry_t);
 
 extern int can_share_swap_page(struct page *);
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/include/linux/swap.h linux-2.5.44-meminfo_addition/include/linux/swap.h
--- linux-2.5.44-base/include/linux/swap.h	Fri Oct 18 21:01:08 2002
+++ linux-2.5.44-meminfo_addition/include/linux/swap.h	Wed Oct 23 12:10:57 2002
@@ -131,6 +131,9 @@
 extern unsigned long totalram_pages;
 extern unsigned long totalhigh_pages;
 extern unsigned int nr_free_pages(void);
+#ifdef CONFIG_NUMA
+extern unsigned int nr_free_pages_pgdat(pg_data_t *pgdat);
+#endif
 extern unsigned int nr_free_buffer_pages(void);
 extern unsigned int nr_free_pagecache_pages(void);
 
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/mm/page_alloc.c linux-2.5.44-meminfo_addition/mm/page_alloc.c
--- linux-2.5.44-base/mm/page_alloc.c	Fri Oct 18 21:01:09 2002
+++ linux-2.5.44-meminfo_addition/mm/page_alloc.c	Wed Oct 23 12:10:57 2002
@@ -504,6 +504,18 @@
 	return pages;
 }
 
+#ifdef CONFIG_NUMA
+unsigned int nr_free_pages_pgdat(pg_data_t *pgdat)
+{
+	unsigned int i, sum = 0;
+
+	for (i = 0; i < MAX_NR_ZONES; i++)
+		sum += pgdat->node_zones[i].free_pages;
+
+	return sum;
+}
+#endif
+
 static unsigned int nr_free_zone_pages(int offset)
 {
 	pg_data_t *pgdat;
@@ -631,6 +643,19 @@
 	val->mem_unit = PAGE_SIZE;
 }
 
+#ifdef CONFIG_NUMA
+void si_meminfo_node(struct sysinfo *val, int nid)
+{
+	pg_data_t *pgdat = NODE_DATA(nid);
+
+	val->totalram = pgdat->node_size;
+	val->freeram = nr_free_pages_pgdat(pgdat);
+	val->totalhigh = pgdat->node_zones[ZONE_HIGHMEM].spanned_pages;
+	val->freehigh = pgdat->node_zones[ZONE_HIGHMEM].free_pages;
+	val->mem_unit = PAGE_SIZE;
+}
+#endif
+
 #define K(x) ((x) << (PAGE_SHIFT-10))
 
 /*

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [patch] (4/5) create memblk_online_map 2.5.44
  2002-10-23 21:02         ` [patch] (3/5) NUMA meminfo for " Matthew Dobson
@ 2002-10-23 21:05           ` Matthew Dobson
  2002-10-23 21:06             ` [patch] (5/5) create node_online_map 2.5.44 Matthew Dobson
  0 siblings, 1 reply; 5+ messages in thread
From: Matthew Dobson @ 2002-10-23 21:05 UTC (permalink / raw)
  To: colpatch
  Cc: Andrew Morton, Patrick Mochel, Martin J. Bligh, linux-kernel,
	Michael Hohnbaum

[-- Attachment #1: Type: text/plain, Size: 356 bytes --]

Create and use memblk_online_map.

This patch creates a memblk_online_map, much like cpu_online_map.  It 
also creates the standard helper functions, ie: memblk_online(), 
num_online_memblks(), memblk_set_online(), memblk_set_offline().

This is used by driverFS topology to keep track of which memory blocks 
are in the system and online.

Cheers!

-Matt

[-- Attachment #2: 03-memblk_online_map.patch --]
[-- Type: text/plain, Size: 2735 bytes --]

diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/arch/i386/mach-generic/topology.c linux-2.5.44-memblk_online_map/arch/i386/mach-generic/topology.c
--- linux-2.5.44-base/arch/i386/mach-generic/topology.c	Wed Oct 23 12:07:47 2002
+++ linux-2.5.44-memblk_online_map/arch/i386/mach-generic/topology.c	Wed Oct 23 12:13:31 2002
@@ -48,7 +48,7 @@
 		arch_register_node(i);
 	for (i = 0; i < num_online_cpus(); i++)
 		arch_register_cpu(i);
-	for (i = 0; i < numnodes; i++)
+	for (i = 0; i < num_online_memblks(); i++)
 		arch_register_memblk(i);
 	return 0;
 }
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/include/linux/mmzone.h linux-2.5.44-memblk_online_map/include/linux/mmzone.h
--- linux-2.5.44-base/include/linux/mmzone.h	Fri Oct 18 21:01:08 2002
+++ linux-2.5.44-memblk_online_map/include/linux/mmzone.h	Wed Oct 23 12:13:31 2002
@@ -262,6 +262,38 @@
 
 #endif /* !CONFIG_DISCONTIGMEM */
 
+
+extern DECLARE_BITMAP(memblk_online_map, MAX_NR_MEMBLKS);
+
+#if defined(CONFIG_DISCONTIGMEM) || defined(CONFIG_NUMA)
+
+#define memblk_online(memblk)		test_bit(memblk, memblk_online_map)
+#define memblk_set_online(memblk)	set_bit(memblk, memblk_online_map)
+#define memblk_set_offline(memblk)	clear_bit(memblk, memblk_online_map)
+static inline unsigned int num_online_memblks(void)
+{
+	int i, num = 0;
+
+	for(i = 0; i < MAX_NR_MEMBLKS; i++){
+		if (memblk_online(i))
+			num++;
+	}
+	return num;
+}
+
+#else /* !CONFIG_DISCONTIGMEM && !CONFIG_NUMA */
+
+#define memblk_online(memblk) \
+	({ BUG_ON((memblk) != 0); test_bit(memblk, memblk_online_map); })
+#define memblk_set_online(memblk) \
+	({ BUG_ON((memblk) != 0); set_bit(memblk, memblk_online_map); })
+#define memblk_set_offline(memblk) \
+	({ BUG_ON((memblk) != 0); clear_bit(memblk, memblk_online_map); })
+#define num_online_memblks()		1
+
+#endif /* CONFIG_DISCONTIGMEM || CONFIG_NUMA */
+
+
 #define MAP_ALIGN(x)	((((x) % sizeof(struct page)) == 0) ? (x) : ((x) + \
 		sizeof(struct page) - ((x) % sizeof(struct page))))
 
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/mm/page_alloc.c linux-2.5.44-memblk_online_map/mm/page_alloc.c
--- linux-2.5.44-base/mm/page_alloc.c	Wed Oct 23 12:10:57 2002
+++ linux-2.5.44-memblk_online_map/mm/page_alloc.c	Wed Oct 23 12:13:31 2002
@@ -26,6 +26,9 @@
 #include <linux/blkdev.h>
 #include <linux/slab.h>
 
+#include <asm/topology.h>
+
+DECLARE_BITMAP(memblk_online_map, MAX_NR_MEMBLKS);
 struct pglist_data *pgdat_list;
 unsigned long totalram_pages;
 unsigned long totalhigh_pages;
@@ -1039,6 +1042,7 @@
 	pgdat->node_mem_map = node_mem_map;
 
 	free_area_init_core(pgdat, zones_size, zholes_size);
+	memblk_set_online(__node_to_memblk(nid));
 
 	calculate_zone_bitmap(pgdat, zones_size);
 }

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [patch] (5/5) create node_online_map 2.5.44
  2002-10-23 21:05           ` [patch] (4/5) create memblk_online_map 2.5.44 Matthew Dobson
@ 2002-10-23 21:06             ` Matthew Dobson
  0 siblings, 0 replies; 5+ messages in thread
From: Matthew Dobson @ 2002-10-23 21:06 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Patrick Mochel, Martin J. Bligh, linux-kernel, Michael Hohnbaum

[-- Attachment #1: Type: text/plain, Size: 333 bytes --]

Create and use node_online_map.

This patch creates a node_online_map, much like cpu_online_map.  It
also creates the standard helper functions, ie: node_online(),
num_online_nodes(), node_set_online(), node_set_offline().

This is used by driverFS topology to keep track of which Nodes
are in the system and online.

Cheers!

-Matt

[-- Attachment #2: 04-node_online_map.patch --]
[-- Type: text/plain, Size: 3306 bytes --]

diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/arch/i386/kernel/numaq.c linux-2.5.44-node_online_map/arch/i386/kernel/numaq.c
--- linux-2.5.44-base/arch/i386/kernel/numaq.c	Fri Oct 18 21:01:17 2002
+++ linux-2.5.44-node_online_map/arch/i386/kernel/numaq.c	Wed Oct 23 12:14:49 2002
@@ -52,6 +52,7 @@
 	numnodes = 0;
 	for(node = 0; node < MAX_NUMNODES; node++) {
 		if(scd->quads_present31_0 & (1 << node)) {
+			node_set_online(node);
 			numnodes++;
 			eq = &scd->eq[node];
 			/* Convert to pages */
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/arch/i386/mach-generic/topology.c linux-2.5.44-node_online_map/arch/i386/mach-generic/topology.c
--- linux-2.5.44-base/arch/i386/mach-generic/topology.c	Wed Oct 23 12:13:31 2002
+++ linux-2.5.44-node_online_map/arch/i386/mach-generic/topology.c	Wed Oct 23 12:14:50 2002
@@ -38,13 +38,11 @@
 struct i386_node node_devices[MAX_NUMNODES];
 struct i386_memblk memblk_devices[MAX_NR_MEMBLKS];
 
-extern int numnodes;
-
 static int __init topology_init(void)
 {
 	int i;
 
-	for (i = 0; i < numnodes; i++)
+	for (i = 0; i < num_online_nodes(); i++)
 		arch_register_node(i);
 	for (i = 0; i < num_online_cpus(); i++)
 		arch_register_cpu(i);
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/include/linux/mmzone.h linux-2.5.44-node_online_map/include/linux/mmzone.h
--- linux-2.5.44-base/include/linux/mmzone.h	Wed Oct 23 12:13:31 2002
+++ linux-2.5.44-node_online_map/include/linux/mmzone.h	Wed Oct 23 12:14:50 2002
@@ -263,10 +263,25 @@
 #endif /* !CONFIG_DISCONTIGMEM */
 
 
+extern DECLARE_BITMAP(node_online_map, MAX_NUMNODES);
 extern DECLARE_BITMAP(memblk_online_map, MAX_NR_MEMBLKS);
 
 #if defined(CONFIG_DISCONTIGMEM) || defined(CONFIG_NUMA)
 
+#define node_online(node)	test_bit(node, node_online_map)
+#define node_set_online(node)	set_bit(node, node_online_map)
+#define node_set_offline(node)	clear_bit(node, node_online_map)
+static inline unsigned int num_online_nodes(void)
+{
+	int i, num = 0;
+
+	for(i = 0; i < MAX_NUMNODES; i++){
+		if (node_online(i))
+			num++;
+	}
+	return num;
+}
+
 #define memblk_online(memblk)		test_bit(memblk, memblk_online_map)
 #define memblk_set_online(memblk)	set_bit(memblk, memblk_online_map)
 #define memblk_set_offline(memblk)	clear_bit(memblk, memblk_online_map)
@@ -283,6 +298,14 @@
 
 #else /* !CONFIG_DISCONTIGMEM && !CONFIG_NUMA */
 
+#define node_online(node) \
+	({ BUG_ON((node) != 0); test_bit(node, node_online_map); })
+#define node_set_online(node) \
+	({ BUG_ON((node) != 0); set_bit(node, node_online_map); })
+#define node_set_offline(node) \
+	({ BUG_ON((node) != 0); clear_bit(node, node_online_map); })
+#define num_online_nodes()	1
+
 #define memblk_online(memblk) \
 	({ BUG_ON((memblk) != 0); test_bit(memblk, memblk_online_map); })
 #define memblk_set_online(memblk) \
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.44-base/mm/page_alloc.c linux-2.5.44-node_online_map/mm/page_alloc.c
--- linux-2.5.44-base/mm/page_alloc.c	Wed Oct 23 12:13:31 2002
+++ linux-2.5.44-node_online_map/mm/page_alloc.c	Wed Oct 23 12:14:50 2002
@@ -28,6 +28,7 @@
 
 #include <asm/topology.h>
 
+DECLARE_BITMAP(node_online_map, MAX_NUMNODES);
 DECLARE_BITMAP(memblk_online_map, MAX_NR_MEMBLKS);
 struct pglist_data *pgdat_list;
 unsigned long totalram_pages;

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2002-10-23 21:04 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <2699066091.1035310557@[10.10.2.3]>
     [not found] ` <Pine.LNX.4.44.0210221824430.983-100000@cherise.pdx.osdl.net>
     [not found]   ` <3DB5FCC5.E54808E@digeo.com>
2002-10-23 20:55     ` [patch] (1/5) Core driverfs Topology 2.5.44 Matthew Dobson
2002-10-23 20:59       ` [patch] (2/5) i386 " Matthew Dobson
2002-10-23 21:02         ` [patch] (3/5) NUMA meminfo for " Matthew Dobson
2002-10-23 21:05           ` [patch] (4/5) create memblk_online_map 2.5.44 Matthew Dobson
2002-10-23 21:06             ` [patch] (5/5) create node_online_map 2.5.44 Matthew Dobson

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.