Hi Jan,
On 05/07/2022 16:11, Jan Beulich wrote:
On 22.06.2022 16:38, Rahul Singh wrote:
@@ -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;
+ }
This is then the 3rd instance of this pattern. I think the logic
wants moving into get_free_port() (perhaps with a name change).
I think the code below would be suitable. I can send it or Rahul can
re-use the commit [1]:
diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
index
e6fb024218e949529c587b7c4755295786d6e7a7..757088580c2b2a3e55774f50b8ad7b3ec9243788
100644 (file)
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -292,6 +292,18 @@ void evtchn_free(struct domain *d, struct evtchn *chn)
xsm_evtchn_close_post(chn);
}
+static int evtchn_get_port(struct domain *d, uint32_t port)
+{
+ int rc;
+
+ if ( port != 0 )
+ rc = evtchn_allocate_port(d, port);
+ else
+ rc = get_free_port(d);
+
+ return rc != 0 ? rc : port;
+}
+
static long evtchn_alloc_unbound(evtchn_alloc_unbound_t *alloc)
{
struct evtchn *chn;
@@ -451,19 +463,10 @@ int evtchn_bind_virq(evtchn_bind_virq_t *bind,
evtchn_port_t port)
if ( read_atomic(&v->virq_to_evtchn[virq]) )
ERROR_EXIT(-EEXIST);
- if ( port != 0 )
- {
- if ( (rc = evtchn_allocate_port(d, port)) != 0 )
- ERROR_EXIT(rc);
- }
- else
- {
- int alloc_port = get_free_port(d);
-
- if ( alloc_port < 0 )
- ERROR_EXIT(alloc_port);
- port = alloc_port;
- }
+ port = rc = evtchn_get_port(d, port);
+ if ( rc < 0 )
+ ERROR_EXIT(rc);
+ rc = 0;
chn = evtchn_from_port(d, port);
[1]
https://xenbits.xen.org/gitweb/?p=people/julieng/xen-unstable.git;a=commit;h=3860ed9915d6fee97a1088110ffd0a6f29f04d9a
And of course like in the earlier patch the issue with sparse port
numbers needs to be resolved.
Jan
--
Julien Grall