[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v11 25/34] ARM: vITS: handle MAPD command
On Fri, 9 Jun 2017, Andre Przywara wrote: > @@ -375,6 +390,131 @@ out_unlock: > return ret; > } > > +/* Must be called with the ITS lock held. */ > +static int its_discard_event(struct virt_its *its, > + uint32_t vdevid, uint32_t vevid) > +{ > + struct pending_irq *p; > + unsigned long flags; > + struct vcpu *vcpu; > + uint32_t vlpi; > + > + ASSERT(spin_is_locked(&its->its_lock)); > + > + if ( !read_itte(its, vdevid, vevid, &vcpu, &vlpi) ) > + return -ENOENT; > + > + if ( vlpi == INVALID_LPI ) > + return -ENOENT; > + > + /* > + * TODO: This relies on the VCPU being correct in the ITS tables. > + * This can be fixed by either using a per-IRQ lock or by using > + * the VCPU ID from the pending_irq instead. > + */ > + spin_lock_irqsave(&vcpu->arch.vgic.lock, flags); > + > + /* Remove the pending_irq from the tree. */ > + write_lock(&its->d->arch.vgic.pend_lpi_tree_lock); > + p = radix_tree_delete(&its->d->arch.vgic.pend_lpi_tree, vlpi); > + write_unlock(&its->d->arch.vgic.pend_lpi_tree_lock); > + > + if ( !p ) > + { > + spin_unlock_irqrestore(&vcpu->arch.vgic.lock, flags); > + > + return -ENOENT; > + } > + > + /* Cleanup the pending_irq and disconnect it from the LPI. */ > + list_del_init(&p->inflight); > + list_del_init(&p->lr_queue); > + vgic_init_pending_irq(p, INVALID_LPI); Why not call gic_remove_irq? _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |