linux/arch/mips/kvm
James Hogan a6fa60f561 MIPS: KVM: Fix timer IRQ race when writing CP0_Compare
commit b45bacd2d0 upstream.

Writing CP0_Compare clears the timer interrupt pending bit
(CP0_Cause.TI), but this wasn't being done atomically. If a timer
interrupt raced with the write of the guest CP0_Compare, the timer
interrupt could end up being pending even though the new CP0_Compare is
nowhere near CP0_Count.

We were already updating the hrtimer expiry with
kvm_mips_update_hrtimer(), which used both kvm_mips_freeze_hrtimer() and
kvm_mips_resume_hrtimer(). Close the race window by expanding out
kvm_mips_update_hrtimer(), and clearing CP0_Cause.TI and setting
CP0_Compare between the freeze and resume. Since the pending timer
interrupt should not be cleared when CP0_Compare is written via the KVM
user API, an ack argument is added to distinguish the source of the
write.

Fixes: e30492bbe9 ("MIPS: KVM: Rewrite count/compare timer emulation")
Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2016-06-01 12:15:52 -07:00
..
00README.txt KVM/MIPS32: Release notes and KVM module Makefile 2013-05-08 03:55:35 +02:00
callback.c MIPS: KVM: Rename files to remove the prefix "kvm_" and "kvm_mips_" 2014-06-30 16:52:03 +02:00
commpage.c MIPS: KVM: Skip memory cleaning in kvm_mips_commpage_init() 2014-06-30 16:52:03 +02:00
commpage.h MIPS: KVM: Rename files to remove the prefix "kvm_" and "kvm_mips_" 2014-06-30 16:52:03 +02:00
dyntrans.c MIPS: KVM: Rename files to remove the prefix "kvm_" and "kvm_mips_" 2014-06-30 16:52:03 +02:00
emulate.c MIPS: KVM: Fix timer IRQ race when writing CP0_Compare 2016-06-01 12:15:52 -07:00
fpu.S MIPS: KVM: Add base guest FPU support 2015-03-27 21:25:14 +00:00
interrupt.c MIPS: KVM: Rename files to remove the prefix "kvm_" and "kvm_mips_" 2014-06-30 16:52:03 +02:00
interrupt.h MIPS: KVM: Rename files to remove the prefix "kvm_" and "kvm_mips_" 2014-06-30 16:52:03 +02:00
Kconfig rcu: Make SRCU optional by using CONFIG_SRCU 2015-01-06 11:04:29 -08:00
locore.S MIPS: KVM: Fix ASID restoration logic 2015-11-18 12:25:35 +01:00
Makefile MIPS: KVM: Add base guest MSA support 2015-03-27 21:25:19 +00:00
mips.c mips/kvm: fix ioctl error handling 2016-03-09 15:34:50 -08:00
msa.S MIPS: KVM: Add base guest MSA support 2015-03-27 21:25:19 +00:00
opcode.h MIPS: KVM: Rename files to remove the prefix "kvm_" and "kvm_mips_" 2014-06-30 16:52:03 +02:00
stats.c MIPS: KVM: Add MSA exception handling 2015-03-27 21:25:20 +00:00
tlb.c MIPS: KVM: Add vcpu_get_regs/vcpu_set_regs callback 2015-03-27 21:25:13 +00:00
trace.h KVM: MIPS: Fix trace event to save PC directly 2015-03-02 19:17:52 -03:00
trap_emul.c MIPS: KVM: Fix timer IRQ race when writing CP0_Compare 2016-06-01 12:15:52 -07:00