From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keshavamurthy Anil S Subject: Re: [PATCH 4/6]ACPI based Physical CPU hotplug Date: Wed, 8 Sep 2004 18:37:44 -0700 Sender: acpi-devel-admin-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Message-ID: <20040908183743.B7384@unix-os.sc.intel.com> References: <44BDAFB888F59F408FAE3CC35AB47041B17999@orsmsx409> Reply-To: Keshavamurthy Anil S Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline In-Reply-To: <44BDAFB888F59F408FAE3CC35AB47041B17999@orsmsx409>; from anil.s.keshavamurthy-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org on Wed, Sep 08, 2004 at 06:10:50PM -0700 Errors-To: acpi-devel-admin-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , List-Archive: To: LHNS list , ACPI Developer Cc: anil.s.keshavamurthy-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org List-Id: linux-acpi@vger.kernel.org --- Name:topology.patch Status:Tested on 2.6.9-rc1-mm2 Signed-off-by: Anil S Keshavamurthy Depends: Version: applies on 2.6.9-rc1-mm2 Description: Extends support for dynamic sysfs registration and unregistration of the cpu. --- /dev/null | 43 ---- linux-2.6.9-rc1-mm2-askeshav/arch/i386/mach-default/topology.c | 31 +++ linux-2.6.9-rc1-mm2-askeshav/arch/ia64/dig/Makefile | 5 linux-2.6.9-rc1-mm2-askeshav/arch/ia64/kernel/Makefile | 3 linux-2.6.9-rc1-mm2-askeshav/arch/ia64/kernel/topology.c | 93 ++++++++++ linux-2.6.9-rc1-mm2-askeshav/drivers/base/cpu.c | 20 +- linux-2.6.9-rc1-mm2-askeshav/include/asm-i386/cpu.h | 17 - linux-2.6.9-rc1-mm2-askeshav/include/asm-ia64/cpu.h | 5 linux-2.6.9-rc1-mm2-askeshav/include/linux/cpu.h | 3 9 files changed, 156 insertions(+), 64 deletions(-) diff -puN arch/ia64/dig/Makefile~topology arch/ia64/dig/Makefile --- linux-2.6.9-rc1-mm2/arch/ia64/dig/Makefile~topology 2004-09-08 16:42:23.214766299 -0700 +++ linux-2.6.9-rc1-mm2-askeshav/arch/ia64/dig/Makefile 2004-09-08 16:42:23.340742860 -0700 @@ -6,9 +6,4 @@ # obj-y := setup.o - -ifndef CONFIG_NUMA -obj-$(CONFIG_IA64_DIG) += topology.o -endif - obj-$(CONFIG_IA64_GENERIC) += machvec.o diff -L arch/ia64/dig/topology.c -puN arch/ia64/dig/topology.c~topology /dev/null --- linux-2.6.9-rc1-mm2/arch/ia64/dig/topology.c +++ /dev/null 2004-06-30 13:03:36.000000000 -0700 @@ -1,43 +0,0 @@ -/* - * arch/ia64/dig/topology.c - * Popuate driverfs with topology information. - * Derived entirely from i386/mach-default.c - * Intel Corporation - Ashok Raj - */ -#include -#include -#include -#include -#include -#include -#include - -static DEFINE_PER_CPU(struct ia64_cpu, cpu_devices); - -/* - * First Pass: simply borrowed code for now. Later should hook into - * hotplug notification for node/cpu/memory as applicable - */ - -static int arch_register_cpu(int num) -{ - struct node *parent = NULL; - -#ifdef CONFIG_NUMA - //parent = &node_devices[cpu_to_node(num)].node; -#endif - - return register_cpu(&per_cpu(cpu_devices,num).cpu, num, parent); -} - -static int __init topology_init(void) -{ - int i; - - for_each_cpu(i) { - arch_register_cpu(i); - } - return 0; -} - -subsys_initcall(topology_init); diff -puN arch/ia64/kernel/Makefile~topology arch/ia64/kernel/Makefile --- linux-2.6.9-rc1-mm2/arch/ia64/kernel/Makefile~topology 2004-09-08 16:42:23.227461611 -0700 +++ linux-2.6.9-rc1-mm2-askeshav/arch/ia64/kernel/Makefile 2004-09-08 16:42:23.349531922 -0700 @@ -6,7 +6,8 @@ extra-y := head.o init_task.o vmlinux.ld obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \ irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \ - salinfo.o semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o unwind.o mca.o mca_asm.o + salinfo.o semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \ + unwind.o mca.o mca_asm.o topology.o obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o diff -puN include/linux/cpu.h~topology include/linux/cpu.h --- linux-2.6.9-rc1-mm2/include/linux/cpu.h~topology 2004-09-08 16:42:23.231367861 -0700 +++ linux-2.6.9-rc1-mm2-askeshav/include/linux/cpu.h 2004-09-08 16:42:23.350508485 -0700 @@ -32,6 +32,9 @@ struct cpu { }; extern int register_cpu(struct cpu *, int, struct node *); +#ifdef CONFIG_HOTPLUG_CPU +extern void unregister_cpu(struct cpu *, struct node *); +#endif struct notifier_block; #ifdef CONFIG_SMP diff -puN include/asm-i386/cpu.h~topology include/asm-i386/cpu.h --- linux-2.6.9-rc1-mm2/include/asm-i386/cpu.h~topology 2004-09-08 16:42:23.238203799 -0700 +++ linux-2.6.9-rc1-mm2-askeshav/include/asm-i386/cpu.h 2004-09-08 16:42:23.351485047 -0700 @@ -13,19 +13,10 @@ struct i386_cpu { struct cpu cpu; }; extern struct i386_cpu cpu_devices[NR_CPUS]; - - -static inline int arch_register_cpu(int num){ - struct node *parent = NULL; - -#ifdef CONFIG_NUMA - int node = cpu_to_node(num); - if (node_online(node)) - parent = &node_devices[node].node; -#endif /* CONFIG_NUMA */ - - return register_cpu(&cpu_devices[num].cpu, num, parent); -} +extern int arch_register_cpu(int num); +#ifdef CONFIG_HOTPLUG_CPU +extern void arch_unregister_cpu(int); +#endif DECLARE_PER_CPU(int, cpu_state); #endif /* _ASM_I386_CPU_H_ */ diff -puN include/asm-ia64/cpu.h~topology include/asm-ia64/cpu.h --- linux-2.6.9-rc1-mm2/include/asm-ia64/cpu.h~topology 2004-09-08 16:42:23.244063174 -0700 +++ linux-2.6.9-rc1-mm2-askeshav/include/asm-ia64/cpu.h 2004-09-08 16:42:23.351485047 -0700 @@ -14,4 +14,9 @@ DECLARE_PER_CPU(struct ia64_cpu, cpu_dev DECLARE_PER_CPU(int, cpu_state); +extern int arch_register_cpu(int num); +#ifdef CONFIG_HOTPLUG_CPU +extern void arch_unregister_cpu(int); +#endif + #endif /* _ASM_IA64_CPU_H_ */ diff -puN /dev/null arch/ia64/kernel/topology.c --- /dev/null 2004-06-30 13:03:36.000000000 -0700 +++ linux-2.6.9-rc1-mm2-askeshav/arch/ia64/kernel/topology.c 2004-09-08 16:42:23.352461610 -0700 @@ -0,0 +1,93 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * This file contains NUMA specific variables and functions which can + * be split away from DISCONTIGMEM and are used on NUMA machines with + * contiguous memory. + * 2002/08/07 Erich Focht + * Populate cpu entries in sysfs for non-numa systems as well + * Intel Corporation - Ashok Raj + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_NUMA +static struct node *sysfs_nodes; +#endif +static struct ia64_cpu *sysfs_cpus; + +int arch_register_cpu(int num) +{ + struct node *parent = NULL; + +#ifdef CONFIG_NUMA + int node = cpu_to_node(num); + if (node_online(node)) + parent = &sysfs_nodes[node]; +#endif /* CONFIG_NUMA */ + + return register_cpu(&sysfs_cpus[num].cpu, num, parent); +} + +#ifdef CONFIG_HOTPLUG_CPU + +void arch_unregister_cpu(int num) +{ + struct node *parent = NULL; + +#ifdef CONFIG_NUMA + int node = cpu_to_node(num); + if (node_online(node)) + parent = &sysfs_nodes[node]; +#endif /* CONFIG_NUMA */ + + return unregister_cpu(&sysfs_cpus[num].cpu, parent); +} +EXPORT_SYMBOL(arch_register_cpu); +EXPORT_SYMBOL(arch_unregister_cpu); +#endif /*CONFIG_HOTPLUG_CPU*/ + + +static int __init topology_init(void) +{ + int i, err = 0; + +#ifdef CONFIG_NUMA + sysfs_nodes = kmalloc(sizeof(struct node) * MAX_NUMNODES, GFP_KERNEL); + if (!sysfs_nodes) { + err = -ENOMEM; + goto out; + } + memset(sysfs_nodes, 0, sizeof(struct node) * MAX_NUMNODES); + + for_each_online_node(i) + if ((err = register_node(&sysfs_nodes[i], i, 0))) + goto out; +#endif + + sysfs_cpus = kmalloc(sizeof(struct ia64_cpu) * NR_CPUS, GFP_KERNEL); + if (!sysfs_cpus) { + err = -ENOMEM; + goto out; + } + memset(sysfs_cpus, 0, sizeof(struct ia64_cpu) * NR_CPUS); + + for_each_present_cpu(i) + if((err = arch_register_cpu(i))) + goto out; +out: + return err; +} + +__initcall(topology_init); diff -puN arch/i386/mach-default/topology.c~topology arch/i386/mach-default/topology.c --- linux-2.6.9-rc1-mm2/arch/i386/mach-default/topology.c~topology 2004-09-08 16:42:23.249922548 -0700 +++ linux-2.6.9-rc1-mm2-askeshav/arch/i386/mach-default/topology.c 2004-09-08 16:42:23.353438172 -0700 @@ -32,6 +32,37 @@ struct i386_cpu cpu_devices[NR_CPUS]; +int arch_register_cpu(int num){ + struct node *parent = NULL; + +#ifdef CONFIG_NUMA + int node = cpu_to_node(num); + if (node_online(node)) + parent = &node_devices[node].node; +#endif /* CONFIG_NUMA */ + + return register_cpu(&cpu_devices[num].cpu, num, parent); +} + +#ifdef CONFIG_HOTPLUG_CPU + +void arch_unregister_cpu(int num) { + struct node *parent = NULL; + +#ifdef CONFIG_NUMA + int node = cpu_to_node(num); + if (node_online(node)) + parent = &node_devices[node].node; +#endif /* CONFIG_NUMA */ + + return unregister_cpu(&cpu_devices[num].cpu, parent); +} +EXPORT_SYMBOL(arch_register_cpu); +EXPORT_SYMBOL(arch_unregister_cpu); +#endif /*CONFIG_HOTPLUG_CPU*/ + + + #ifdef CONFIG_NUMA #include #include diff -puN drivers/base/cpu.c~topology drivers/base/cpu.c --- linux-2.6.9-rc1-mm2/drivers/base/cpu.c~topology 2004-09-08 16:42:23.256758486 -0700 +++ linux-2.6.9-rc1-mm2-askeshav/drivers/base/cpu.c 2004-09-08 16:42:23.354414735 -0700 @@ -46,10 +46,23 @@ static ssize_t store_online(struct sys_d } static SYSDEV_ATTR(online, 0600, show_online, store_online); -static void __init register_cpu_control(struct cpu *cpu) +static void __devinit register_cpu_control(struct cpu *cpu) { sysdev_create_file(&cpu->sysdev, &attr_online); } +void unregister_cpu(struct cpu *cpu, struct node *root) +{ + + if (root) + sysfs_remove_link(&root->sysdev.kobj, + kobject_name(&cpu->sysdev.kobj)); + sysdev_remove_file(&cpu->sysdev, &attr_online); + + sysdev_unregister(&cpu->sysdev); + + return; +} +EXPORT_SYMBOL(unregister_cpu); #else /* ... !CONFIG_HOTPLUG_CPU */ static inline void register_cpu_control(struct cpu *cpu) { @@ -64,7 +77,7 @@ static inline void register_cpu_control( * * Initialize and register the CPU device. */ -int __init register_cpu(struct cpu *cpu, int num, struct node *root) +int __devinit register_cpu(struct cpu *cpu, int num, struct node *root) { int error; @@ -81,6 +94,9 @@ int __init register_cpu(struct cpu *cpu, register_cpu_control(cpu); return error; } +#ifdef CONFIG_HOTPLUG_CPU +EXPORT_SYMBOL(register_cpu); +#endif _ ------------------------------------------------------- This SF.Net email is sponsored by BEA Weblogic Workshop FREE Java Enterprise J2EE developer tools! Get your free copy of BEA WebLogic Workshop 8.1 today. http://ads.osdn.com/?ad_id=5047&alloc_id=10808&op=click