[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 2/6] xen/arm: track the state of guest IRQs
On Wed, 2013-12-11 at 19:07 +0000, Stefano Stabellini wrote: > @@ -916,6 +910,36 @@ static void maintenance_interrupt(int irq, void *dev_id, > struct cpu_user_regs *r > cpu = p->desc->arch.eoi_cpu; > pirq = p->desc->irq; > } > + if ( test_bit(GIC_IRQ_GUEST_PENDING, &p->status) && > + test_bit(GIC_IRQ_GUEST_ENABLED, &p->status)) > + { > + BUG_ON(!list_empty(&p->lr_queue)); > + > + list_for_each_entry ( iter, &v->arch.vgic.lr_pending, lr_queue ) > + { > + if ( iter->priority > p->priority ) > + { > + list_add_tail(&p->lr_queue, &iter->lr_queue); > + goto out; > + } > + } > + list_add_tail(&p->lr_queue, &v->arch.vgic.lr_pending); > +out: Is there really no helper function for all that? It looks very similar to the tail of gic_set_guest_irq. > + set_int = 1; > + } > + > + clear_bit(GIC_IRQ_GUEST_VISIBLE, &p->status); > + > + if ( !list_empty(&v->arch.vgic.lr_pending) ) { > + p2 = list_entry(v->arch.vgic.lr_pending.next, typeof(*p2), > lr_queue); > + gic_set_lr(i, p2->irq, GICH_LR_PENDING, p2->priority); > + list_del_init(&p2->lr_queue); > + set_bit(i, &this_cpu(lr_mask)); > + set_int = 1; > + } > + spin_unlock_irq(&gic.lock); > + > + spin_lock_irq(&v->arch.vgic.lock); > list_del_init(&p->inflight); > spin_unlock_irq(&v->arch.vgic.lock); > > @@ -931,6 +955,12 @@ static void maintenance_interrupt(int irq, void *dev_id, > struct cpu_user_regs *r > > i++; > } > + if ( !set_int ) > + { > + spin_lock_irq(&gic.lock); Dropping the lock and then retaking it here is a bit of a suspicious pattern -- what if something changes in the interim? Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |