2005-04-16 18:20:36 -04:00
|
|
|
/*
|
|
|
|
* 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 <efocht@ess.nec.de>
|
|
|
|
* Populate cpu entries in sysfs for non-numa systems as well
|
|
|
|
* Intel Corporation - Ashok Raj
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/config.h>
|
|
|
|
#include <linux/cpu.h>
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/mm.h>
|
|
|
|
#include <linux/node.h>
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/bootmem.h>
|
|
|
|
#include <linux/nodemask.h>
|
|
|
|
#include <asm/mmzone.h>
|
|
|
|
#include <asm/numa.h>
|
|
|
|
#include <asm/cpu.h>
|
|
|
|
|
|
|
|
#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 */
|
|
|
|
|
2005-08-24 12:07:20 -04:00
|
|
|
#ifdef CONFIG_ACPI
|
2005-03-31 22:51:10 -05:00
|
|
|
/*
|
|
|
|
* 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;
|
2005-07-14 00:09:00 -04:00
|
|
|
#endif
|
2005-03-31 22:51:10 -05:00
|
|
|
|
2005-04-16 18:20:36 -04:00
|
|
|
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 = kmalloc(sizeof(struct node) * MAX_NUMNODES, GFP_KERNEL);
|
|
|
|
if (!sysfs_nodes) {
|
|
|
|
err = -ENOMEM;
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
memset(sysfs_nodes, 0, sizeof(struct node) * MAX_NUMNODES);
|
|
|
|
|
|
|
|
/* 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 = 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);
|