Date: Wed, 13 Feb 2019 22:09:44 -0800 From: Mark Millard <marklmi@yahoo.com> To: FreeBSD PowerPC ML <freebsd-ppc@freebsd.org> Subject: Re: Some evidence about the PowerMac G5 multiprocessor boot hang ups with the modern VM_MAX_KERNEL_ADDRESS value Message-ID: <9FBCA729-CE80-44CD-8873-431853E55231@yahoo.com> In-Reply-To: <11680D15-D43D-4115-AF4F-5F6E4E0022C9@yahoo.com> References: <11680D15-D43D-4115-AF4F-5F6E4E0022C9@yahoo.com>
next in thread | previous in thread | raw e-mail | index | archive | help
[I provide additional bootverbose output for both a successful boot and a failing one.] On 2019-Feb-13, at 19:35, Mark Millard <marklmi at yahoo.com> wrote: > I added some bootverbose messages to: >=20 > static int > powermac_smp_start_cpu(platform_t plat, struct pcpu *pc) > (in /usr/src/sys/powerpc/powermac/platform_powermac.c ) >=20 > and: >=20 > void > machdep_ap_bootstrap(void) > ( /usr/src/sys/powerpc/powerpc/mp_machdep.c ) >=20 > and: >=20 > static void > cpu_mp_unleash(void *dummy) > ( /usr/src/sys/powerpc/powerpc/mp_machdep.c ) >=20 >=20 >=20 > The result was (typed from a image and > showing normal messages too): >=20 > Adding CPU 0, hwref=3Dcd38, awkae=3D1 > Waling up CPU 3 (dev=3Dc480) > Before reset 4&0 for CPU 3, hwref=3Dc480, awake=3D0 > After reset 4&0 for CPU3, hwref=3Dc480, awake=3D0 > After attempted wait for awake CPU 3, hwref=3Dc480, awake=3D0 > cpu_mp_unleash after platform_smp_start_cpu and waiting: CPU3, = hwref=3Dx480, awake=3D0 > cpu_mp_unleash adding pc_cpuid to stopped_cpus: CPU 3 (dev=3Dc480) > Waking up CPU 2 (dev=3Dc768) > Before reset 4&0 for CPU 2, hwref=3Dc768, awake=3D0 >=20 > There is no more text. >=20 > Part of the information is what messages were not displayed. >=20 > Some notes: >=20 > Only CPU 0 gots a: smp_cpus++ (resulting in 1). >=20 > There is no solid evidence for if machdep_ap_bootstrap was > ever used for CPU 3 or CPU 2. >=20 > The wait loop after the platform_smp_start_cpu call in > cpu_mp_unleash for CPU 3 is not used. The code in > machdep_ap_bootstrap: >=20 > PCPU_SET(awake, 1); > __asm __volatile("msync; isync"); >=20 > did not have a visible effect on the pc->pc_awake value in > platform_smp_start_cpu and cpu_mp_unleash. I have no > unique evidence that it was executed at all. >=20 > My messages added to machdep_ap_bootstrap were not displayed. >=20 > platform_smp_start_cpu did not return for CPU 2. > cpu_mp_unleash makes no more progress. In fact the > 2 resets do not complete overall for CPU 2 (but did > for CPU 3, even if it is unclear what code was > executed): >=20 > *rstvec =3D 4; > powerpc_sync(); > (void)(*rstvec); > powerpc_sync(); > DELAY(1); > *rstvec =3D 0; > powerpc_sync(); > (void)(*rstvec); > powerpc_sync(); >=20 > I'll see about getting more information about the resets used. >=20 >=20 >=20 > For reference for the added messages: >=20 > # svnlite diff /usr/src/sys/powerpc/powermac/platform_powermac.c = /usr/src/sys/powerpc/powerpc/mp_machdep.c > Index: /usr/src/sys/powerpc/powermac/platform_powermac.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- /usr/src/sys/powerpc/powermac/platform_powermac.c (revision = 344018) > +++ /usr/src/sys/powerpc/powermac/platform_powermac.c (working copy) > @@ -371,6 +371,11 @@ > rstvec_virtbase =3D pmap_mapdev(0x80000000, PAGE_SIZE); >=20 > rstvec =3D rstvec_virtbase + reset; > +=20 > + if (bootverbose) // HACK!!! > + printf("Before reset 4&0 for CPU %d, hwref=3D%jx, = awake=3D%x\n", > + pc->pc_cpuid, (uintmax_t)pc->pc_hwref, > + pc->pc_awake); >=20 > *rstvec =3D 4; > powerpc_sync(); > @@ -382,10 +387,20 @@ > (void)(*rstvec); > powerpc_sync(); >=20 > + if (bootverbose) // HACK!!! > + printf("After reset 4&0 for CPU %d, hwref=3D%jx, = awake=3D%x\n", > + pc->pc_cpuid, (uintmax_t)pc->pc_hwref, > + pc->pc_awake); > + > timeout =3D 10000; > while (!pc->pc_awake && timeout--) > DELAY(100); >=20 > + if (bootverbose) // HACK!!! > + printf("After attempted wait for awake CPU %d, = hwref=3D%jx, awake=3D%x\n", > + pc->pc_cpuid, (uintmax_t)pc->pc_hwref, > + pc->pc_awake); > + > return ((pc->pc_awake) ? 0 : EBUSY); > #else > /* No SMP support */ > Index: /usr/src/sys/powerpc/powerpc/mp_machdep.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- /usr/src/sys/powerpc/powerpc/mp_machdep.c (revision 344018) > +++ /usr/src/sys/powerpc/powerpc/mp_machdep.c (working copy) > @@ -97,6 +97,9 @@ > /* Initialize decrementer */ > decr_ap_init(); >=20 > + if (bootverbose) // HACK!!! > + printf("machdep_ap_bootstrap before ap_boot_mtx lock: = AP CPU #%d launched\n", PCPU_GET(cpuid)); > + > /* Serialize console output and AP count increment */ > mtx_lock_spin(&ap_boot_mtx); > ap_awake++; > @@ -109,6 +112,8 @@ >=20 > while(smp_started =3D=3D 0) > ; > + if (bootverbose) // HACK!!! > + printf("machdep_ap_bootstrap after smp_started!=3D0: = AP CPU #%d launched\n", PCPU_GET(cpuid)); >=20 > /* Start per-CPU event timers. */ > cpu_initclocks_ap(); > @@ -238,10 +243,19 @@ >=20 > ret =3D platform_smp_start_cpu(pc); > if (ret =3D=3D 0) { > + if (bootverbose) // HACK!!! > + printf("cpu_mp_unleash = attempting to wait for pc_awake: CPU %d, hwref=3D%jx, awake=3D%x\n", > + pc->pc_cpuid, = (uintmax_t)pc->pc_hwref, > + pc->pc_awake); > + > timeout =3D 2000; /* wait 2sec for = the AP */ > while (!pc->pc_awake && --timeout > 0) > DELAY(1000); > } > + if (bootverbose) // HACK!!! > + printf("cpu_mp_unleash after = platform_smp_start_cpu and waiting: CPU %d, hwref=3D%jx, awake=3D%x\n", > + pc->pc_cpuid, = (uintmax_t)pc->pc_hwref, > + pc->pc_awake); > } else { > pc->pc_awake =3D 1; > } > @@ -252,7 +266,13 @@ > pc->pc_awake); > smp_cpus++; > } else > + { // HACK!!! > + if (bootverbose) // HACK!!! > + printf("cpu_mp_unleash adding = pc_cpuid to stopped_cpus: CPU %d (dev=3D%x)\n", > + pc->pc_cpuid, (int)pc->pc_hwref); > CPU_SET(pc->pc_cpuid, &stopped_cpus); > + } // HACK!!! > + > } >=20 > ap_awake =3D 1; >=20 I added some more bootverbose code. A boot that completed showed: Adding CPU 0, hwref=3Dcd38, awake=3D1 Trying to mount root from ufs:/dev/ufs/FBSDG5L2rootfs [rw,noatime]... Waking up CPU 3 (dev=3Dc480) powermac_smp_start_cpu 's OF_getprop for CPU 3, hwref=3Dc480, awake=3D0: = res=3D4, reset=3D8c powermac_smp_start_cpu for CPU 3, hwref=3Dc480, awake=3D0: = rstvec_virtbase=3D0xe000000087fd2000 powermac_smp_start_cpu for CPU 3, hwref=3Dc480, awake=3D0: = rstvec=3D0xe000000087fd208c Before reset 4&0 for CPU 3, hwref=3Dc480, awake=3D0 After reset 4&0 for CPU 3, hwref=3Dc480, awake=3D0 After attempted wait for awake CPU 3, hwref=3Dc480, awake=3D1 cpu_mp_unleash attempting to wait for pc_awake: CPU 3, hwref=3Dc480, = awake=3D1 cpu_mp_unleash after platform_smp_start_cpu and waiting: CPU 3, = hwref=3Dc480, awake=3D1 Adding CPU 3, hwref=3Dc480, awake=3D1 Waking up CPU 2 (dev=3Dc768) powermac_smp_start_cpu 's OF_getprop for CPU 2, hwref=3Dc768, awake=3D0: = res=3D4, reset=3D8b powermac_smp_start_cpu for CPU 2, hwref=3Dc768, awake=3D0: = rstvec=3D0xe000000087fd208b Before reset 4&0 for CPU 2, hwref=3Dc768, awake=3D0 After reset 4&0 for CPU 2, hwref=3Dc768, awake=3D0 After attempted wait for awake CPU 2, hwref=3Dc768, awake=3D1 cpu_mp_unleash attempting to wait for pc_awake: CPU 2, hwref=3Dc768, = awake=3D1 cpu_mp_unleash after platform_smp_start_cpu and waiting: CPU 2, = hwref=3Dc768, awake=3D1 Adding CPU 2, hwref=3Dc768, awake=3D1 Waking up CPU 1 (dev=3Dca50) powermac_smp_start_cpu 's OF_getprop for CPU 1, hwref=3Dca50, awake=3D0: = res=3D4, reset=3D8a powermac_smp_start_cpu for CPU 1, hwref=3Dca50, awake=3D0: = rstvec=3D0xe000000087fd208a Before reset 4&0 for CPU 1, hwref=3Dca50, awake=3D0 After reset 4&0 for CPU 1, hwref=3Dca50, awake=3D0 After attempted wait for awake CPU 1, hwref=3Dca50, awake=3D1 cpu_mp_unleash attempting to wait for pc_awake: CPU 1, hwref=3Dca50, = awake=3D1 cpu_mp_unleash after platform_smp_start_cpu and waiting: CPU 1, = hwref=3Dca50, awake=3D1 Adding CPU 1, hwref=3Dca50, awake=3D1 machdep_ap_bootstrap before ap_boot_mtx lock: AP CPU #3 launched machdep_ap_bootstrap before ap_boot_mtx lock: AP CPU #2 launched machdep_ap_bootstrap before ap_boot_mtx lock: AP CPU #1 launched SMP: AP CPU #3 launched SMP: AP CPU #2 launched SMP: AP CPU #1 launched machdep_ap_bootstrap after smp_started!=3D0: AP CPU #2 launched machdep_ap_bootstrap after smp_started!=3D0: AP CPU #3 launched machdep_ap_bootstrap after smp_started!=3D0: AP CPU #1 launched A failing boot is very similar but for awake values (and consequences) and omitting much (the hang): Adding CPU 0, hwref=3Dcd38, awake=3D1 Trying to mount root from ufs:/dev/ufs/FBSDG5L2rootfs [rw,noatime]... Waking up CPU 3 (dev=3Dc480) powermac_smp_start_cpu 's OF_getprop for CPU 3, hwref=3Dc480, awake=3D0: = res=3D4, reset=3D8c powermac_smp_start_cpu for CPU 3, hwref=3Dc480, awake=3D0: = rstvec_virtbase=3D0xe000000087fd2000 powermac_smp_start_cpu for CPU 3, hwref=3Dc480, awake=3D0: = rstvec=3D0xe000000087fd208c Before reset 4&0 for CPU 3, hwref=3Dc480, awake=3D0 After reset 4&0 for CPU 3, hwref=3Dc480, awake=3D0 After attempted wait for awake CPU 3, hwref=3Dc480, awake=3D0 cpu_mp_unleash after platform_smp_start_cpu and waiting: CPU 3, = hwref=3Dc480, awake=3D0 cpu_mp_unleash adding pc_cpuid to stopped_cpus: CPU 3 (dev=3Dc480) Waking up CPU 2 (dev=3Dc768) powermac_smp_start_cpu 's OF_getprop for CPU 2, hwref=3Dc768, awake=3D0: = res=3D4, reset=3D8b powermac_smp_start_cpu for CPU 2, hwref=3Dc768, awake=3D0: = rstvec=3D0xe000000087fd208b Before reset 4&0 for CPU 2, hwref=3Dc768, awake=3D0 =3D=3D=3D Mark Millard marklmi at yahoo.com ( dsl-only.net went away in early 2018-Mar)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9FBCA729-CE80-44CD-8873-431853E55231>