# git rev-parse -q --verify d899987759d5c18c26204a3defc15a3fb55048c0^{commit} # git fetch -q -n -f git://gitlab.ozlabs.ibm.com/mirror/linux-npiggin.git kerkins # git rev-parse -q --verify d899987759d5c18c26204a3defc15a3fb55048c0^{commit} d899987759d5c18c26204a3defc15a3fb55048c0 # git checkout -q -f -B kisskb d899987759d5c18c26204a3defc15a3fb55048c0 # git clean -qxdf # < git log -1 # commit d899987759d5c18c26204a3defc15a3fb55048c0 # Author: Nicholas Piggin # Date: Thu Aug 2 17:36:57 2018 +1000 # # powerpc/64s: reimplement book3s idle code in C # # Reimplement Book3S idle code in C, moving POWER7/8/9 implementation # speific HV idle code to the powernv platform code. # # Book3S assembly stubs are kept in common code and used only to save # the stack frame and non-volatile GPRs before executing architected # idle instructions, and restoring the stack and reloading GPRs then # returning to C after waking from idle. # # The complex logic dealing with threads and subcores, locking, SPRs, # HMIs, timebase resync, etc., is all done in C which makes it more # maintainable. # # This is not a strict translation to C code, there are some # significant differences: # # - Idle wakeup no longer uses the ->cpu_restore call to reinit SPRs, # but saves and restores them itself. # # - The optimisation where EC=ESL=0 idle modes did not have to save GPRs # or change MSR is restored, because it's now simple to do. ESL=1 # sleeps that do not lose GPRs can use this optimization too. # # - KVM secondary entry and cede is now more of a call/return style # rather than branchy. nap_state_lost is not required because KVM # always returns via NVGPR restoring path. # # Reviewed-by: Gautham R. Shenoy # Signed-off-by: Nicholas Piggin # # Left to do: # - KVM could use more review, it's pretty tricky. Not sure if what # I'm doing with the emergency stack is kosher. But it runs pretty fine # here with a POWER8 SMP+SMT guest. Possible to streamline # KVM cede code now that idle function saves nv gprs for us? # # Open question: # - Why does P9 restore some of the PMU SPRs (but not others), and # P8 only zeroes them? (A: Unclear. First pass conversion patch will not # try to tidy this up, but it will become much easier to do afterward). # # Since RFC v1: # - Now tested and working with POWER9 hash and radix. # - KVM support added. This took a bit of work to untangle and might # still have some issues, but POWER9 seems to work including hash on # radix with dependent threads mode. # - This snowballed a bit because of KVM and other details making it # not feasible to leave POWER7/8 code alone. That's only half done # at the moment. # - So far this trades about 800 lines of asm for 500 of C. With POWER7/8 # support done it might be another hundred or so lines of C. # # Since RFC v2: # - Fixed deep state SLB reloading # - Now tested and working with POWER8. # - Accounted for most feedback. # # Since RFC v3: # - Rebased to powerpc merge + idle state bugfix # - Split SLB flush/restore code out and shared with MCE code (pseries # MCE patches can also use). # - More testing on POWER8 including KVM with secondaries. # - Performance testing looks good. EC=ESL=0 is about 5% faster, other # stop states look a little faster too. # - Adjusted SPR saving to handler POWER7, haven't tested it. # # Since submission v1: # - More review comments from Gautham. # - Rename isa3_ to isa300_ prefix. # - Tinkered with some comments, copyright notice, changelog. # - Cede and regular idle do not go via KVM secondary wakeup code path, # so hwthread_state stores and barriers can be simplified, and some # KVM code paths simplified a little. # # Since v2: # - Rebase, SLB reload patch has been merged. # - More testing. Tested machine check idle wakeup path with mambo stepping # through instructions. # < /opt/cross/kisskb/korg/gcc-8.1.0-nolibc/x86_64-linux/bin/x86_64-linux-gcc --version # < git log --format=%s --max-count=1 d899987759d5c18c26204a3defc15a3fb55048c0 # < make -s -j 48 ARCH=x86_64 O=/kisskb/build/npiggin_x86_64-allnoconfig_x86_64-gcc8 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-8.1.0-nolibc/x86_64-linux/bin/x86_64-linux- allnoconfig # make -s -j 48 ARCH=x86_64 O=/kisskb/build/npiggin_x86_64-allnoconfig_x86_64-gcc8 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-8.1.0-nolibc/x86_64-linux/bin/x86_64-linux- Completed OK # rm -rf /kisskb/build/npiggin_x86_64-allnoconfig_x86_64-gcc8 # Build took: 0:03:14.585538