2015-07-10 17:21:29 +02:00
|
|
|
# Commit 01280dc19cf3da089f98faf4f524b54b5a191df0
|
|
|
|
# Date 2015-06-18 14:53:23 +0200
|
|
|
|
# Author David Vrabel <david.vrabel@citrix.com>
|
|
|
|
# Committer Jan Beulich <jbeulich@suse.com>
|
|
|
|
evtchn: simplify port_is_valid()
|
|
|
|
|
|
|
|
By keeping a count of the number of currently valid event channels,
|
|
|
|
port_is_valid() can be simplified.
|
|
|
|
|
|
|
|
d->valid_evtchns is only increased (while holding d->event_lock), so
|
|
|
|
port_is_valid() may be safely called without taking the lock (this
|
|
|
|
will be useful later).
|
|
|
|
|
|
|
|
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
|
|
|
|
|
2015-08-27 00:28:15 +02:00
|
|
|
--- a/xen/common/event_channel.c
|
|
|
|
+++ b/xen/common/event_channel.c
|
2015-07-10 17:21:29 +02:00
|
|
|
@@ -191,6 +191,8 @@ static int get_free_port(struct domain *
|
|
|
|
return -ENOMEM;
|
|
|
|
bucket_from_port(d, port) = chn;
|
|
|
|
|
|
|
|
+ write_atomic(&d->valid_evtchns, d->valid_evtchns + EVTCHNS_PER_BUCKET);
|
|
|
|
+
|
|
|
|
return port;
|
|
|
|
}
|
|
|
|
|
2015-08-27 00:28:15 +02:00
|
|
|
@@ -1264,6 +1266,7 @@ int evtchn_init(struct domain *d)
|
2015-07-10 17:21:29 +02:00
|
|
|
d->evtchn = alloc_evtchn_bucket(d, 0);
|
|
|
|
if ( !d->evtchn )
|
|
|
|
return -ENOMEM;
|
|
|
|
+ d->valid_evtchns = EVTCHNS_PER_BUCKET;
|
|
|
|
|
|
|
|
spin_lock_init(&d->event_lock);
|
|
|
|
if ( get_free_port(d) != 0 )
|
2015-08-27 00:28:15 +02:00
|
|
|
--- a/xen/include/xen/event.h
|
|
|
|
+++ b/xen/include/xen/event.h
|
2015-07-10 17:21:29 +02:00
|
|
|
@@ -90,11 +90,7 @@ static inline bool_t port_is_valid(struc
|
|
|
|
{
|
|
|
|
if ( p >= d->max_evtchns )
|
|
|
|
return 0;
|
|
|
|
- if ( !d->evtchn )
|
|
|
|
- return 0;
|
|
|
|
- if ( p < EVTCHNS_PER_BUCKET )
|
|
|
|
- return 1;
|
|
|
|
- return group_from_port(d, p) != NULL && bucket_from_port(d, p) != NULL;
|
|
|
|
+ return p < read_atomic(&d->valid_evtchns);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline struct evtchn *evtchn_from_port(struct domain *d, unsigned int p)
|
2015-08-27 00:28:15 +02:00
|
|
|
--- a/xen/include/xen/sched.h
|
|
|
|
+++ b/xen/include/xen/sched.h
|
|
|
|
@@ -339,8 +339,9 @@ struct domain
|
2015-07-10 17:21:29 +02:00
|
|
|
/* Event channel information. */
|
|
|
|
struct evtchn *evtchn; /* first bucket only */
|
|
|
|
struct evtchn **evtchn_group[NR_EVTCHN_GROUPS]; /* all other buckets */
|
|
|
|
- unsigned int max_evtchns;
|
|
|
|
- unsigned int max_evtchn_port;
|
|
|
|
+ unsigned int max_evtchns; /* number supported by ABI */
|
|
|
|
+ unsigned int max_evtchn_port; /* max permitted port number */
|
|
|
|
+ unsigned int valid_evtchns; /* number of allocated event channels */
|
|
|
|
spinlock_t event_lock;
|
|
|
|
const struct evtchn_port_ops *evtchn_port_ops;
|
|
|
|
struct evtchn_fifo_domain *evtchn_fifo;
|