[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 12/24] xen/arm: Release IRQ routed to a domain when it's destroying
Hi Ian, On 20/02/15 16:31, Ian Campbell wrote: > On Tue, 2015-01-13 at 14:25 +0000, Julien Grall wrote: > >> Futhermore, a guest can crash and let the IRQ in an incorrect state (i.e has > > "Furthermore" (I think your finger macros have this one wrong, you might > want to grep the series ;-)) I do this mistake every-time. I will check this series (and upcoming series) > >> + /* TODO: Handle eviction from LRs. For now, deny remove if the IRQ >> + * is inflight and not disabled. > > If we are ungracefully killing a guest doesn't this risk ending up with > an undestroyable domain? i.e. if the guest is paused with an inflight > IRQ and then destroyed, how does the inflight IRQ ever become > not-inflight again? A similar argument could apply if the guest has e.g. > crashed, paniced or is otherwise not processing any more interrupts or > generating EOIs for existing ones. No, this will fall on the "is_dying" part. During domain destruction, the hypervisor will release all the IRQ still assigned to the guest one by one. > We need to be able to kill a guest in such a state somehow. The TODO is here for running domain where we try to deassign an inflight IRQ. > (BTW, I notice the comment style is consistently wrong through the > series) I will check all the patches. >> + /* Only SPIs are supported */ >> + if ( virq < 32 || virq >= vgic_num_irqs(d) ) >> + return -EINVAL; >> + >> + p = irq_to_pending(d->vcpu[0], virq); >> + if ( !p->desc ) >> + return -EINVAL; > > Are we seeing this pattern a lot? It seems so, I wonder if a helper > could be useful: > p = spi_to_pending(d, virq); > if ( !p->desc ) > return -EINVAL; > > with the < 32 check etc in the helper where it only needs commenting on > once. IIRC, there is only 2 places. I will replace it by an helper. >> + >> + desc = p->desc; >> + >> + spin_lock_irqsave(&desc->lock, flags); >> + >> + ret = -EINVAL; >> + if ( !test_bit(_IRQ_GUEST, &desc->status) ) >> + goto unlock; >> + >> + ret = -EINVAL; > > A bit redundant, or should nestle the info = like you did above with the > test_bit. I will invert it. >> + info = irq_get_guest_info(desc); >> + if ( d != info->d ) >> + goto unlock; >> + >> + ret = gic_remove_irq_from_guest(d, virq, desc); >> + >> + spin_unlock_irqrestore(&desc->lock, flags); >> + >> + if ( !ret ) > > This is a bit unconventional (it looks essentially like you have three > exit paths, with this extra special success case and two error cases). > > It would better if the gic_remove_irq_from_guest failure case went to > unlock like all the other failure cases, then the success path would be > a straight line. > > (yes, that would mean a goto unlock right before the first spin_unlock, > but the code flow would be clearer). I will do. > >> + { >> + release_irq(desc->irq, info); >> + xfree(info); >> + } >> + >> + return ret; >> + >> +unlock: >> + spin_unlock_irqrestore(&desc->lock, flags); >> + >> + return ret; >> +} >> + >> /* >> * pirq event channels. We don't use these on ARM, instead we use the >> * features of the GIC to inject virtualised normal interrupts. >> diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c >> index fc8a270..4ddfd73 100644 >> --- a/xen/arch/arm/vgic.c >> +++ b/xen/arch/arm/vgic.c >> @@ -133,6 +133,22 @@ void register_vgic_ops(struct domain *d, const struct >> vgic_ops *ops) >> >> void domain_vgic_free(struct domain *d) >> { >> + int i; >> + int ret; >> + >> + for ( i = 0; i < (d->arch.vgic.nr_spis); i++ ) >> + { >> + struct pending_irq *p = &d->arch.vgic.pending_irqs[i]; > > Is there not a helper for this lookup? If so it should be used. The irq_pending code is adding extra-check. But I guess we don't care for domain destruction? Regards, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |