kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] KVM/arm64 fixes for 5.8, take #3
@ 2020-07-06 11:05 Marc Zyngier
  2020-07-06 11:05 ` [PATCH 1/2] KVM: arm64: PMU: Fix per-CPU access in preemptible context Marc Zyngier
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Marc Zyngier @ 2020-07-06 11:05 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: Andrew Scull, Andrew Murray, James Morse, Julien Thierry,
	Suzuki K Poulose, kvm, kvmarm, linux-arm-kernel

Hi Paolo,

Yet another small batch of fixes for 5.8. One is a long standing
preemption issue that got uncovered by another fix that went in
5.8. The other one is a fix for an issue potentially affecting kexec.

Please pull,

	M.

The following changes since commit a3f574cd65487cd993f79ab235d70229d9302c1e:

  KVM: arm64: vgic-v4: Plug race between non-residency and v4.1 doorbell (2020-06-23 11:24:39 +0100)

are available in the Git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git tags/kvmarm-fixes-5.8-3

for you to fetch changes up to b9e10d4a6c9f5cbe6369ce2c17ebc67d2e5a4be5:

  KVM: arm64: Stop clobbering x0 for HVC_SOFT_RESTART (2020-07-06 11:47:02 +0100)

----------------------------------------------------------------
KVM/arm fixes for 5.8, take #3

- Disable preemption on context-switching PMU EL0 state happening
  on system register trap
- Don't clobber X0 when tearing down KVM via a soft reset (kexec)

----------------------------------------------------------------
Andrew Scull (1):
      KVM: arm64: Stop clobbering x0 for HVC_SOFT_RESTART

Marc Zyngier (1):
      KVM: arm64: PMU: Fix per-CPU access in preemptible context

 arch/arm64/kvm/hyp-init.S | 11 +++++++----
 arch/arm64/kvm/pmu.c      |  7 ++++++-
 2 files changed, 13 insertions(+), 5 deletions(-)

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] KVM: arm64: PMU: Fix per-CPU access in preemptible context
  2020-07-06 11:05 [PATCH 0/2] KVM/arm64 fixes for 5.8, take #3 Marc Zyngier
@ 2020-07-06 11:05 ` Marc Zyngier
  2020-07-06 11:05 ` [PATCH 2/2] KVM: arm64: Stop clobbering x0 for HVC_SOFT_RESTART Marc Zyngier
  2020-07-06 17:05 ` [PATCH 0/2] KVM/arm64 fixes for 5.8, take #3 Paolo Bonzini
  2 siblings, 0 replies; 4+ messages in thread
From: Marc Zyngier @ 2020-07-06 11:05 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: Andrew Scull, Andrew Murray, James Morse, Julien Thierry,
	Suzuki K Poulose, kvm, kvmarm, linux-arm-kernel

Commit 07da1ffaa137 ("KVM: arm64: Remove host_cpu_context
member from vcpu structure") has, by removing the host CPU
context pointer, exposed that kvm_vcpu_pmu_restore_guest
is called in preemptible contexts:

[  266.932442] BUG: using smp_processor_id() in preemptible [00000000] code: qemu-system-aar/779
[  266.939721] caller is debug_smp_processor_id+0x20/0x30
[  266.944157] CPU: 2 PID: 779 Comm: qemu-system-aar Tainted: G            E     5.8.0-rc3-00015-g8d4aa58b2fe3 #1374
[  266.954268] Hardware name: amlogic w400/w400, BIOS 2020.04 05/22/2020
[  266.960640] Call trace:
[  266.963064]  dump_backtrace+0x0/0x1e0
[  266.966679]  show_stack+0x20/0x30
[  266.969959]  dump_stack+0xe4/0x154
[  266.973338]  check_preemption_disabled+0xf8/0x108
[  266.977978]  debug_smp_processor_id+0x20/0x30
[  266.982307]  kvm_vcpu_pmu_restore_guest+0x2c/0x68
[  266.986949]  access_pmcr+0xf8/0x128
[  266.990399]  perform_access+0x8c/0x250
[  266.994108]  kvm_handle_sys_reg+0x10c/0x2f8
[  266.998247]  handle_exit+0x78/0x200
[  267.001697]  kvm_arch_vcpu_ioctl_run+0x2ac/0xab8

Note that the bug was always there, it is only the switch to
using percpu accessors that made it obvious.
The fix is to wrap these accesses in a preempt-disabled section,
so that we sample a coherent context on trap from the guest.

Fixes: 435e53fb5e21 ("arm64: KVM: Enable VHE support for :G/:H perf event modifiers")
Cc:: Andrew Murray <amurray@thegoodpenguin.co.uk>
Signed-off-by: Marc Zyngier <maz@kernel.org>
---
 arch/arm64/kvm/pmu.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/kvm/pmu.c b/arch/arm64/kvm/pmu.c
index b5ae3a5d509e..3c224162b3dd 100644
--- a/arch/arm64/kvm/pmu.c
+++ b/arch/arm64/kvm/pmu.c
@@ -159,7 +159,10 @@ static void kvm_vcpu_pmu_disable_el0(unsigned long events)
 }
 
 /*
- * On VHE ensure that only guest events have EL0 counting enabled
+ * On VHE ensure that only guest events have EL0 counting enabled.
+ * This is called from both vcpu_{load,put} and the sysreg handling.
+ * Since the latter is preemptible, special care must be taken to
+ * disable preemption.
  */
 void kvm_vcpu_pmu_restore_guest(struct kvm_vcpu *vcpu)
 {
@@ -169,12 +172,14 @@ void kvm_vcpu_pmu_restore_guest(struct kvm_vcpu *vcpu)
 	if (!has_vhe())
 		return;
 
+	preempt_disable();
 	host = this_cpu_ptr(&kvm_host_data);
 	events_guest = host->pmu_events.events_guest;
 	events_host = host->pmu_events.events_host;
 
 	kvm_vcpu_pmu_enable_el0(events_guest);
 	kvm_vcpu_pmu_disable_el0(events_host);
+	preempt_enable();
 }
 
 /*
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] KVM: arm64: Stop clobbering x0 for HVC_SOFT_RESTART
  2020-07-06 11:05 [PATCH 0/2] KVM/arm64 fixes for 5.8, take #3 Marc Zyngier
  2020-07-06 11:05 ` [PATCH 1/2] KVM: arm64: PMU: Fix per-CPU access in preemptible context Marc Zyngier
@ 2020-07-06 11:05 ` Marc Zyngier
  2020-07-06 17:05 ` [PATCH 0/2] KVM/arm64 fixes for 5.8, take #3 Paolo Bonzini
  2 siblings, 0 replies; 4+ messages in thread
From: Marc Zyngier @ 2020-07-06 11:05 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: Andrew Scull, Andrew Murray, James Morse, Julien Thierry,
	Suzuki K Poulose, kvm, kvmarm, linux-arm-kernel, stable

From: Andrew Scull <ascull@google.com>

HVC_SOFT_RESTART is given values for x0-2 that it should installed
before exiting to the new address so should not set x0 to stub HVC
success or failure code.

Fixes: af42f20480bf1 ("arm64: hyp-stub: Zero x0 on successful stub handling")
Cc: stable@vger.kernel.org
Signed-off-by: Andrew Scull <ascull@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200706095259.1338221-1-ascull@google.com
---
 arch/arm64/kvm/hyp-init.S | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/arch/arm64/kvm/hyp-init.S b/arch/arm64/kvm/hyp-init.S
index 6e6ed5581eed..e76c0e89d48e 100644
--- a/arch/arm64/kvm/hyp-init.S
+++ b/arch/arm64/kvm/hyp-init.S
@@ -136,11 +136,15 @@ SYM_CODE_START(__kvm_handle_stub_hvc)
 
 1:	cmp	x0, #HVC_RESET_VECTORS
 	b.ne	1f
-reset:
+
 	/*
-	 * Reset kvm back to the hyp stub. Do not clobber x0-x4 in
-	 * case we coming via HVC_SOFT_RESTART.
+	 * Set the HVC_RESET_VECTORS return code before entering the common
+	 * path so that we do not clobber x0-x2 in case we are coming via
+	 * HVC_SOFT_RESTART.
 	 */
+	mov	x0, xzr
+reset:
+	/* Reset kvm back to the hyp stub. */
 	mrs	x5, sctlr_el2
 	mov_q	x6, SCTLR_ELx_FLAGS
 	bic	x5, x5, x6		// Clear SCTL_M and etc
@@ -151,7 +155,6 @@ reset:
 	/* Install stub vectors */
 	adr_l	x5, __hyp_stub_vectors
 	msr	vbar_el2, x5
-	mov	x0, xzr
 	eret
 
 1:	/* Bad stub call */
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 0/2] KVM/arm64 fixes for 5.8, take #3
  2020-07-06 11:05 [PATCH 0/2] KVM/arm64 fixes for 5.8, take #3 Marc Zyngier
  2020-07-06 11:05 ` [PATCH 1/2] KVM: arm64: PMU: Fix per-CPU access in preemptible context Marc Zyngier
  2020-07-06 11:05 ` [PATCH 2/2] KVM: arm64: Stop clobbering x0 for HVC_SOFT_RESTART Marc Zyngier
@ 2020-07-06 17:05 ` Paolo Bonzini
  2 siblings, 0 replies; 4+ messages in thread
From: Paolo Bonzini @ 2020-07-06 17:05 UTC (permalink / raw)
  To: Marc Zyngier
  Cc: Andrew Scull, Andrew Murray, James Morse, Julien Thierry,
	Suzuki K Poulose, kvm, kvmarm, linux-arm-kernel

On 06/07/20 13:05, Marc Zyngier wrote:
> git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git tags/kvmarm-fixes-5.8-3

Pulled, thanks.

Paolo


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-07-06 17:05 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-06 11:05 [PATCH 0/2] KVM/arm64 fixes for 5.8, take #3 Marc Zyngier
2020-07-06 11:05 ` [PATCH 1/2] KVM: arm64: PMU: Fix per-CPU access in preemptible context Marc Zyngier
2020-07-06 11:05 ` [PATCH 2/2] KVM: arm64: Stop clobbering x0 for HVC_SOFT_RESTART Marc Zyngier
2020-07-06 17:05 ` [PATCH 0/2] KVM/arm64 fixes for 5.8, take #3 Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).