All of lore.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.