From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vitaly Kuznetsov Subject: [PATCH v10 04/11] xen: evtchn: make evtchn_reset() ready for soft reset Date: Tue, 28 Jul 2015 15:28:09 +0200 Message-ID: <1438090096-8297-5-git-send-email-vkuznets@redhat.com> References: <1438090096-8297-1-git-send-email-vkuznets@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1ZK4vu-0005Fq-Ej for xen-devel@lists.xenproject.org; Tue, 28 Jul 2015 13:28:38 +0000 In-Reply-To: <1438090096-8297-1-git-send-email-vkuznets@redhat.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xenproject.org Cc: Andrew Jones , Julien Grall , Keir Fraser , Ian Campbell , Stefano Stabellini , Andrew Cooper , Ian Jackson , Olaf Hering , Tim Deegan , David Vrabel , Jan Beulich , Wei Liu , Daniel De Graaf List-Id: xen-devel@lists.xenproject.org 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 Reviewed-by: Konrad Rzeszutek Wilk Acked-by: Jan Beulich --- Changes since v9: - Add Reviewed-by: [Konrad Rzeszutek Wilk] - Add Acked-by: [Jan Beulich] --- 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