svn commit: r230078 - stable/9/sys/x86/acpica

John Baldwin jhb at FreeBSD.org
Fri Jan 13 19:54:01 UTC 2012


Author: jhb
Date: Fri Jan 13 19:54:00 2012
New Revision: 230078
URL: http://svn.freebsd.org/changeset/base/230078

Log:
  MFC 229427:
  Fix a few bugs in the SRAT parsing code:
  - Actually increment ndomain when building our list of known domains
    so that we can properly renumber them to be 0-based and dense.
  - If the number of domains exceeds the configured maximum (VM_NDOMAIN),
    bail out of processing the SRAT and disable NUMA rather than hitting an
    obscure panic later.
  - Don't bother parsing the SRAT at all if VM_NDOMAIN is set to 1 to
    disable NUMA (the default).

Modified:
  stable/9/sys/x86/acpica/srat.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/amd64/include/xen/   (props changed)
  stable/9/sys/boot/   (props changed)
  stable/9/sys/boot/i386/efi/   (props changed)
  stable/9/sys/boot/ia64/efi/   (props changed)
  stable/9/sys/boot/ia64/ski/   (props changed)
  stable/9/sys/boot/powerpc/boot1.chrp/   (props changed)
  stable/9/sys/boot/powerpc/ofw/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)
  stable/9/sys/conf/   (props changed)
  stable/9/sys/contrib/dev/acpica/   (props changed)
  stable/9/sys/contrib/octeon-sdk/   (props changed)
  stable/9/sys/contrib/pf/   (props changed)
  stable/9/sys/contrib/x86emu/   (props changed)

Modified: stable/9/sys/x86/acpica/srat.c
==============================================================================
--- stable/9/sys/x86/acpica/srat.c	Fri Jan 13 19:51:15 2012	(r230077)
+++ stable/9/sys/x86/acpica/srat.c	Fri Jan 13 19:54:00 2012	(r230078)
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/acpica/acpivar.h>
 
+#if VM_NDOMAIN > 1
 struct cpu_info {
 	int enabled:1;
 	int has_memory:1;
@@ -237,9 +238,9 @@ check_phys_avail(void)
 
 /*
  * Renumber the memory domains to be compact and zero-based if not
- * already.
+ * already.  Returns an error if there are too many domains.
  */
-static void
+static int
 renumber_domains(void)
 {
 	int domains[VM_PHYSSEG_MAX];
@@ -261,6 +262,11 @@ renumber_domains(void)
 		for (j = ndomain; j > slot; j--)
 			domains[j] = domains[j - 1];
 		domains[slot] = mem_info[i].domain;
+		ndomain++;
+		if (ndomain > VM_NDOMAIN) {
+			printf("SRAT: Too many memory domains\n");
+			return (EFBIG);
+		}
 	}
 
 	/* Renumber each domain to its index in the sorted 'domains' list. */
@@ -280,6 +286,7 @@ renumber_domains(void)
 			if (cpus[j].enabled && cpus[j].domain == domains[i])
 				cpus[j].domain = i;
 	}
+	return (0);
 }
 
 /*
@@ -306,13 +313,12 @@ parse_srat(void *dummy)
 	srat_walk_table(srat_parse_entry, &error);
 	acpi_unmap_table(srat);
 	srat = NULL;
-	if (error || check_domains() != 0 || check_phys_avail() != 0) {
+	if (error || check_domains() != 0 || check_phys_avail() != 0 ||
+	    renumber_domains() != 0) {
 		srat_physaddr = 0;
 		return;
 	}
 
-	renumber_domains();
-
 	/* Point vm_phys at our memory affinity table. */
 	mem_affinity = mem_info;
 }
@@ -354,3 +360,4 @@ srat_set_cpus(void *dummy)
 	}
 }
 SYSINIT(srat_set_cpus, SI_SUB_CPU, SI_ORDER_ANY, srat_set_cpus, NULL);
+#endif /* VM_NDOMAIN > 1 */


More information about the svn-src-all mailing list