From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jean Guyader Subject: Re: [PATCH 4/5] xen: events, exposes evtchn_alloc_unbound_domain Date: Fri, 10 Aug 2012 00:25:47 +0100 Message-ID: <20120809232547.GA21925@spongy> References: <1344023454-31425-1-git-send-email-jean.guyader@citrix.com> <1344023454-31425-5-git-send-email-jean.guyader@citrix.com> <20120809100605.GC16986@ocelot.phlegethon.org> <1344507826.32142.116.camel@zakaz.uk.xensource.com> <20120809103557.GA17503@ocelot.phlegethon.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="FCuugMFkClbJLl1L" Return-path: Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jean Guyader Cc: "Tim (Xen.org)" , Ian Campbell , "xen-devel@lists.xen.org" List-Id: xen-devel@lists.xenproject.org --FCuugMFkClbJLl1L Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline On 09/08 11:40, Jean Guyader wrote: > On 9 August 2012 11:35, Tim Deegan wrote: > > At 11:23 +0100 on 09 Aug (1344511426), Ian Campbell wrote: > >> On Thu, 2012-08-09 at 11:06 +0100, Tim Deegan wrote: > >> > At 20:50 +0100 on 03 Aug (1344027053), Jean Guyader wrote: > >> > > > >> > > Exposes evtchn_alloc_unbound_domain to the rest of > >> > > Xen so we can create allocated unbound evtchn within Xen. > >> > > > >> > > Signed-off-by: Jean Guyader > >> > > >> > > @@ -161,18 +163,18 @@ static long evtchn_alloc_unbound(evtchn_alloc_unbound_t *alloc) > >> > > { > >> > > struct evtchn *chn; > >> > > struct domain *d; > >> > > - int port; > >> > > + evtchn_port_t port; > >> > > domid_t dom = alloc->dom; > >> > > - long rc; > >> > > + int rc; > >> > > >> > The function returns long; if you're tidying this up to be an int, might > >> > as well change the return type too. > >> > >> I'm not sure if this is relevant but Jan just sent a patch to "make all > >> (native) hypercalls consistently have "long" return type". I > >> think/suspect this rc here turns into the result of the hypercall? > >> > >> Jan's patch was motivated by something to do with sign extension when a > >> hypercall's int return is written to the long in the multicall arg > >> struct which causes strangeness. Perhaps not totally relevant to > >> evtchn_alloc which is unlikely to be in a MC. > > > > Yes, this eventually ends up in a hypercall handler, but s/long/int/ > > here doesn't cause problems because > > - rc is only ever set to an 'int' value here so we can't lose data > > from the type being too narrow; and > > - Those int values get cast up to long (either in here or in the > > caller) directly, which will sign-extend the. > > > > It really doesn't matter whether this function returns an int or a long, > > but it's a bit untidy to change it half-way. > > > > The main reason why I changed it only base ERROR_EXIT_DOM expects an int based > on the format string. I guess I could cast the long in int for the > call to ERROR_EXIT_DOM > but that doesn't really look nice either. > Hi, Here is a new version that should address the comments from Tim and Jan. Signed-off-by: Jean Guyader Jean --FCuugMFkClbJLl1L Content-Type: text/x-diff; charset="us-ascii" Content-Disposition: attachment; filename="evtchn_alloc_unbound_domain.patch" commit c43dbcee9c4e9d65520f9a562b39e8e6455efc36 Author: Jean Guyader Date: Thu Aug 2 16:19:23 2012 +0100 xen: events, exposes evtchn_alloc_unbound_domain Exposes evtchn_alloc_unbound_domain to the rest of Xen so we can create allocated unbound evtchn within Xen. diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c index 53777f8..880395e 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -159,9 +159,8 @@ static int get_free_port(struct domain *d) static long evtchn_alloc_unbound(evtchn_alloc_unbound_t *alloc) { - struct evtchn *chn; struct domain *d; - int port; + evtchn_port_t port; domid_t dom = alloc->dom; long rc; @@ -169,26 +168,47 @@ static long evtchn_alloc_unbound(evtchn_alloc_unbound_t *alloc) if ( rc ) return rc; + rc = evtchn_alloc_unbound_domain(d, &port, + alloc->remote_dom == DOMID_SELF ? current->domain->domain_id + : alloc->remote_dom); + if ( rc ) + ERROR_EXIT_DOM((int)rc, d); + + alloc->port = port; + + out: + rcu_unlock_domain(d); + + return rc; +} + +int evtchn_alloc_unbound_domain(struct domain *d, evtchn_port_t *port, + domid_t remote_domid) +{ + struct evtchn *chn; + int rc; + int free_port; + spin_lock(&d->event_lock); - if ( (port = get_free_port(d)) < 0 ) - ERROR_EXIT_DOM(port, d); - chn = evtchn_from_port(d, port); + rc = free_port = get_free_port(d); + if ( free_port < 0 ) + goto out; - rc = xsm_evtchn_unbound(d, chn, alloc->remote_dom); + chn = evtchn_from_port(d, free_port); + rc = xsm_evtchn_unbound(d, chn, remote_domid); if ( rc ) goto out; chn->state = ECS_UNBOUND; - if ( (chn->u.unbound.remote_domid = alloc->remote_dom) == DOMID_SELF ) - chn->u.unbound.remote_domid = current->domain->domain_id; + chn->u.unbound.remote_domid = remote_domid; - alloc->port = port; + *port = free_port; + /* Everything is fine, returns 0 */ + rc = 0; out: spin_unlock(&d->event_lock); - rcu_unlock_domain(d); - return rc; } diff --git a/xen/include/xen/event.h b/xen/include/xen/event.h index 71c3e92..1a0c832 100644 --- a/xen/include/xen/event.h +++ b/xen/include/xen/event.h @@ -69,6 +69,9 @@ int guest_enabled_event(struct vcpu *v, uint32_t virq); /* Notify remote end of a Xen-attached event channel.*/ void notify_via_xen_event_channel(struct domain *ld, int lport); +int evtchn_alloc_unbound_domain(struct domain *d, evtchn_port_t *port, + domid_t remote_domid); + /* Internal event channel object accessors */ #define bucket_from_port(d,p) \ ((d)->evtchn[(p)/EVTCHNS_PER_BUCKET]) --FCuugMFkClbJLl1L Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel --FCuugMFkClbJLl1L--