Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 14 Jul 2001 11:25:46 -0700 (PDT)
From:      Matthew Jacob <mjacob@feral.com>
To:        smp@freebsd.org, audit@freebsd.org
Subject:   planned change to mbinit code and minor changes to mp startup
Message-ID:  <Pine.BSF.4.21.0107141117110.87022-100000@beppo>
In-Reply-To: <Pine.BSF.4.21.0107130000220.61694-100000@beppo>

next in thread | previous in thread | raw e-mail | index | archive | help

Problem: the MB init and alloc code assumes that in the SMP case that there is
a dense array of CPU ids for the CPUs present and reported via mp_ncpus.

This is not true and cannot be true for a number of reasons:

a) CPUids don't always start at 0 (e.g, Alpha 8200)
b) CPUs may be disabled, leaving holes in the map.
c) CPUs may (eventually) want to come and go while we're running.

I thought about making cpuid a 'virtual' construct. We may eventually want to
do this, but this only solves #a/#b- it will not move us toward #c. And it can
get somewhat dicey for the amount of code to check and change by doing this.

Below is a partial solution that takes the approach of just checking who is
'absent' when mbinit is called. It requires that all_cpus be set sensibly
whether there are more than one cpu or not (which makes sense too).

Making this change allows the ALpha 8200s to work again and also allows
disabling arbitrary CPUs leaving holes in the CPU map to work without getting
out of sync.

-matt


Index: kern/subr_mbuf.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/subr_mbuf.c,v
retrieving revision 1.2
diff -u -r1.2 subr_mbuf.c
--- kern/subr_mbuf.c	2001/06/22 16:03:23	1.2
+++ kern/subr_mbuf.c	2001/07/14 18:14:30
@@ -48,7 +48,12 @@
 /*
  * Maximum number of PCPU containers. If you know what you're doing you could
  * explicitly define MBALLOC_NCPU to be exactly the number of CPUs on your
- * system during compilation, and thus prevent kernel structure bloats.
+ * system during compilation, and thus prevent kernel structure bloat.
+ *
+ * SMP and non-SMP kernels clearly have a different number of possible cpus,
+ * but because we cannot assume a dense array of CPUs, we always allocate
+ * and traverse PCPU containers up to NCPU amount and merely check for
+ * CPU availability.
  */
 #ifdef	MBALLOC_NCPU
 #define	NCPU	MBALLOC_NCPU
@@ -57,12 +62,11 @@
 #endif
 
 /*
- * SMP and non-SMP kernels clearly have a different number of possible cpus.
  */
 #ifdef	SMP
-#define	NCPU_PRESENT	mp_ncpus
+#define	CPU_ABSENT(x)	((all_cpus & (1 << x)) == 0)
 #else
-#define	NCPU_PRESENT	1
+#define	CPU_ABSENT(x)	0
 #endif
 
 /*
@@ -388,7 +392,10 @@
 	/*
 	 * Allocate and initialize PCPU containers.
 	 */
-	for (i = 0; i < NCPU_PRESENT; i++) {
+	for (i = 0; i < NCPU; i++) {
+		if (CPU_ABSENT(i)) {
+			continue;
+		}
 		mb_list_mbuf.ml_cntlst[i] = malloc(sizeof(struct mb_pcpu_list),
 		    M_MBUF, M_NOWAIT);
 		mb_list_clust.ml_cntlst[i] = malloc(sizeof(struct mb_pcpu_list),
@@ -626,7 +633,9 @@
 	 * Cycle all the PCPU containers. Increment starved counts if found
 	 * empty.
 	 */
-	for (i = 0; i < NCPU_PRESENT; i++) {
+	for (i = 0; i < NCPU; i++) {
+		if (CPU_ABSENT(i))
+			continue;
 		cnt_lst = MB_GET_PCPU_LIST_NUM(mb_list, i);
 		MB_LOCK_CONT(cnt_lst);
 
Index: powerpc/powerpc/mp_machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/powerpc/powerpc/mp_machdep.c,v
retrieving revision 1.8
diff -u -r1.8 mp_machdep.c
--- powerpc/powerpc/mp_machdep.c	2001/06/16 07:14:07	1.8
+++ powerpc/powerpc/mp_machdep.c	2001/07/14 18:15:14
@@ -51,6 +51,7 @@
 int
 cpu_mp_probe(void)
 {
+	all_cpus = 1;	/* needed for MB init code */
 	return 0;
 }
 
Index: ia64/ia64/mp_machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/ia64/ia64/mp_machdep.c,v
retrieving revision 1.17
diff -u -r1.17 mp_machdep.c
--- ia64/ia64/mp_machdep.c	2001/05/15 23:22:24	1.17
+++ ia64/ia64/mp_machdep.c	2001/07/14 18:15:14
@@ -71,6 +71,7 @@
 int
 cpu_mp_probe()
 {
+	all_cpus = 1;	/* Needed for MB init code */
 	return (0);
 }
 
Index: i386/i386/mp_machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/mp_machdep.c,v
retrieving revision 1.160
diff -u -r1.160 mp_machdep.c
--- i386/i386/mp_machdep.c	2001/07/12 06:32:50	1.160
+++ i386/i386/mp_machdep.c	2001/07/14 18:15:15
@@ -406,6 +406,12 @@
 int
 cpu_mp_probe(void)
 {
+	/*
+	 * Record BSP in CPU map
+	 * This is done here so that MBUF init code works correctly.
+	 */
+	all_cpus = 1;
+
 	return (mp_capable);
 }
 
@@ -1928,9 +1934,6 @@
 	outb(CMOS_REG, BIOS_RESET);
 	mpbiosreason = inb(CMOS_DATA);
 #endif
-
-	/* record BSP in CPU map */
-	all_cpus = 1;
 
 	/* set up temporary P==V mapping for AP boot */
 	/* XXX this is a hack, we should boot the AP on its own stack/PTD */
Index: alpha/alpha/mp_machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/alpha/alpha/mp_machdep.c,v
retrieving revision 1.22
diff -u -r1.22 mp_machdep.c
--- alpha/alpha/mp_machdep.c	2001/06/29 11:10:25	1.22
+++ alpha/alpha/mp_machdep.c	2001/07/14 18:15:47
@@ -301,6 +303,11 @@
 
 	/* XXX: Need to check for valid platforms here. */
 
+	boot_cpu_id = PCPU_GET(cpuid);
+	KASSERT(boot_cpu_id == hwrpb->rpb_primary_cpu_id,
+	    ("cpu_mp_probe() called on non-primary CPU"));
+	all_cpus = 1 << boot_cpu_id;
+
 	mp_ncpus = 1;
 
 	/* Make sure we have at least one secondary CPU. */
@@ -324,17 +331,14 @@
 }
 
 void
-cpu_mp_start()
+cpu_mp_start(void)
 {
 	int i;
 
 	mtx_init(&ap_boot_mtx, "ap boot", MTX_SPIN);
 
-	boot_cpu_id = PCPU_GET(cpuid);
-	KASSERT(boot_cpu_id == hwrpb->rpb_primary_cpu_id,
-	    ("mp_start() called on non-primary CPU"));
-	all_cpus = 1 << boot_cpu_id;
 	for (i = 0; i < hwrpb->rpb_pcs_cnt; i++) {
 		struct pcs *pcsp;
 
 		if (i == boot_cpu_id)



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-smp" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0107141117110.87022-100000>