The patch below does not apply to the 4.14-stable tree. If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to stable@vger.kernel.org.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From b03897cf318dfc47de33a7ecbc7655584266f034 Mon Sep 17 00:00:00 2001
From: "Gautham R. Shenoy" ego@linux.vnet.ibm.com Date: Wed, 18 Jul 2018 14:03:16 +0530 Subject: [PATCH] powerpc/powernv: Fix save/restore of SPRG3 on entry/exit from stop (idle)
On 64-bit servers, SPRN_SPRG3 and its userspace read-only mirror SPRN_USPRG3 are used as userspace VDSO write and read registers respectively.
SPRN_SPRG3 is lost when we enter stop4 and above, and is currently not restored. As a result, any read from SPRN_USPRG3 returns zero on an exit from stop4 (Power9 only) and above.
Thus in this situation, on POWER9, any call from sched_getcpu() always returns zero, as on powerpc, we call __kernel_getcpu() which relies upon SPRN_USPRG3 to report the CPU and NUMA node information.
Fix this by restoring SPRN_SPRG3 on wake up from a deep stop state with the sprg_vdso value that is cached in PACA.
Fixes: e1c1cfed5432 ("powerpc/powernv: Save/Restore additional SPRs for stop4 cpuidle") Cc: stable@vger.kernel.org # v4.14+ Reported-by: Florian Weimer fweimer@redhat.com Signed-off-by: Gautham R. Shenoy ego@linux.vnet.ibm.com Reviewed-by: Michael Ellerman mpe@ellerman.id.au Signed-off-by: Michael Ellerman mpe@ellerman.id.au
diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S index e734f6e45abc..689306118b48 100644 --- a/arch/powerpc/kernel/idle_book3s.S +++ b/arch/powerpc/kernel/idle_book3s.S @@ -144,7 +144,9 @@ power9_restore_additional_sprs: mtspr SPRN_MMCR1, r4
ld r3, STOP_MMCR2(r13) + ld r4, PACA_SPRG_VDSO(r13) mtspr SPRN_MMCR2, r3 + mtspr SPRN_SPRG3, r4 blr
/*
From: "Gautham R. Shenoy" ego@linux.vnet.ibm.com
[ Upstream commit b03897cf318dfc47de33a7ecbc7655584266f034 ]
On 64-bit servers, SPRN_SPRG3 and its userspace read-only mirror SPRN_USPRG3 are used as userspace VDSO write and read registers respectively.
SPRN_SPRG3 is lost when we enter stop4 and above, and is currently not restored. As a result, any read from SPRN_USPRG3 returns zero on an exit from stop4 and above.
Thus in this situation, on POWER9, any call from sched_getcpu() always returns zero, as on powerpc, we call __kernel_getcpu() which relies upon SPRN_USPRG3 to report the CPU and NUMA node information.
Fix this by restoring SPRN_SPRG3 on wake up from a deep stop state with the sprg_vdso value that is cached in PACA.
Fixes: e1c1cfed5432 ("powerpc/powernv: Save/Restore additional SPRs for stop4 cpuidle")
Reported-by: Florian Weimer fweimer@redhat.com Cc: stable@vger.kernel.org # 4.14 Signed-off-by: Gautham R. Shenoy ego@linux.vnet.ibm.com Reviewed-by: Michael Ellerman mpe@ellerman.id.au Signed-off-by: Michael Ellerman mpe@ellerman.id.au --- arch/powerpc/kernel/idle_book3s.S | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S index 1125c9b..8959057 100644 --- a/arch/powerpc/kernel/idle_book3s.S +++ b/arch/powerpc/kernel/idle_book3s.S @@ -140,6 +140,8 @@ power9_restore_additional_sprs: ld r4, STOP_MMCR2(r13) mtspr SPRN_MMCR1, r3 mtspr SPRN_MMCR2, r4 + ld r4, PACA_SPRG_VDSO(r13) + mtspr SPRN_SPRG3, r4 blr
/*
On Mon, Jul 23, 2018 at 11:00:55AM +0530, Gautham R. Shenoy wrote:
From: "Gautham R. Shenoy" ego@linux.vnet.ibm.com
[ Upstream commit b03897cf318dfc47de33a7ecbc7655584266f034 ]
On 64-bit servers, SPRN_SPRG3 and its userspace read-only mirror SPRN_USPRG3 are used as userspace VDSO write and read registers respectively.
SPRN_SPRG3 is lost when we enter stop4 and above, and is currently not restored. As a result, any read from SPRN_USPRG3 returns zero on an exit from stop4 and above.
Thus in this situation, on POWER9, any call from sched_getcpu() always returns zero, as on powerpc, we call __kernel_getcpu() which relies upon SPRN_USPRG3 to report the CPU and NUMA node information.
Fix this by restoring SPRN_SPRG3 on wake up from a deep stop state with the sprg_vdso value that is cached in PACA.
Fixes: e1c1cfed5432 ("powerpc/powernv: Save/Restore additional SPRs for stop4 cpuidle")
Reported-by: Florian Weimer fweimer@redhat.com Cc: stable@vger.kernel.org # 4.14 Signed-off-by: Gautham R. Shenoy ego@linux.vnet.ibm.com Reviewed-by: Michael Ellerman mpe@ellerman.id.au Signed-off-by: Michael Ellerman mpe@ellerman.id.au
arch/powerpc/kernel/idle_book3s.S | 2 ++ 1 file changed, 2 insertions(+)
What stable tree(s) do you want this applied to?
thanks,
greg k-h
On Mon, Jul 23, 2018 at 08:16:28AM +0200, Greg KH wrote:
On Mon, Jul 23, 2018 at 11:00:55AM +0530, Gautham R. Shenoy wrote:
From: "Gautham R. Shenoy" ego@linux.vnet.ibm.com
[ Upstream commit b03897cf318dfc47de33a7ecbc7655584266f034 ]
On 64-bit servers, SPRN_SPRG3 and its userspace read-only mirror SPRN_USPRG3 are used as userspace VDSO write and read registers respectively.
SPRN_SPRG3 is lost when we enter stop4 and above, and is currently not restored. As a result, any read from SPRN_USPRG3 returns zero on an exit from stop4 and above.
Thus in this situation, on POWER9, any call from sched_getcpu() always returns zero, as on powerpc, we call __kernel_getcpu() which relies upon SPRN_USPRG3 to report the CPU and NUMA node information.
Fix this by restoring SPRN_SPRG3 on wake up from a deep stop state with the sprg_vdso value that is cached in PACA.
Fixes: e1c1cfed5432 ("powerpc/powernv: Save/Restore additional SPRs for stop4 cpuidle")
Reported-by: Florian Weimer fweimer@redhat.com Cc: stable@vger.kernel.org # 4.14 Signed-off-by: Gautham R. Shenoy ego@linux.vnet.ibm.com Reviewed-by: Michael Ellerman mpe@ellerman.id.au Signed-off-by: Michael Ellerman mpe@ellerman.id.au
arch/powerpc/kernel/idle_book3s.S | 2 ++ 1 file changed, 2 insertions(+)
What stable tree(s) do you want this applied to?
I've now guessed that it is 4.14.y. If that's not the case, please let me know.
greg k-h
Hello Greg,
On Mon, Jul 23, 2018 at 09:53:50AM +0200, Greg KH wrote:
On Mon, Jul 23, 2018 at 08:16:28AM +0200, Greg KH wrote:
On Mon, Jul 23, 2018 at 11:00:55AM +0530, Gautham R. Shenoy wrote:
From: "Gautham R. Shenoy" ego@linux.vnet.ibm.com
[ Upstream commit b03897cf318dfc47de33a7ecbc7655584266f034 ]
On 64-bit servers, SPRN_SPRG3 and its userspace read-only mirror SPRN_USPRG3 are used as userspace VDSO write and read registers respectively.
SPRN_SPRG3 is lost when we enter stop4 and above, and is currently not restored. As a result, any read from SPRN_USPRG3 returns zero on an exit from stop4 and above.
Thus in this situation, on POWER9, any call from sched_getcpu() always returns zero, as on powerpc, we call __kernel_getcpu() which relies upon SPRN_USPRG3 to report the CPU and NUMA node information.
Fix this by restoring SPRN_SPRG3 on wake up from a deep stop state with the sprg_vdso value that is cached in PACA.
Fixes: e1c1cfed5432 ("powerpc/powernv: Save/Restore additional SPRs for stop4 cpuidle")
Reported-by: Florian Weimer fweimer@redhat.com Cc: stable@vger.kernel.org # 4.14 Signed-off-by: Gautham R. Shenoy ego@linux.vnet.ibm.com Reviewed-by: Michael Ellerman mpe@ellerman.id.au Signed-off-by: Michael Ellerman mpe@ellerman.id.au
arch/powerpc/kernel/idle_book3s.S | 2 ++ 1 file changed, 2 insertions(+)
What stable tree(s) do you want this applied to?
I've now guessed that it is 4.14.y. If that's not the case, please let me know.
Yes, this backport is for 4.14.y. The upstream commit cleanly applies on 4.15.18 and 4.16.18.
greg k-h
-- Thanks and Regards gautham.
linux-stable-mirror@lists.linaro.org