* [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 a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).