diff options
Diffstat (limited to 'drivers/acpi/numa.c')
-rw-r--r-- | drivers/acpi/numa.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c index 64b98e82feb7..e2c1a16078c9 100644 --- a/drivers/acpi/numa.c +++ b/drivers/acpi/numa.c | |||
@@ -36,12 +36,60 @@ | |||
36 | #define _COMPONENT ACPI_NUMA | 36 | #define _COMPONENT ACPI_NUMA |
37 | ACPI_MODULE_NAME("numa") | 37 | ACPI_MODULE_NAME("numa") |
38 | 38 | ||
39 | static nodemask_t nodes_found_map = NODE_MASK_NONE; | ||
40 | #define PXM_INVAL -1 | ||
41 | #define NID_INVAL -1 | ||
42 | |||
43 | /* maps to convert between proximity domain and logical node ID */ | ||
44 | int __cpuinitdata pxm_to_node_map[MAX_PXM_DOMAINS] | ||
45 | = { [0 ... MAX_PXM_DOMAINS - 1] = NID_INVAL }; | ||
46 | int __cpuinitdata node_to_pxm_map[MAX_NUMNODES] | ||
47 | = { [0 ... MAX_NUMNODES - 1] = PXM_INVAL }; | ||
48 | |||
39 | extern int __init acpi_table_parse_madt_family(enum acpi_table_id id, | 49 | extern int __init acpi_table_parse_madt_family(enum acpi_table_id id, |
40 | unsigned long madt_size, | 50 | unsigned long madt_size, |
41 | int entry_id, | 51 | int entry_id, |
42 | acpi_madt_entry_handler handler, | 52 | acpi_madt_entry_handler handler, |
43 | unsigned int max_entries); | 53 | unsigned int max_entries); |
44 | 54 | ||
55 | int __cpuinit pxm_to_node(int pxm) | ||
56 | { | ||
57 | if (pxm < 0) | ||
58 | return NID_INVAL; | ||
59 | return pxm_to_node_map[pxm]; | ||
60 | } | ||
61 | |||
62 | int __cpuinit node_to_pxm(int node) | ||
63 | { | ||
64 | if (node < 0) | ||
65 | return PXM_INVAL; | ||
66 | return node_to_pxm_map[node]; | ||
67 | } | ||
68 | |||
69 | int __cpuinit acpi_map_pxm_to_node(int pxm) | ||
70 | { | ||
71 | int node = pxm_to_node_map[pxm]; | ||
72 | |||
73 | if (node < 0){ | ||
74 | if (nodes_weight(nodes_found_map) >= MAX_NUMNODES) | ||
75 | return NID_INVAL; | ||
76 | node = first_unset_node(nodes_found_map); | ||
77 | pxm_to_node_map[pxm] = node; | ||
78 | node_to_pxm_map[node] = pxm; | ||
79 | node_set(node, nodes_found_map); | ||
80 | } | ||
81 | |||
82 | return node; | ||
83 | } | ||
84 | |||
85 | void __cpuinit acpi_unmap_pxm_to_node(int node) | ||
86 | { | ||
87 | int pxm = node_to_pxm_map[node]; | ||
88 | pxm_to_node_map[pxm] = NID_INVAL; | ||
89 | node_to_pxm_map[node] = PXM_INVAL; | ||
90 | node_clear(node, nodes_found_map); | ||
91 | } | ||
92 | |||
45 | void __init acpi_table_print_srat_entry(acpi_table_entry_header * header) | 93 | void __init acpi_table_print_srat_entry(acpi_table_entry_header * header) |
46 | { | 94 | { |
47 | 95 | ||