[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v9 04/11] xen: evtchn: make evtchn_reset() ready for soft reset
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> --- 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 |