Hello all,
Here's a suggested patch for xen/common/event_channel.c
Summary:
Allows interdomain channels to bind DOMID_SELF to DOMID_SELF. A couple
of quick fixes made this work, since support for loopback channels is
already there.
Stops a local port leak when an interdomain channel is rejected at the
remote end.
Thanks,
-steve
Signed-off-by: Steve King <steven.r.king@xxxxxxxxx>
diff -r 446aa56ca4fe xen/common/event_channel.c
--- a/xen/common/event_channel.c Mon Oct 17 12:50:28 2005
+++ b/xen/common/event_channel.c Mon Oct 17 16:12:21 2005
@@ -89,7 +89,10 @@
chn = evtchn_from_port(d, port);
chn->state = ECS_UNBOUND;
- chn->u.unbound.remote_domid = alloc->remote_dom;
+ if( alloc->remote_dom == DOMID_SELF )
+ chn->u.unbound.remote_domid = current->domain->domain_id;
+ else
+ chn->u.unbound.remote_domid = alloc->remote_dom;
alloc->port = port;
@@ -108,8 +111,14 @@
struct domain *ld = current->domain, *rd;
int lport, rport = bind->remote_port;
long rc = 0;
-
- if ( (rd = find_domain_by_id(bind->remote_dom)) == NULL )
+ domid_t rdom;
+
+ if( bind->remote_dom == DOMID_SELF )
+ rdom = current->domain->domain_id;
+ else
+ rdom = bind->remote_dom;
+
+ if ( (rd = find_domain_by_id(rdom)) == NULL )
return -ESRCH;
/* Avoid deadlock by first acquiring lock of domain with smaller
id. */
@@ -125,16 +134,21 @@
spin_lock(&ld->evtchn_lock);
}
- if ( (lport = get_free_port(ld)) < 0 )
- ERROR_EXIT(lport);
- lchn = evtchn_from_port(ld, lport);
-
+ /*
+ * Failure paths do not deallocate the local port,
+ * so validate before allocating.
+ */
if ( !port_is_valid(rd, rport) )
ERROR_EXIT(-EINVAL);
rchn = evtchn_from_port(rd, rport);
if ( (rchn->state != ECS_UNBOUND) ||
(rchn->u.unbound.remote_domid != ld->domain_id) )
ERROR_EXIT(-EINVAL);
+
+ if ( (lport = get_free_port(ld)) < 0 )
+ ERROR_EXIT(lport);
+
+ lchn = evtchn_from_port(ld, lport);
lchn->u.interdomain.remote_dom = rd;
lchn->u.interdomain.remote_port = (u16)rport;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|