[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8 04/11] xen: evtchn: make evtchn_reset() ready for soft reset
On Tue, Jun 23, 2015 at 06:11:46PM +0200, Vitaly Kuznetsov wrote: > We need to close all event channel so the domain performing soft reset > will be able to open them back. > > Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> > --- > xen/common/event_channel.c | 38 +++++++++++++++++++------------------- > xen/include/xen/event.h | 3 +++ > 2 files changed, 22 insertions(+), 19 deletions(-) > > diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c > index 2208de0..894bdf2 100644 > --- a/xen/common/event_channel.c > +++ b/xen/common/event_channel.c > @@ -937,26 +937,19 @@ int evtchn_unmask(unsigned int port) > } > > > -static long evtchn_reset(evtchn_reset_t *r) > +void evtchn_reset(struct domain *d) > { > - domid_t dom = r->dom; > - struct domain *d; > - int i, rc; > - > - d = rcu_lock_domain_by_any_id(dom); > - if ( d == NULL ) > - return -ESRCH; > + unsigned int i; > > - rc = xsm_evtchn_reset(XSM_TARGET, current->domain, d); > - if ( rc ) > - goto out; > + if ( d != current->domain ) > + domain_pause(d); That is a bit of blocking operation. Could it be an requirement that the domain has to be paused before this operation is done? As in: if ( d != current->domain && !d->controller_pause_count) { return -EINVAL; } and then there is no need for the domain_pause/unpause business here. > > for ( i = 0; port_is_valid(d, i); i++ ) > (void)__evtchn_close(d, i); > > spin_lock(&d->event_lock); > > - if ( (dom == DOMID_SELF) && d->evtchn_fifo ) > + if ( d->evtchn_fifo ) > { > /* > * Guest domain called EVTCHNOP_reset with DOMID_SELF, destroying You should also update the comment saying 'DOMID_SELF' as now it can be another domain doing it as well. > @@ -969,12 +962,8 @@ static long evtchn_reset(evtchn_reset_t *r) > > spin_unlock(&d->event_lock); > > - rc = 0; > - > -out: > - rcu_unlock_domain(d); > - > - return rc; > + if ( d != current->domain ) > + domain_unpause(d); > } > > static long evtchn_set_priority(const struct evtchn_set_priority > *set_priority) > @@ -1099,9 +1088,20 @@ long do_event_channel_op(int cmd, > XEN_GUEST_HANDLE_PARAM(void) arg) > > case EVTCHNOP_reset: { > struct evtchn_reset reset; > + struct domain *d; > + > if ( copy_from_guest(&reset, arg, 1) != 0 ) > return -EFAULT; > - rc = evtchn_reset(&reset); > + > + d = rcu_lock_domain_by_any_id(reset.dom); > + if ( d == NULL ) > + return -ESRCH; > + > + rc = xsm_evtchn_reset(XSM_TARGET, current->domain, d); > + if ( !rc ) > + evtchn_reset(d); > + > + rcu_unlock_domain(d); > break; > } > > diff --git a/xen/include/xen/event.h b/xen/include/xen/event.h > index af923d1..b99e19b 100644 > --- a/xen/include/xen/event.h > +++ b/xen/include/xen/event.h > @@ -126,6 +126,9 @@ void evtchn_check_pollers(struct domain *d, unsigned int > port); > > void evtchn_2l_init(struct domain *d); > > +/* Close all event channels and reset to 2-level ABI */ > +void evtchn_reset(struct domain *d); > + > /* > * Low-level event channel port ops. > */ > -- > 2.4.2 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |