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 | ||
