[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Extend EVTCHNOP_alloc_unbound to allocate a specified port, if
ChangeSet 1.1674, 2005/06/05 11:11:05+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx Extend EVTCHNOP_alloc_unbound to allocate a specified port, if non-zero value is passed in. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> tools/libxc/xc_evtchn.c | 5 +++-- tools/python/xen/lowlevel/xc/xc.c | 7 ++++--- xen/common/event_channel.c | 37 ++++++++++++++++++++++++++++--------- xen/include/public/event_channel.h | 7 ++++--- 4 files changed, 39 insertions(+), 17 deletions(-) diff -Nru a/tools/libxc/xc_evtchn.c b/tools/libxc/xc_evtchn.c --- a/tools/libxc/xc_evtchn.c 2005-06-05 07:02:27 -04:00 +++ b/tools/libxc/xc_evtchn.c 2005-06-05 07:02:27 -04:00 @@ -39,8 +39,9 @@ int rc; op.cmd = EVTCHNOP_alloc_unbound; - op.u.alloc_unbound.dom = (domid_t)dom; - + op.u.alloc_unbound.dom = (domid_t)dom; + op.u.alloc_unbound.port = (port != NULL) ? *port : 0; + if ( (rc = do_evtchn_op(xc_handle, &op)) == 0 ) { if ( port != NULL ) diff -Nru a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c 2005-06-05 07:02:27 -04:00 +++ b/tools/python/xen/lowlevel/xc/xc.c 2005-06-05 07:02:27 -04:00 @@ -494,11 +494,12 @@ XcObject *xc = (XcObject *)self; u32 dom; - int port; + int port = 0; - static char *kwd_list[] = { "dom", NULL }; + static char *kwd_list[] = { "dom", "port", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i", kwd_list, &dom) ) + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list, + &dom, &port) ) return NULL; if ( xc_evtchn_alloc_unbound(xc->xc_handle, dom, &port) != 0 ) diff -Nru a/xen/common/event_channel.c b/xen/common/event_channel.c --- a/xen/common/event_channel.c 2005-06-05 07:02:27 -04:00 +++ b/xen/common/event_channel.c 2005-06-05 07:02:27 -04:00 @@ -35,6 +35,8 @@ #define evtchn_from_port(d,p) \ (&(bucket_from_port(d,p))[(p)&(EVTCHNS_PER_BUCKET-1)]) +#define ERROR_EXIT(_errno) do { rc = (_errno); goto out; } while ( 0 ) + static int get_free_port(struct domain *d) { struct evtchn *chn; @@ -61,30 +63,48 @@ { struct evtchn *chn; struct domain *d = current->domain; - int port; + int port = alloc->port; + long rc = 0; spin_lock(&d->evtchn_lock); - if ( (port = get_free_port(d)) >= 0 ) + /* Obtain, or ensure that we already have, a valid <port>. */ + if ( port == 0 ) { - chn = evtchn_from_port(d, port); + if ( (port = get_free_port(d)) < 0 ) + ERROR_EXIT(port); + } + else if ( !port_is_valid(d, port) ) + ERROR_EXIT(-EINVAL); + chn = evtchn_from_port(d, port); + + /* Validate channel's current state. */ + switch ( chn->state ) + { + case ECS_FREE: chn->state = ECS_UNBOUND; chn->u.unbound.remote_domid = alloc->dom; + break; + + case ECS_UNBOUND: + if ( chn->u.unbound.remote_domid != alloc->dom ) + ERROR_EXIT(-EINVAL); + break; + + default: + ERROR_EXIT(-EINVAL); } + out: spin_unlock(&d->evtchn_lock); - if ( port < 0 ) - return port; - alloc->port = port; - return 0; + return rc; } static long evtchn_bind_interdomain(evtchn_bind_interdomain_t *bind) { -#define ERROR_EXIT(_errno) do { rc = (_errno); goto out; } while ( 0 ) struct evtchn *chn1, *chn2; struct domain *d1, *d2; int port1 = bind->port1, port2 = bind->port2; @@ -217,7 +237,6 @@ bind->port2 = port2; return rc; -#undef ERROR_EXIT } diff -Nru a/xen/include/public/event_channel.h b/xen/include/public/event_channel.h --- a/xen/include/public/event_channel.h 2005-06-05 07:02:27 -04:00 +++ b/xen/include/public/event_channel.h 2005-06-05 07:02:27 -04:00 @@ -10,15 +10,16 @@ #define __XEN_PUBLIC_EVENT_CHANNEL_H__ /* - * EVTCHNOP_alloc_unbound: Allocate a fresh local port and prepare - * it for binding to <dom>. + * EVTCHNOP_alloc_unbound: Prepare a local port for binding to <dom>. + * <port> may be wildcarded by setting to zero, in which case a fresh port + * will be allocated, and the field filled in on return. */ #define EVTCHNOP_alloc_unbound 6 typedef struct { /* IN parameters */ domid_t dom; /* 0 */ u16 __pad; - /* OUT parameters */ + /* IN/OUT parameters */ u32 port; /* 4 */ } PACKED evtchn_alloc_unbound_t; /* 8 bytes */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |