X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=drivers%2Facpi%2Fnuma.c;h=658e5f3abae0dda28d73395955d8e91c7126c846;hb=1b3cba8e60c67c968d108ac55c77e32c1928dec3;hp=0822d9fc1cb4ef7d0ea2dbf69873505fef1cc41d;hpb=c63a1190368771b8207d86c4217ae4afdf1cbd5e;p=linux-2.6 diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c index 0822d9fc1c..658e5f3aba 100644 --- a/drivers/acpi/numa.c +++ b/drivers/acpi/numa.c @@ -78,6 +78,7 @@ int acpi_map_pxm_to_node(int pxm) return node; } +#if 0 void __cpuinit acpi_unmap_pxm_to_node(int node) { int pxm = node_to_pxm_map[node]; @@ -85,6 +86,7 @@ void __cpuinit acpi_unmap_pxm_to_node(int node) node_to_pxm_map[node] = PXM_INVAL; node_clear(node, nodes_found_map); } +#endif /* 0 */ static void __init acpi_table_print_srat_entry(struct acpi_subtable_header *header) @@ -138,19 +140,42 @@ acpi_table_print_srat_entry(struct acpi_subtable_header *header) } } +/* + * A lot of BIOS fill in 10 (= no distance) everywhere. This messes + * up the NUMA heuristics which wants the local node to have a smaller + * distance than the others. + * Do some quick checks here and only use the SLIT if it passes. + */ +static __init int slit_valid(struct acpi_table_slit *slit) +{ + int i, j; + int d = slit->locality_count; + for (i = 0; i < d; i++) { + for (j = 0; j < d; j++) { + u8 val = slit->entry[d*i + j]; + if (i == j) { + if (val != LOCAL_DISTANCE) + return 0; + } else if (val <= LOCAL_DISTANCE) + return 0; + } + } + return 1; +} + static int __init acpi_parse_slit(struct acpi_table_header *table) { struct acpi_table_slit *slit; - u32 localities; if (!table) return -EINVAL; slit = (struct acpi_table_slit *)table; - /* downcast just for %llu vs %lu for i386/ia64 */ - localities = (u32) slit->locality_count; - + if (!slit_valid(slit)) { + printk(KERN_INFO "ACPI: SLIT table looks invalid. Not used.\n"); + return -EINVAL; + } acpi_numa_slit_init(slit); return 0; @@ -247,7 +272,6 @@ int acpi_get_pxm(acpi_handle h) } while (ACPI_SUCCESS(status)); return -1; } -EXPORT_SYMBOL(acpi_get_pxm); int acpi_get_node(acpi_handle *handle) {