[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V2] xen: Fix BUFIOREQ evtchn init for a stubdom.
On Fri, 2012-06-29 at 11:10 +0100, Keir Fraser wrote: > On 29/06/2012 09:50, "Jan Beulich" <JBeulich@xxxxxxxx> wrote: > > >>>> On 26.06.12 at 17:21, Anthony PERARD <anthony.perard@xxxxxxxxxx> wrote: > >> @@ -3777,17 +3792,21 @@ long do_hvm_op(unsigned long op, > >> XEN_GUEST_HANDLE(void) arg) > >> iorp = &d->arch.hvm_domain.ioreq; > >> for_each_vcpu ( d, v ) > >> { > >> - int old_port, new_port; > >> - new_port = alloc_unbound_xen_event_channel( > >> - v, a.value, NULL); > >> - if ( new_port < 0 ) > >> - { > >> - rc = new_port; > >> + rc = hvm_replace_event_channel(v, a.value, > >> + > >> &v->arch.hvm_vcpu.xen_port); > >> + if ( rc ) > >> break; > >> + > >> + if ( v->vcpu_id == 0 ) > > > > Don't you also have to check params[HVM_PARAM_BUFIOREQ_EVTCHN] > > is valid (as otherwise free_xen_event_channel() will BUG_ON() on > > it)? > > No, params[HVM_PARAM_BUFIOREQ_EVTCHN] is guaranteed valid. > > >> + { > >> + spin_lock(&iorp->lock); > >> + rc = hvm_replace_event_channel(v, a.value, > >> + > >> (int*)&v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN]); > >> + spin_unlock(&iorp->lock); > >> + if ( rc ) > >> + break; > >> } > > > > My first preference would be for this to be moved out of the > > loop. If it has to remain in the loop for some reason, then the > > next best option would be to move this into the iorp->lock > > protected region immediately below. > > Agree on moving it out of the loop. But why would you want it protected by > iorp->lock? I suggested it because the user of the field locks with that lock. I think that even with the xchg there is still scope for the old event channel to be in use in hvm_buffered_io_send after it has been replaced. The xchg just protects against concurrent freeing. Ian. > > -- Keir > > > Jan > > > >> - /* xchg() ensures that only we > >> free_xen_event_channel() > >> */ > >> - old_port = xchg(&v->arch.hvm_vcpu.xen_port, new_port); > >> - free_xen_event_channel(v, old_port); > >> + > >> spin_lock(&iorp->lock); > >> if ( iorp->va != NULL ) > >> get_ioreq(v)->vp_eport = > >> v->arch.hvm_vcpu.xen_port; > > > > > > > > _______________________________________________ > > Xen-devel mailing list > > Xen-devel@xxxxxxxxxxxxx > > http://lists.xen.org/xen-devel > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |