Add patch to fix SMT guests on POWER7 (rhbz 1227877)
This commit is contained in:
parent
436b9d9276
commit
045cecf6bb
|
@ -701,6 +701,9 @@ Patch26220: 0001-mwifiex-use-del_timer-variant-in-interrupt-context.patch
|
|||
#rhbz 1226743
|
||||
Patch26221: drm-i915-turn-off-wc-mmaps.patch
|
||||
|
||||
#rhbz 1227877
|
||||
Patch26222: powerpc-powernv-Restore-non-volatile-CRs-after-nap.patch
|
||||
|
||||
# END OF PATCH DEFINITIONS
|
||||
|
||||
%endif
|
||||
|
@ -1517,6 +1520,9 @@ ApplyPatch 0001-mwifiex-use-del_timer-variant-in-interrupt-context.patch
|
|||
#rhbz 1226743
|
||||
ApplyPatch drm-i915-turn-off-wc-mmaps.patch
|
||||
|
||||
#rhbz 1227877
|
||||
ApplyPatch powerpc-powernv-Restore-non-volatile-CRs-after-nap.patch
|
||||
|
||||
# END OF PATCH APPLICATIONS
|
||||
|
||||
%endif
|
||||
|
@ -2368,6 +2374,7 @@ fi
|
|||
#
|
||||
%changelog
|
||||
* Thu Jun 04 2015 Josh Boyer <jwboyer@fedoraproject.org>
|
||||
- Add patch to fix SMT guests on POWER7 (rhbz 1227877)
|
||||
- Add patch to turn of WC mmaps on i915 from airlied (rhbz 1226743)
|
||||
|
||||
* Wed Jun 03 2015 Laura Abbott <labbott@fedoraproject.org>
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
From: Sam Bobroff <sam.bobroff@au1.ibm.com>
|
||||
Date: Fri, 1 May 2015 16:50:34 +1000
|
||||
Subject: [PATCH] powerpc/powernv: Restore non-volatile CRs after nap
|
||||
|
||||
Patches 7cba160ad "powernv/cpuidle: Redesign idle states management"
|
||||
and 77b54e9f2 "powernv/powerpc: Add winkle support for offline cpus"
|
||||
use non-volatile condition registers (cr2, cr3 and cr4) early in the system
|
||||
reset interrupt handler (system_reset_pSeries()) before it has been determined
|
||||
if state loss has occurred. If state loss has not occurred, control returns via
|
||||
the power7_wakeup_noloss() path which does not restore those condition
|
||||
registers, leaving them corrupted.
|
||||
|
||||
Fix this by restoring the condition registers in the power7_wakeup_noloss()
|
||||
case.
|
||||
|
||||
This is apparent when running a KVM guest on hardware that does not
|
||||
support winkle or sleep and the guest makes use of secondary threads. In
|
||||
practice this means Power7 machines, though some early unreleased Power8
|
||||
machines may also be susceptible.
|
||||
|
||||
The secondary CPUs are taken off line before the guest is started and
|
||||
they call pnv_smp_cpu_kill_self(). This checks support for sleep
|
||||
states (in this case there is no support) and power7_nap() is called.
|
||||
|
||||
When the CPU is woken, power7_nap() returns and because the CPU is
|
||||
still off line, the main while loop executes again. The sleep states
|
||||
support test is executed again, but because the tested values cannot
|
||||
have changed, the compiler has optimized the test away and instead we
|
||||
rely on the result of the first test, which has been left in cr3
|
||||
and/or cr4. With the result overwritten, the wrong branch is taken and
|
||||
power7_winkle() is called on a CPU that does not support it, leading
|
||||
to it stalling.
|
||||
|
||||
Fixes: 7cba160ad789 ("powernv/cpuidle: Redesign idle states management")
|
||||
Fixes: 77b54e9f213f ("powernv/powerpc: Add winkle support for offline cpus")
|
||||
[mpe: Massage change log a bit more]
|
||||
Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
|
||||
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
|
||||
---
|
||||
arch/powerpc/kernel/idle_power7.S | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/arch/powerpc/kernel/idle_power7.S b/arch/powerpc/kernel/idle_power7.S
|
||||
index 05adc8bbdef8..401d8d0085aa 100644
|
||||
--- a/arch/powerpc/kernel/idle_power7.S
|
||||
+++ b/arch/powerpc/kernel/idle_power7.S
|
||||
@@ -500,9 +500,11 @@ BEGIN_FTR_SECTION
|
||||
CHECK_HMI_INTERRUPT
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
||||
ld r1,PACAR1(r13)
|
||||
+ ld r6,_CCR(r1)
|
||||
ld r4,_MSR(r1)
|
||||
ld r5,_NIP(r1)
|
||||
addi r1,r1,INT_FRAME_SIZE
|
||||
+ mtcr r6
|
||||
mtspr SPRN_SRR1,r4
|
||||
mtspr SPRN_SRR0,r5
|
||||
rfid
|
Loading…
Reference in New Issue