public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
* Running NUMA kernel on Tiger
@ 2003-08-28 17:25 Luck, Tony
  0 siblings, 0 replies; only message in thread
From: Luck, Tony @ 2003-08-28 17:25 UTC (permalink / raw)
  To: linux-ia64

[-- Attachment #1: Type: text/plain, Size: 1043 bytes --]

In case anyone else would like to experment with NUMA code,
but doesn't have access to a NUMA machine ...

Here is a patch against 2.6.0test4 + ia64-030826 Mosberger patch that
will allow you to configure a kernel with:

	CONFIG_NUMA=y
	CONFIG_ACPI_NUMA=y
	CONFIG_DISCONTIGMEM=y
	CONFIG_VIRTUAL_MEM_MAP=y

and boot on a Tiger.  You may need to change the "phony_srat"
initialization in drivers/acpi/tables.c to match the configuration
of your machine, the version in this patch defines memory below 4G
to be on node 0, and memory in the range 4G-8G to be on node 1.
Cpu 0 & 1 are on node 0, cpu 2 & 3  are on node 1.

This patch includes some extra fixes in addition to adding the SRAT table:

1) execute find_memory() after acpi_numa_init() [arch/ia64/kernel/setup.c]

2) Don't allocate memory using alloc_bootmem() in early acpi initializations
[drivers/acpi/tables.c]

3) Don't use any memory in a granule with a hole [arch/ia64/kernel/efi.c]

-Tony

[Thanks to Martin Hicks and Jesse Barnes for patches 1 & 2]

[-- Attachment #2: phonysrat.patch --]
[-- Type: application/octet-stream, Size: 3797 bytes --]

diff -ru linux-2.6.0-test4/arch/ia64/kernel/efi.c tiger-numa/arch/ia64/kernel/efi.c
--- linux-2.6.0-test4/arch/ia64/kernel/efi.c	Fri Aug 22 16:51:04 2003
+++ tiger-numa/arch/ia64/kernel/efi.c	Wed Aug 27 16:47:27 2003
@@ -324,7 +324,7 @@
 				check_md = q;
 
 				if (check_md->attribute & EFI_MEMORY_WB)
-					trim_bottom(md, granule_addr);
+					trim_bottom(check_md, granule_addr);
 
 				if (check_md->phys_addr < granule_addr)
 					continue;
diff -ru linux-2.6.0-test4/arch/ia64/kernel/setup.c tiger-numa/arch/ia64/kernel/setup.c
--- linux-2.6.0-test4/arch/ia64/kernel/setup.c	Fri Aug 22 16:52:22 2003
+++ tiger-numa/arch/ia64/kernel/setup.c	Tue Aug 26 13:37:41 2003
@@ -372,7 +372,6 @@
 	strlcpy(saved_command_line, *cmdline_p, sizeof(saved_command_line));
 
 	efi_init();
-	find_memory();
 
 #ifdef CONFIG_ACPI_BOOT
 	/* Initialize the ACPI boot-time table parser */
@@ -386,6 +385,8 @@
 # endif
 #endif /* CONFIG_APCI_BOOT */
 
+	find_memory();
+
 	/* process SAL system table: */
 	ia64_sal_init(efi.sal_systab);
 
diff -ru linux-2.6.0-test4/drivers/acpi/tables.c tiger-numa/drivers/acpi/tables.c
--- linux-2.6.0-test4/drivers/acpi/tables.c	Thu Aug 28 09:51:35 2003
+++ tiger-numa/drivers/acpi/tables.c	Thu Aug 28 09:52:22 2003
@@ -69,7 +69,11 @@
 
 static unsigned long		sdt_pa;		/* Physical Address */
 static unsigned long		sdt_count;	/* Table count */
+#if 0
 static struct acpi_table_sdt	*sdt_entry;
+#else
+static struct acpi_table_sdt	sdt_entry[ACPI_MAX_TABLES];
+#endif
 
 void
 acpi_table_print (
@@ -281,6 +285,41 @@
 	return 0;
 }
 	 
+/*
+ * SRAT for multi-node simulation on Tiger:
+ * two nodes, two cpus on each, 0G<mem<4G on node 0, 4G<mem<8G on node 1
+ */
+struct {
+	struct acpi_table_srat s;
+	struct acpi_table_processor_affinity p[4];
+	struct acpi_table_memory_affinity m[2];
+} phony_srat = {
+	{
+		{
+			{ 'S', 'R', 'A', 'T' },
+			0,
+			0,
+			0,
+			{ "OEMID" },
+			{ "OEMTBL" },
+			0,
+			{ "asl" },
+			0
+		},
+		0,
+		0L
+	},
+	{
+		{{ 0, 16 }, 0, 0xC0, { 1, 0 }, 0x18, "" },
+		{{ 0, 16 }, 0, 0xC2, { 1, 0 }, 0x18, "" },
+		{{ 0, 16 }, 1, 0xC4, { 1, 0 }, 0x18, "" },
+		{{ 0, 16 }, 1, 0xC6, { 1, 0 }, 0x18, "" },
+        },
+	{
+		{{ 1, 40 }, 0, "", 0, 0, 0, 1, 1, { 1, 0, 0 }, 0L },
+		{{ 1, 40 }, 1, "", 0, 1, 0, 1, 1, { 1, 0, 0 }, 0L },
+	}
+};
 
 int __init
 acpi_table_parse_madt_family (
@@ -298,6 +337,12 @@
 	if (!handler)
 		return -EINVAL;
 
+	if (id == ACPI_SRAT) {
+		madt = (void *)&phony_srat;
+		madt_end = (unsigned long) madt + sizeof(phony_srat);
+		goto do_parse;
+	}
+
 	/* Locate the MADT (if exists). There should only be one. */
 
 	for (i = 0; i < sdt_count; i++) {
@@ -321,6 +366,7 @@
 
 	madt_end = (unsigned long) madt + sdt_entry[i].size;
 
+do_parse:
 	/* Parse all entries looking for a match. */
 
 	entry = (acpi_table_entry_header *)
@@ -360,6 +406,11 @@
 	if (!handler)
 		return -EINVAL;
 
+	if (id == ACPI_SRAT) {
+		handler(ia64_tpa((unsigned long)&phony_srat), sizeof(phony_srat));
+		return 1;
+	}
+
 	for (i = 0; i < sdt_count; i++) {
 		if (sdt_entry[i].id != id)
 			continue;
@@ -425,11 +476,13 @@
 			sdt_count = ACPI_MAX_TABLES;
 		}
 
+#if 0
 		sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt));
 		if (!sdt_entry) {
 			printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n");
 			return -ENOMEM;
 		}
+#endif
 
 		for (i = 0; i < sdt_count; i++)
 			sdt_entry[i].pa = (unsigned long) mapped_xsdt->entry[i];
@@ -477,11 +530,13 @@
 			sdt_count = ACPI_MAX_TABLES;
 		}
 
+#if 0
 		sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt));
 		if (!sdt_entry) {
 			printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n");
 			return -ENOMEM;
 		}
+#endif
 
 		for (i = 0; i < sdt_count; i++)
 			sdt_entry[i].pa = (unsigned long) mapped_rsdt->entry[i];

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-08-28 17:25 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-08-28 17:25 Running NUMA kernel on Tiger Luck, Tony

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox