From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH v9 04/11] xen: evtchn: make evtchn_reset() ready for soft reset Date: Thu, 16 Jul 2015 14:43:17 -0400 Message-ID: <20150716184317.GF14309@x230.dumpdata.com> References: <1437064046-12174-1-git-send-email-vkuznets@redhat.com> <1437064046-12174-5-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 1ZFo82-0007nk-Uh for xen-devel@lists.xenproject.org; Thu, 16 Jul 2015 18:43:31 +0000 Content-Disposition: inline In-Reply-To: <1437064046-12174-5-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: Vitaly Kuznetsov Cc: Wei Liu , Andrew Jones , Keir Fraser , Ian Campbell , Stefano Stabellini , Andrew Cooper , Julien Grall , Ian Jackson , Olaf Hering , Tim Deegan , David Vrabel , Jan Beulich , xen-devel@lists.xenproject.org, Daniel De Graaf List-Id: xen-devel@lists.xenproject.org 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 Reviewed-by: Konrad Rzeszutek Wilk > --- > 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 >