Commit b87943f
KVM: PPC: Book3S HV: Fix trap number return from __kvmppc_vcore_entry
commit a8b48a4 upstream.
This fixes a bug where the trap number that is returned by
__kvmppc_vcore_entry gets corrupted. The effect of the corruption
is that IPIs get ignored on POWER9 systems when the IPI is sent via
a doorbell interrupt to a CPU which is executing in a KVM guest.
The effect of the IPI being ignored is often that another CPU locks
up inside smp_call_function_many() (and if that CPU is holding a
spinlock, other CPUs then lock up inside raw_spin_lock()).
The trap number is currently held in register r12 for most of the
assembly-language part of the guest exit path. In that path, we
call kvmppc_subcore_exit_guest(), which is a C function, without
restoring r12 afterwards. Depending on the kernel config and the
compiler, it may modify r12 or it may not, so some config/compiler
combinations see the bug and others don't.
To fix this, we arrange for the trap number to be stored on the
stack from the 'guest_bypass:' label until the end of the function,
then the trap number is loaded and returned in r12 as before.
Cc: stable@vger.kernel.org # v4.8+
Fixes: fd7bacb ("KVM: PPC: Book3S HV: Fix TB corruption in guest exit path on HMI interrupt")
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>1 parent 57d6410 commit b87943f
1 file changed
Lines changed: 5 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
299 | 299 | | |
300 | 300 | | |
301 | 301 | | |
302 | | - | |
303 | 302 | | |
304 | 303 | | |
305 | 304 | | |
| |||
1023 | 1022 | | |
1024 | 1023 | | |
1025 | 1024 | | |
| 1025 | + | |
1026 | 1026 | | |
1027 | 1027 | | |
1028 | 1028 | | |
| |||
1266 | 1266 | | |
1267 | 1267 | | |
1268 | 1268 | | |
| 1269 | + | |
1269 | 1270 | | |
1270 | 1271 | | |
1271 | 1272 | | |
1272 | 1273 | | |
1273 | 1274 | | |
1274 | | - | |
1275 | 1275 | | |
1276 | 1276 | | |
1277 | 1277 | | |
| |||
1549 | 1549 | | |
1550 | 1550 | | |
1551 | 1551 | | |
| 1552 | + | |
1552 | 1553 | | |
1553 | 1554 | | |
1554 | 1555 | | |
| |||
1599 | 1600 | | |
1600 | 1601 | | |
1601 | 1602 | | |
| 1603 | + | |
1602 | 1604 | | |
1603 | 1605 | | |
1604 | 1606 | | |
1605 | 1607 | | |
1606 | | - | |
1607 | 1608 | | |
1608 | 1609 | | |
1609 | 1610 | | |
| |||
1678 | 1679 | | |
1679 | 1680 | | |
1680 | 1681 | | |
| 1682 | + | |
1681 | 1683 | | |
1682 | 1684 | | |
1683 | 1685 | | |
| |||
0 commit comments