[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v9 04/11] xen: evtchn: make evtchn_reset() ready for soft reset
On Thu, Jul 16, 2015 at 06:27:19PM +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> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> > --- > Changes since v8: > - Check !d->controller_pause_count instead of pausing/unpausing the domain > in evtchn_reset(). [Konrad Rzeszutek Wilk] > --- > xen/common/event_channel.c | 43 +++++++++++++++++++------------------------ > xen/include/xen/event.h | 3 +++ > 2 files changed, 22 insertions(+), 24 deletions(-) > > diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c > index 7640e30..4fa1e4a 100644 > --- a/xen/common/event_channel.c > +++ b/xen/common/event_channel.c > @@ -981,44 +981,28 @@ int evtchn_unmask(unsigned int port) > } > > > -static long evtchn_reset(evtchn_reset_t *r) > +int 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 && !d->controller_pause_count ) > + return -EINVAL; > > for ( i = 0; port_is_valid(d, i); i++ ) > evtchn_close(d, i, 1); > > 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 > - * FIFO event array and control blocks, resetting evtchn_port_ops to > - * evtchn_port_ops_2l. > - */ > + /* Switching back to 2-level ABI. */ > evtchn_fifo_destroy(d); > evtchn_2l_init(d); > } > > spin_unlock(&d->event_lock); > > - rc = 0; > - > -out: > - rcu_unlock_domain(d); > - > - return rc; > + return 0; > } > > static long evtchn_set_priority(const struct evtchn_set_priority > *set_priority) > @@ -1143,9 +1127,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 ) > + 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..b87924a 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. */ > +int evtchn_reset(struct domain *d); > + > /* > * Low-level event channel port ops. > */ > -- > 2.4.3 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |