Looks like ap_letgo use needs platform specific code to allow avoiding the "sleep-gets-stuck" problem on PowerMac11,2's . . .

Mark Millard marklmi at yahoo.com
Sat Apr 20 03:36:27 UTC 2019


[Note: My context is tied to getting usefdt mode operable on
old PowerMacs. The below is only tested for usefdt mode
so far.]

The following investigatory patch has so-far stopped my having
sleep-gets-stuck problems (only seen on 2-socket/1-core-each
970 MP G5 Powermac11,2's as far as I know):

# svnlite diff  /usr/src/sys/powerpc/powerpc/mp_machdep.c | more                                                                                                                                 Index: /usr/src/sys/powerpc/powerpc/mp_machdep.c
===================================================================
--- /usr/src/sys/powerpc/powerpc/mp_machdep.c   (revision 345758)
+++ /usr/src/sys/powerpc/powerpc/mp_machdep.c   (working copy)
@@ -77,9 +77,10 @@
        PCPU_SET(awake, 1);
        __asm __volatile("msync; isync");
 
+       powerpc_sync();
        while (ap_letgo == 0)
-               __asm __volatile("or 31,31,31");
-       __asm __volatile("or 6,6,6");
+               powerpc_sync();
+       isync();
 
        /*
         * Set timebase as soon as possible to meet an implicit rendezvous
@@ -262,8 +263,11 @@
        __asm __volatile("msync; isync");
        
        /* Let APs continue */
-       atomic_store_rel_int(&ap_letgo, 1);
+       ap_letgo= 1;    // depend on prior sync, no need to lwsync first
 
+       powerpc_sync(); // analogous to what the ap's do (more similar time frame?)
+       if (ap_letgo) isync();
+
        platform_smp_timebase_sync(ap_timebase, 0);
 
        while (ap_awake < smp_cpus)

Apparently, the use of "or 31,31,31" causes sizable
variations in the time frame when the platform_smp_timebase_sync
happens on the various cores across the two 970MPs.

It looks something like a platform_ap_letgo_wait is appropriate,
with a powermac_ap_letgo_wait specific one, say. (Or, possibly,
AIM specific but spanning powermac?)

The above patch has booted and operated the 2-socket PowerMac7,2
context fine as well so far. I'll check the G5's and a G4
dual-socket with a 32-bit powerpc build.

I've no clue if there are any time-mismatch issues across
sockets/cores/hw-threads for the "8-way SMT" contexts with
"dozens to hundreds of CPUs".

I've only been testing for part of today and I do not have
access to any non-PowerMac PowerPC contexts. So this is
preliminary but I do not expect "or 31,31,31" is going to
be appropriate to the PowerMac11,2 contexts that caused
my investigation of the issue.

===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)



More information about the freebsd-ppc mailing list