|
[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 |