From: "Andi Kleen" Add x86_64 support for Jack Steiner's SLIT sysfs patch Make Jack's code compile on x86-64 and add x86-64 low level support to save the SLIT pointer and a node_distance() implementation. Requires the previous SRAT patch. Signed-off-by: Andi Kleen Signed-off-by: Andrew Morton --- 25-akpm/arch/x86_64/mm/srat.c | 29 ++++++++++++++++++++++++++++- 25-akpm/drivers/base/node.c | 4 ++-- 25-akpm/include/asm-x86_64/topology.h | 6 ++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff -puN arch/x86_64/mm/srat.c~x86_64-add-x86_64-support-for-jack-steiners-slit-sysfs arch/x86_64/mm/srat.c --- 25/arch/x86_64/mm/srat.c~x86_64-add-x86_64-support-for-jack-steiners-slit-sysfs 2004-11-28 01:54:52.116674168 -0800 +++ 25-akpm/arch/x86_64/mm/srat.c 2004-11-28 01:54:52.123673104 -0800 @@ -13,9 +13,13 @@ #include #include #include +#include +#include #include #include +static struct acpi_table_slit *acpi_slit; + static DECLARE_BITMAP(nodes_parsed, MAX_NUMNODES) __initdata; static struct node nodes[MAX_NUMNODES] __initdata; static __u8 pxm2node[256] __initdata = { [0 ... 255] = 0xff }; @@ -77,7 +81,7 @@ static __init inline int srat_disabled(v /* Callback for SLIT parsing */ void __init acpi_numa_slit_init(struct acpi_table_slit *slit) { - /* ignored for now */ + acpi_slit = slit; } /* Callback for Proximity Domain -> LAPIC mapping */ @@ -180,3 +184,26 @@ int __init acpi_scan_nodes(unsigned long numa_init_array(); return 0; } + +int node_to_pxm(int n) +{ + int i; + if (pxm2node[n] == n) + return n; + for (i = 0; i < 256; i++) + if (pxm2node[i] == n) + return i; + return 0; +} + +int __node_distance(int a, int b) +{ + int index; + + if (!acpi_slit) + return a == b ? 10 : 20; + index = acpi_slit->localities * node_to_pxm(a); + return acpi_slit->entry[index + node_to_pxm(b)]; +} + +EXPORT_SYMBOL(__node_distance); diff -puN drivers/base/node.c~x86_64-add-x86_64-support-for-jack-steiners-slit-sysfs drivers/base/node.c --- 25/drivers/base/node.c~x86_64-add-x86_64-support-for-jack-steiners-slit-sysfs 2004-11-28 01:54:52.117674016 -0800 +++ 25-akpm/drivers/base/node.c 2004-11-28 01:54:52.124672952 -0800 @@ -23,7 +23,7 @@ static ssize_t node_read_cpumap(struct s int len; /* 2004/06/03: buf currently PAGE_SIZE, need > 1 char per 4 bits. */ - BUILD_BUG_ON(NR_CPUS/4 > PAGE_SIZE/2); + BUILD_BUG_ON(MAX_NUMNODES/4 > PAGE_SIZE/2); len = cpumask_scnprintf(buf, PAGE_SIZE-1, mask); len += sprintf(buf + len, "\n"); @@ -118,7 +118,7 @@ static ssize_t node_read_distance(struct int i; /* buf currently PAGE_SIZE, need ~4 chars per node */ - BUILD_BUG_ON(NR_NODES*4 > PAGE_SIZE/2); + BUILD_BUG_ON(MAX_NUMNODES*4 > PAGE_SIZE/2); for (i = 0; i < numnodes; i++) len += sprintf(buf + len, "%s%d", i ? " " : "", node_distance(nid, i)); diff -puN include/asm-x86_64/topology.h~x86_64-add-x86_64-support-for-jack-steiners-slit-sysfs include/asm-x86_64/topology.h --- 25/include/asm-x86_64/topology.h~x86_64-add-x86_64-support-for-jack-steiners-slit-sysfs 2004-11-28 01:54:52.119673712 -0800 +++ 25-akpm/include/asm-x86_64/topology.h 2004-11-28 01:54:52.123673104 -0800 @@ -16,6 +16,12 @@ extern unsigned char cpu_to_node[]; extern cpumask_t node_to_cpumask[]; extern cpumask_t pci_bus_to_cpumask[]; +#ifdef CONFIG_ACPI_NUMA +extern int __node_distance(int, int); +#define node_distance(a,b) __node_distance(a,b) +/* #else fallback version */ +#endif + #define cpu_to_node(cpu) (cpu_to_node[cpu]) #define parent_node(node) (node) #define node_to_first_cpu(node) (__ffs(node_to_cpumask[node])) _