# git rev-parse -q --verify d899987759d5c18c26204a3defc15a3fb55048c0^{commit} d899987759d5c18c26204a3defc15a3fb55048c0 already have revision, skipping fetch # 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/aarch64-linux/bin/aarch64-linux-gcc --version # < git log --format=%s --max-count=1 d899987759d5c18c26204a3defc15a3fb55048c0 # < make -s -j 120 ARCH=arm64 O=/kisskb/build/npiggin_arm64-defconfig_arm64-gcc8 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-8.1.0-nolibc/aarch64-linux/bin/aarch64-linux- defconfig # make -s -j 120 ARCH=arm64 O=/kisskb/build/npiggin_arm64-defconfig_arm64-gcc8 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-8.1.0-nolibc/aarch64-linux/bin/aarch64-linux- /kisskb/src/fs/ext4/super.c: In function '__save_error_info.isra.8': /kisskb/src/fs/ext4/super.c:344:2: warning: 'strncpy' specified bound 32 equals destination size [-Wstringop-truncation] strncpy(es->s_last_error_func, func, sizeof(es->s_last_error_func)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /kisskb/src/fs/ext4/super.c:349:3: warning: 'strncpy' specified bound 32 equals destination size [-Wstringop-truncation] strncpy(es->s_first_error_func, func, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sizeof(es->s_first_error_func)); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In function 'devfreq_add_device.part.7', inlined from 'devfreq_add_device': /kisskb/src/drivers/devfreq/devfreq.c:593:2: warning: 'strncpy' specified bound 16 equals destination size [-Wstringop-truncation] strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /kisskb/src/drivers/gpu/drm/nouveau/nvif/client.c: In function 'nvif_client_init': /kisskb/src/drivers/gpu/drm/nouveau/nvif/client.c:72:2: warning: 'strncpy' specified bound 32 equals destination size [-Wstringop-truncation] strncpy(args.name, name, sizeof(args.name)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In function 'nvme_init_subnqn.isra.19', inlined from 'nvme_init_subsystem' at /kisskb/src/drivers/nvme/host/core.c:2225:2, inlined from 'nvme_init_identify' at /kisskb/src/drivers/nvme/host/core.c:2372:9: /kisskb/src/drivers/nvme/host/core.c:2079:3: warning: 'strncpy' output may be truncated copying 223 bytes from a string of length 255 [-Wstringop-truncation] strncpy(subsys->subnqn, id->subnqn, NVMF_NQN_SIZE); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In function 'qcom_glink_rx_close', inlined from 'qcom_glink_work' at /kisskb/src/drivers/rpmsg/qcom_glink_native.c:1533:4: /kisskb/src/drivers/rpmsg/qcom_glink_native.c:1459:3: warning: 'strncpy' specified bound 32 equals destination size [-Wstringop-truncation] strncpy(chinfo.name, channel->name, sizeof(chinfo.name)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In function 'qcom_glink_rx_open', inlined from 'qcom_glink_work' at /kisskb/src/drivers/rpmsg/qcom_glink_native.c:1530:4: /kisskb/src/drivers/rpmsg/qcom_glink_native.c:1409:3: warning: 'strncpy' specified bound 32 equals destination size [-Wstringop-truncation] strncpy(rpdev->id.name, name, RPMSG_NAME_SIZE); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In function 'qcom_smd_create_device.isra.2', inlined from 'qcom_channel_state_worker' at /kisskb/src/drivers/rpmsg/qcom_smd.c:1281:3: /kisskb/src/drivers/rpmsg/qcom_smd.c:1076:2: warning: 'strncpy' specified bound 32 equals destination size [-Wstringop-truncation] strncpy(rpdev->id.name, channel->name, RPMSG_NAME_SIZE); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /kisskb/src/drivers/rpmsg/qcom_smd.c: In function 'qcom_channel_state_worker': /kisskb/src/drivers/rpmsg/qcom_smd.c:1304:3: warning: 'strncpy' specified bound 32 equals destination size [-Wstringop-truncation] strncpy(chinfo.name, channel->name, sizeof(chinfo.name)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In function 'brcmf_vndr_ie', inlined from 'brcmf_vif_set_mgmt_ie' at /kisskb/src/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c:4278:25: /kisskb/src/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c:4167:2: warning: 'strncpy' output truncated before terminating nul copying 3 bytes from a string of the same length [-Wstringop-truncation] strncpy(iebuf, add_del_cmd, VNDR_IE_CMD_LEN - 1); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In function 'brcmf_vndr_ie', inlined from 'brcmf_vif_set_mgmt_ie' at /kisskb/src/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c:4315:25: /kisskb/src/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c:4167:2: warning: 'strncpy' output truncated before terminating nul copying 3 bytes from a string of the same length [-Wstringop-truncation] strncpy(iebuf, add_del_cmd, VNDR_IE_CMD_LEN - 1); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /kisskb/src/drivers/video/hdmi.c: In function 'hdmi_spd_infoframe_init': /kisskb/src/drivers/video/hdmi.c:174:2: warning: 'strncpy' specified bound 8 equals destination size [-Wstringop-truncation] strncpy(frame->vendor, vendor, sizeof(frame->vendor)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /kisskb/src/drivers/video/hdmi.c:175:2: warning: 'strncpy' specified bound 16 equals destination size [-Wstringop-truncation] strncpy(frame->product, product, sizeof(frame->product)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In function 'nvkm_udevice_info', inlined from 'nvkm_udevice_mthd' at /kisskb/src/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c:223:10: /kisskb/src/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c:192:2: warning: 'strncpy' specified bound 16 equals destination size [-Wstringop-truncation] strncpy(args->v0.chip, device->chip->name, sizeof(args->v0.chip)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /kisskb/src/drivers/gpu/drm/msm/msm_fence.c: In function 'msm_fence_context_alloc': /kisskb/src/drivers/gpu/drm/msm/msm_fence.c:34:2: warning: 'strncpy' specified bound 32 equals destination size [-Wstringop-truncation] strncpy(fctx->name, name, sizeof(fctx->name)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Completed OK # rm -rf /kisskb/build/npiggin_arm64-defconfig_arm64-gcc8 # Build took: 0:01:35.082413