/* * 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 #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 parent = &sysfs_nodes[cpu_to_node(num)]; #endif /* CONFIG_NUMA */ #if defined (CONFIG_ACPI) && defined (CONFIG_HOTPLUG_CPU) /* * If CPEI cannot be re-targetted, and this is * CPEI target, then dont create the control file */ if (!can_cpei_retarget() && is_cpu_cpei_target(num)) sysfs_cpus[num].cpu.no_control = 1; #endif 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); 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 = kzalloc(sizeof(struct node) * MAX_NUMNODES, GFP_KERNEL); if (!sysfs_nodes) { err = -ENOMEM; goto out; } /* * MCD - Do we want to register all ONLINE nodes, or all POSSIBLE nodes? */ for_each_online_node(i) { if ((err = register_node(&sysfs_nodes[i], i, 0))) goto out; } #endif sysfs_cpus = kzalloc(sizeof(struct ia64_cpu) * NR_CPUS, GFP_KERNEL); if (!sysfs_cpus) { err = -ENOMEM; goto out; } for_each_present_cpu(i) { if((err = arch_register_cpu(i))) goto out; } out: return err; } subsys_initcall(topology_init);