summaryrefslogtreecommitdiff
path: root/arch/mips/include/asm/idle.h
diff options
context:
space:
mode:
authorJames Hogan <james.hogan@imgtec.com>2016-04-22 10:38:46 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-06-01 12:15:52 -0700
commita6fa60f5614352eb53fc57b23f1984fed4e71eac (patch)
treeec085d7566ab2c379797f8ca636228a4a9623482 /arch/mips/include/asm/idle.h
parent9e01c02f98f98c03cba7e147577364b667d03808 (diff)
MIPS: KVM: Fix timer IRQ race when writing CP0_Compare
commit b45bacd2d048f405c7760e5cc9b60dd67708734f 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: e30492bbe95a ("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>
Diffstat (limited to 'arch/mips/include/asm/idle.h')
0 files changed, 0 insertions, 0 deletions