[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v8 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> --- 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); 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 @@ -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 |