Hi Keir,
I was noticing that the current Xen code was not able
to access the ACPI SLIT data (node to node distance) at runtime. And I found
root cause of it being the acpi_slit pointer not being valid at runtime.
I have fixed the issue by saving the slit table data at boot
time, and using the saved data for runtime access as follows.
Please accept or comment.
Thanks & Regards,
Nitin
Signed-Off-By: Nitin A Kamble
<nitin.a.kamble@xxxxxxxxx>
diff -r b474725a242b xen/arch/x86/srat.c
--- a/xen/arch/x86/srat.c Thu
Feb 25 07:50:38 2010 -0800
+++ b/xen/arch/x86/srat.c Thu
Feb 25 08:02:36 2010 -0800
@@ -20,13 +20,15 @@
#include <asm/e820.h>
#include <asm/page.h>
-static struct acpi_table_slit *__read_mostly acpi_slit;
-
static nodemask_t nodes_parsed __initdata;
static nodemask_t nodes_found __initdata;
static struct node nodes[MAX_NUMNODES] __initdata;
static u8 __read_mostly pxm2node[256] = { [0 ... 255]
= 0xff };
+static struct {
+ struct
acpi_table_slit slit_table;
+ u8
entries[MAX_NUMNODES * MAX_NUMNODES];
+} acpi_slit;
static int num_node_memblks;
static struct node node_memblk_range[NR_NODE_MEMBLKS];
@@ -144,7 +146,8 @@
printk(KERN_INFO
"ACPI: SLIT table looks invalid. Not used.\n");
return;
}
- acpi_slit
= slit;
+
+ memcpy(&acpi_slit,
slit, slit->header.length);
}
/* Callback for Proximity Domain -> LAPIC mapping
*/
@@ -424,10 +427,10 @@
{
int
index;
- if
(!acpi_slit)
+ if
(!acpi_slit.slit_table.header.length)
return
a == b ? 10 : 20;
- index
= acpi_slit->locality_count * node_to_pxm(a);
- return
acpi_slit->entry[index + node_to_pxm(b)];
+ index
= acpi_slit.slit_table.locality_count * node_to_pxm(a);
+ return
acpi_slit.slit_table.entry[index + node_to_pxm(b)];
}
EXPORT_SYMBOL(__node_distance);
diff -r b474725a242b xen/include/acpi/actbl1.h
--- a/xen/include/acpi/actbl1.h Thu Feb 25 07:50:38 2010
-0800
+++ b/xen/include/acpi/actbl1.h Thu
Feb 25 08:02:36 2010 -0800
@@ -573,7 +573,7 @@
struct acpi_table_slit {
struct
acpi_table_header header; /*
Common ACPI table header */
u64
locality_count;
- u8
entry[1]; /*
Real size = localities^2 */
+ u8
entry[0]; /*
Real size = localities^2 */
};
/*******************************************************************************