OSDN Git Service

KVM: arm/arm64: vgic: Do not cond_resched_lock() with IRQs disabled
authorJulien Thierry <julien.thierry@arm.com>
Mon, 26 Nov 2018 18:26:44 +0000 (18:26 +0000)
committerMarc Zyngier <marc.zyngier@arm.com>
Tue, 18 Dec 2018 15:14:49 +0000 (15:14 +0000)
To change the active state of an MMIO, halt is requested for all vcpus of
the affected guest before modifying the IRQ state. This is done by calling
cond_resched_lock() in vgic_mmio_change_active(). However interrupts are
disabled at this point and we cannot reschedule a vcpu.

We actually don't need any of this, as kvm_arm_halt_guest ensures that
all the other vcpus are out of the guest. Let's just drop that useless
code.

Signed-off-by: Julien Thierry <julien.thierry@arm.com>
Suggested-by: Christoffer Dall <christoffer.dall@arm.com>
Cc: stable@vger.kernel.org
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
virt/kvm/arm/vgic/vgic-mmio.c

index 2b450d4..7c22319 100644 (file)
@@ -313,27 +313,6 @@ static void vgic_mmio_change_active(struct kvm_vcpu *vcpu, struct vgic_irq *irq,
 
        spin_lock_irqsave(&irq->irq_lock, flags);
 
-       /*
-        * If this virtual IRQ was written into a list register, we
-        * have to make sure the CPU that runs the VCPU thread has
-        * synced back the LR state to the struct vgic_irq.
-        *
-        * As long as the conditions below are true, we know the VCPU thread
-        * may be on its way back from the guest (we kicked the VCPU thread in
-        * vgic_change_active_prepare)  and still has to sync back this IRQ,
-        * so we release and re-acquire the spin_lock to let the other thread
-        * sync back the IRQ.
-        *
-        * When accessing VGIC state from user space, requester_vcpu is
-        * NULL, which is fine, because we guarantee that no VCPUs are running
-        * when accessing VGIC state from user space so irq->vcpu->cpu is
-        * always -1.
-        */
-       while (irq->vcpu && /* IRQ may have state in an LR somewhere */
-              irq->vcpu != requester_vcpu && /* Current thread is not the VCPU thread */
-              irq->vcpu->cpu != -1) /* VCPU thread is running */
-               cond_resched_lock(&irq->irq_lock);
-
        if (irq->hw) {
                vgic_hw_irq_change_active(vcpu, irq, active, !requester_vcpu);
        } else {