[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC] xen/arm: Restrict when a physical IRQ can be routed/removed from/to a domain
On Thu, 8 Mar 2018, julien.grall@xxxxxxx wrote: > From: Julien Grall <julien.grall@xxxxxxx> > > Xen is currently allowing to route/remove an interrupt from/to the > domain while it is running. > > However, we never sync the virtual interrupt state to the physical > interrupt. This could lead to undesirable effect on the vGIC emulation > and potentially the hardware. > > One solution would be to sync the interrupt state when routing, but I am > not sure it is worth the effort as you never really when it is safe to > route/remove the interrupt when a domain is running. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> > > --- > > RFC because I am not entirely sure what people are doing with physical > interrupt today. I think it is fine to disable dynamic routing. It is not really something it is supposed to be used today. Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > xen/arch/arm/gic.c | 38 ++++++++++++++++++++------------------ > 1 file changed, 20 insertions(+), 18 deletions(-) > > diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c > index 968e46fabb..653a815127 100644 > --- a/xen/arch/arm/gic.c > +++ b/xen/arch/arm/gic.c > @@ -136,6 +136,14 @@ int gic_route_irq_to_guest(struct domain *d, unsigned > int virq, > ASSERT(virq < vgic_num_irqs(d)); > ASSERT(!is_lpi(virq)); > > + /* > + * When routing an IRQ to guest, the virtual state is not synced > + * back to the physical IRQ. To prevent get unsync, restrict the > + * routing to when the Domain is been created. > + */ > + if ( d->creation_finished ) > + return -EBUSY; > + > ret = vgic_connect_hw_irq(d, NULL, virq, desc, true); > if ( ret ) > return ret; > @@ -160,25 +168,19 @@ int gic_remove_irq_from_guest(struct domain *d, > unsigned int virq, > ASSERT(test_bit(_IRQ_GUEST, &desc->status)); > ASSERT(!is_lpi(virq)); > > - if ( d->is_dying ) > - { > - desc->handler->shutdown(desc); > + /* > + * Removing an interrupt while the domain is running may have > + * undesirable effect on the vGIC emulation. > + */ > + if ( !d->is_dying ) > + return -EBUSY; > > - /* EOI the IRQ if it has not been done by the guest */ > - if ( test_bit(_IRQ_INPROGRESS, &desc->status) ) > - gic_hw_ops->deactivate_irq(desc); > - clear_bit(_IRQ_INPROGRESS, &desc->status); > - } > - else > - { > - /* > - * TODO: Handle eviction from LRs For now, deny > - * remove if the IRQ is inflight or not disabled. > - */ > - if ( test_bit(_IRQ_INPROGRESS, &desc->status) || > - !test_bit(_IRQ_DISABLED, &desc->status) ) > - return -EBUSY; > - } > + desc->handler->shutdown(desc); > + > + /* EOI the IRQ if it has not been done by the guest */ > + if ( test_bit(_IRQ_INPROGRESS, &desc->status) ) > + gic_hw_ops->deactivate_irq(desc); > + clear_bit(_IRQ_INPROGRESS, &desc->status); > > ret = vgic_connect_hw_irq(d, NULL, virq, desc, false); > if ( ret ) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |