]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * This file is subject to the terms and conditions of the GNU General Public | |
3 | * License. See the file "COPYING" in the main directory of this archive | |
4 | * for more details. | |
5 | * | |
6 | * This file contains NUMA specific variables and functions which can | |
7 | * be split away from DISCONTIGMEM and are used on NUMA machines with | |
8 | * contiguous memory. | |
9 | * 2002/08/07 Erich Focht <efocht@ess.nec.de> | |
10 | * Populate cpu entries in sysfs for non-numa systems as well | |
11 | * Intel Corporation - Ashok Raj | |
12 | */ | |
13 | ||
14 | #include <linux/config.h> | |
15 | #include <linux/cpu.h> | |
16 | #include <linux/kernel.h> | |
17 | #include <linux/mm.h> | |
18 | #include <linux/node.h> | |
19 | #include <linux/init.h> | |
20 | #include <linux/bootmem.h> | |
21 | #include <linux/nodemask.h> | |
22 | #include <asm/mmzone.h> | |
23 | #include <asm/numa.h> | |
24 | #include <asm/cpu.h> | |
25 | ||
26 | #ifdef CONFIG_NUMA | |
27 | static struct node *sysfs_nodes; | |
28 | #endif | |
29 | static struct ia64_cpu *sysfs_cpus; | |
30 | ||
31 | int arch_register_cpu(int num) | |
32 | { | |
33 | struct node *parent = NULL; | |
34 | ||
35 | #ifdef CONFIG_NUMA | |
36 | parent = &sysfs_nodes[cpu_to_node(num)]; | |
37 | #endif /* CONFIG_NUMA */ | |
38 | ||
888ba6c6 | 39 | #ifdef CONFIG_ACPI |
55e59c51 AR |
40 | /* |
41 | * If CPEI cannot be re-targetted, and this is | |
42 | * CPEI target, then dont create the control file | |
43 | */ | |
44 | if (!can_cpei_retarget() && is_cpu_cpei_target(num)) | |
45 | sysfs_cpus[num].cpu.no_control = 1; | |
46906c44 | 46 | #endif |
55e59c51 | 47 | |
1da177e4 LT |
48 | return register_cpu(&sysfs_cpus[num].cpu, num, parent); |
49 | } | |
50 | ||
51 | #ifdef CONFIG_HOTPLUG_CPU | |
52 | ||
53 | void arch_unregister_cpu(int num) | |
54 | { | |
55 | struct node *parent = NULL; | |
56 | ||
57 | #ifdef CONFIG_NUMA | |
58 | int node = cpu_to_node(num); | |
59 | parent = &sysfs_nodes[node]; | |
60 | #endif /* CONFIG_NUMA */ | |
61 | ||
62 | return unregister_cpu(&sysfs_cpus[num].cpu, parent); | |
63 | } | |
64 | EXPORT_SYMBOL(arch_register_cpu); | |
65 | EXPORT_SYMBOL(arch_unregister_cpu); | |
66 | #endif /*CONFIG_HOTPLUG_CPU*/ | |
67 | ||
68 | ||
69 | static int __init topology_init(void) | |
70 | { | |
71 | int i, err = 0; | |
72 | ||
73 | #ifdef CONFIG_NUMA | |
74 | sysfs_nodes = kmalloc(sizeof(struct node) * MAX_NUMNODES, GFP_KERNEL); | |
75 | if (!sysfs_nodes) { | |
76 | err = -ENOMEM; | |
77 | goto out; | |
78 | } | |
79 | memset(sysfs_nodes, 0, sizeof(struct node) * MAX_NUMNODES); | |
80 | ||
81 | /* MCD - Do we want to register all ONLINE nodes, or all POSSIBLE nodes? */ | |
82 | for_each_online_node(i) | |
83 | if ((err = register_node(&sysfs_nodes[i], i, 0))) | |
84 | goto out; | |
85 | #endif | |
86 | ||
87 | sysfs_cpus = kmalloc(sizeof(struct ia64_cpu) * NR_CPUS, GFP_KERNEL); | |
88 | if (!sysfs_cpus) { | |
89 | err = -ENOMEM; | |
90 | goto out; | |
91 | } | |
92 | memset(sysfs_cpus, 0, sizeof(struct ia64_cpu) * NR_CPUS); | |
93 | ||
94 | for_each_present_cpu(i) | |
95 | if((err = arch_register_cpu(i))) | |
96 | goto out; | |
97 | out: | |
98 | return err; | |
99 | } | |
100 | ||
101 | __initcall(topology_init); |