KVM: arm/arm64: vgic: Add missing irq_lock to vgic_mmio_read_pending
authorAndre Przywara <andre.przywara@arm.com>
Tue, 6 Mar 2018 09:21:06 +0000 (09:21 +0000)
committerMarc Zyngier <marc.zyngier@arm.com>
Wed, 14 Mar 2018 18:28:41 +0000 (18:28 +0000)
Our irq_is_pending() helper function accesses multiple members of the
vgic_irq struct, so we need to hold the lock when calling it.
Add that requirement as a comment to the definition and take the lock
around the call in vgic_mmio_read_pending(), where we were missing it
before.

Fixes: 96b298000db4 ("KVM: arm/arm64: vgic-new: Add PENDING registers handlers")
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
virt/kvm/arm/vgic/vgic-mmio.c
virt/kvm/arm/vgic/vgic.h

index 83d82bd7dc4e714f61669e6aaf9e937b67f5eea1..dbe99d635c80435ffd938999c4246ce6f45307c7 100644 (file)
@@ -113,9 +113,12 @@ unsigned long vgic_mmio_read_pending(struct kvm_vcpu *vcpu,
        /* Loop over all IRQs affected by this read */
        for (i = 0; i < len * 8; i++) {
                struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+               unsigned long flags;
 
+               spin_lock_irqsave(&irq->irq_lock, flags);
                if (irq_is_pending(irq))
                        value |= (1U << i);
+               spin_unlock_irqrestore(&irq->irq_lock, flags);
 
                vgic_put_irq(vcpu->kvm, irq);
        }
index 12c37b89f7a38212c5eec4a115b9e2bb20d28fdc..5b11859a1a1e67ccd168526e505e8e182c977012 100644 (file)
@@ -96,6 +96,7 @@
 /* we only support 64 kB translation table page size */
 #define KVM_ITS_L1E_ADDR_MASK          GENMASK_ULL(51, 16)
 
+/* Requires the irq_lock to be held by the caller. */
 static inline bool irq_is_pending(struct vgic_irq *irq)
 {
        if (irq->config == VGIC_CONFIG_EDGE)