[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH v2 11/22] ARM: vGIC: protect gic_events_need_delivery() with pending_irq lock
gic_events_need_delivery() reads the cur_priority field twice, also relies on the consistency of status bits. So it should take pending_irq lock. Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx> --- xen/arch/arm/gic.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index df89530..9637682 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -666,7 +666,7 @@ int gic_events_need_delivery(void) { struct vcpu *v = current; struct pending_irq *p; - unsigned long flags; + unsigned long flags, vcpu_flags; const unsigned long apr = gic_hw_ops->read_apr(0); int mask_priority; int active_priority; @@ -675,7 +675,7 @@ int gic_events_need_delivery(void) mask_priority = gic_hw_ops->read_vmcr_priority(); active_priority = find_next_bit(&apr, 32, 0); - spin_lock_irqsave(&v->arch.vgic.lock, flags); + spin_lock_irqsave(&v->arch.vgic.lock, vcpu_flags); /* TODO: We order the guest irqs by priority, but we don't change * the priority of host irqs. */ @@ -684,19 +684,21 @@ int gic_events_need_delivery(void) * ordered by priority */ list_for_each_entry( p, &v->arch.vgic.inflight_irqs, inflight ) { - if ( GIC_PRI_TO_GUEST(p->cur_priority) >= mask_priority ) - goto out; - if ( GIC_PRI_TO_GUEST(p->cur_priority) >= active_priority ) - goto out; - if ( test_bit(GIC_IRQ_GUEST_ENABLED, &p->status) ) + vgic_irq_lock(p, flags); + if ( GIC_PRI_TO_GUEST(p->cur_priority) < mask_priority && + GIC_PRI_TO_GUEST(p->cur_priority) < active_priority && + !test_bit(GIC_IRQ_GUEST_ENABLED, &p->status) ) { - rc = 1; - goto out; + vgic_irq_unlock(p, flags); + continue; } + + rc = test_bit(GIC_IRQ_GUEST_ENABLED, &p->status); + vgic_irq_unlock(p, flags); + break; } -out: - spin_unlock_irqrestore(&v->arch.vgic.lock, flags); + spin_unlock_irqrestore(&v->arch.vgic.lock, vcpu_flags); return rc; } -- 2.9.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |