@@ -64,6 +64,7 @@ static void vgic_init_pending_irq(struct pending_irq *p, unsigned int virq)
{
INIT_LIST_HEAD(&p->inflight);
INIT_LIST_HEAD(&p->lr_queue);
+ spin_lock_init(&p->lock);
p->irq = virq;
}
@@ -81,6 +81,14 @@ struct pending_irq
* TODO: when implementing irq migration, taking only the current
* vgic lock is not going to be enough. */
struct list_head lr_queue;
+ /* The lock protects the consistency of this structure. A single status bit
+ * can be read and/or set without holding the lock using the atomic
+ * set_bit/clear_bit/test_bit functions, however accessing multiple bits or
+ * relating to other members in this struct requires the lock.
+ * The list_head members are protected by their corresponding VCPU lock,
+ * it is not sufficient to hold this pending_irq lock here to query or
+ * change list order or affiliation. */
+ spinlock_t lock;
};
#define NR_INTERRUPT_PER_RANK 32
Currently we protect the pending_irq structure with the corresponding VGIC VCPU lock. For future extensions this leads to problems (for instance if an IRQ is migrating), so let's introduce a per-IRQ lock, which protects the consistency of this structure independent from any VCPU. This patch just introduces and intializes the lock, it is not used anywhere right now. Signed-off-by: Andre Przywara <andre.przywara@arm.com> --- xen/arch/arm/vgic.c | 1 + xen/include/asm-arm/vgic.h | 8 ++++++++ 2 files changed, 9 insertions(+)