[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH 06/12] evtchn: don't bypass unlinking pIRQ when closing port
> -----Original Message----- > From: Xen-devel <xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of Jan > Beulich > Sent: 28 September 2020 11:59 > To: xen-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>; George Dunlap > <George.Dunlap@xxxxxxxxxxxxx>; Ian > Jackson <iwj@xxxxxxxxxxxxxx>; Julien Grall <julien@xxxxxxx>; Wei Liu > <wl@xxxxxxx>; Stefano Stabellini > <sstabellini@xxxxxxxxxx> > Subject: [PATCH 06/12] evtchn: don't bypass unlinking pIRQ when closing port > > There's no other path causing a terminal unlink_pirq_port() to be called > (evtchn_bind_vcpu() relinks it right away) and hence _if_ pirq can > indeed be NULL when closing the port, list corruption would occur when > bypassing the unlink (unless the structure never gets linked again). As > we can't come here after evtchn_destroy() anymore, (late) domain > destruction also isn't a reason for a possible exception, and hence the > only alternative looks to be that the check was pointless in the first > place. While I haven't observed the case, from code inspection I'm far > from sure I can exclude this being possible, so it feels more safe to > re-arrange the code instead. > > Fixes: c24536b636f2 ("replace d->nr_pirqs sized arrays with radix tree") > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Paul Durrant <paul@xxxxxxx> > > --- a/xen/common/event_channel.c > +++ b/xen/common/event_channel.c > @@ -615,17 +615,18 @@ int evtchn_close(struct domain *d1, int > case ECS_PIRQ: { > struct pirq *pirq = pirq_info(d1, chn1->u.pirq.irq); > > - if ( !pirq ) > - break; > - if ( !is_hvm_domain(d1) ) > - pirq_guest_unbind(d1, pirq); > - pirq->evtchn = 0; > - pirq_cleanup_check(pirq, d1); > - unlink_pirq_port(chn1, d1->vcpu[chn1->notify_vcpu_id]); > + if ( pirq ) > + { > + if ( !is_hvm_domain(d1) ) > + pirq_guest_unbind(d1, pirq); > + pirq->evtchn = 0; > + pirq_cleanup_check(pirq, d1); > #ifdef CONFIG_X86 > - if ( is_hvm_domain(d1) && domain_pirq_to_irq(d1, pirq->pirq) > 0 ) > - unmap_domain_pirq_emuirq(d1, pirq->pirq); > + if ( is_hvm_domain(d1) && domain_pirq_to_irq(d1, pirq->pirq) > 0 > ) > + unmap_domain_pirq_emuirq(d1, pirq->pirq); > #endif > + } > + unlink_pirq_port(chn1, d1->vcpu[chn1->notify_vcpu_id]); > break; > } > >
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |