KVM: arm/arm64: vgic-new: Synchronize changes to active state
authorChristoffer Dall <christoffer.dall@linaro.org>
Fri, 20 May 2016 13:25:28 +0000 (15:25 +0200)
committerChristoffer Dall <christoffer.dall@linaro.org>
Fri, 20 May 2016 14:26:38 +0000 (16:26 +0200)
commit35a2d58588f0992627e74b447ccab21570544c86
tree823643adbca0b1aece727a932ea0cbe4c5809321
parentefffe55af5e16f7935aa0175cf25c386f08219f5
KVM: arm/arm64: vgic-new: Synchronize changes to active state

When modifying the active state of an interrupt via the MMIO interface,
we should ensure that the write has the intended effect.

If a guest sets an interrupt to active, but that interrupt is already
flushed into a list register on a running VCPU, then that VCPU will
write the active state back into the struct vgic_irq upon returning from
the guest and syncing its state.  This is a non-benign race, because the
guest can observe that an interrupt is not active, and it can have a
reasonable expectations that other VCPUs will not ack any IRQs, and then
set the state to active, and expect it to stay that way.  Currently we
are not honoring this case.

Thefore, change both the SACTIVE and CACTIVE mmio handlers to stop the
world, change the irq state, potentially queue the irq if we're setting
it to active, and then continue.

We take this chance to slightly optimize these functions by not stopping
the world when touching private interrupts where there is inherently no
possible race.

Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
arch/arm/include/asm/kvm_host.h
arch/arm/kvm/arm.c
arch/arm64/include/asm/kvm_host.h
virt/kvm/arm/vgic/vgic-mmio.c