[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 3/8] xen/evtchn: modify evtchn_bind_interdomain to allocate specified port
evtchn_bind_interdomain() always allocates the next available local port. Static event channel support for dom0less domains requires allocating a specified port. Modify the evtchn_bind_interdomain to accept the port number as an argument and allocate the specified port if available. If the port number argument is zero, the next available port will be allocated. Signed-off-by: Rahul Singh <rahul.singh@xxxxxxx> --- xen/common/event_channel.c | 26 +++++++++++++++++++++----- xen/include/xen/event.h | 3 ++- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c index 80a88c1544..bf5dc2c8ad 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -363,11 +363,16 @@ static void double_evtchn_unlock(struct evtchn *lchn, struct evtchn *rchn) evtchn_write_unlock(rchn); } -int evtchn_bind_interdomain(evtchn_bind_interdomain_t *bind) +/* + * If lport is zero get the next free port and allocate. If port is non-zero + * allocate the specified lport. + */ +int evtchn_bind_interdomain(evtchn_bind_interdomain_t *bind, + evtchn_port_t lport) { struct evtchn *lchn, *rchn; struct domain *ld = current->domain, *rd; - int lport, rc; + int rc; evtchn_port_t rport = bind->remote_port; domid_t rdom = bind->remote_dom; @@ -387,8 +392,19 @@ int evtchn_bind_interdomain(evtchn_bind_interdomain_t *bind) spin_lock(&ld->event_lock); } - if ( (lport = get_free_port(ld)) < 0 ) - ERROR_EXIT(lport); + if ( lport != 0 ) + { + if ( (rc = evtchn_allocate_port(ld, lport)) != 0 ) + ERROR_EXIT_DOM(rc, ld); + } + else + { + int alloc_port = get_free_port(ld); + + if ( alloc_port < 0 ) + ERROR_EXIT_DOM(alloc_port, ld); + lport = alloc_port; + } lchn = evtchn_from_port(ld, lport); rchn = _evtchn_from_port(rd, rport); @@ -1232,7 +1248,7 @@ long cf_check do_event_channel_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) struct evtchn_bind_interdomain bind_interdomain; if ( copy_from_guest(&bind_interdomain, arg, 1) != 0 ) return -EFAULT; - rc = evtchn_bind_interdomain(&bind_interdomain); + rc = evtchn_bind_interdomain(&bind_interdomain, 0); if ( !rc && __copy_to_guest(arg, &bind_interdomain, 1) ) rc = -EFAULT; /* Cleaning up here would be a mess! */ break; diff --git a/xen/include/xen/event.h b/xen/include/xen/event.h index 48820e393e..6e26879793 100644 --- a/xen/include/xen/event.h +++ b/xen/include/xen/event.h @@ -76,7 +76,8 @@ int __must_check evtchn_alloc_unbound(evtchn_alloc_unbound_t *alloc, evtchn_port_t port); /* Bind an event channel port to interdomain */ -int __must_check evtchn_bind_interdomain(evtchn_bind_interdomain_t *bind); +int __must_check evtchn_bind_interdomain(evtchn_bind_interdomain_t *bind, + evtchn_port_t port); /* Unmask a local event-channel port. */ int evtchn_unmask(unsigned int port); -- 2.25.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |