]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/xen.git/commitdiff
evtchn: simplify port_is_valid()
authorDavid Vrabel <david.vrabel@citrix.com>
Thu, 18 Jun 2015 12:53:23 +0000 (14:53 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 18 Jun 2015 12:53:23 +0000 (14:53 +0200)
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>
xen/common/event_channel.c
xen/include/xen/event.h
xen/include/xen/sched.h

index 947880f8ffcbb0ef5345f8a73cf1b761f0ba84cc..fd48646a262e9f2605ea4d64c05fadeb773c1546 100644 (file)
@@ -189,6 +189,8 @@ static int get_free_port(struct domain *d)
         return -ENOMEM;
     bucket_from_port(d, port) = chn;
 
+    write_atomic(&d->valid_evtchns, d->valid_evtchns + EVTCHNS_PER_BUCKET);
+
     return port;
 }
 
@@ -1254,6 +1256,7 @@ int evtchn_init(struct domain *d)
     d->evtchn = alloc_evtchn_bucket(d, 0);
     if ( !d->evtchn )
         return -ENOMEM;
+    d->valid_evtchns = EVTCHNS_PER_BUCKET;
 
     spin_lock_init_prof(d, event_lock);
     if ( get_free_port(d) != 0 )
index 690f865dac6dd2202f6a5208a1c7b54521331e52..af923d1ef69d4568c3218154a3cf58e8b90ffde9 100644 (file)
@@ -89,11 +89,7 @@ static inline bool_t port_is_valid(struct domain *d, unsigned int p)
 {
     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)
index 80c6f620ceac3125e359f04e8110361f62d6ef11..604d047d9277df43797e94e44a9053809952fabb 100644 (file)
@@ -336,8 +336,9 @@ struct domain
     /* 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;