From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Vrabel Subject: [PATCHv3 3/6] evtchn: simplify port_is_valid() Date: Wed, 17 Jun 2015 13:03:00 +0100 Message-ID: <1434542583-28073-4-git-send-email-david.vrabel@citrix.com> References: <1434542583-28073-1-git-send-email-david.vrabel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Z5C4C-0001am-Ok for xen-devel@lists.xenproject.org; Wed, 17 Jun 2015 12:03:40 +0000 In-Reply-To: <1434542583-28073-1-git-send-email-david.vrabel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xenproject.org Cc: Keir Fraser , Tim Deegan , David Vrabel , Jan Beulich , Ian Campbell List-Id: xen-devel@lists.xenproject.org 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 --- v3: - Remove redundant d->evtchn test. v2: - Used unsigned int for d->valid_evtchns. --- xen/common/event_channel.c | 3 +++ xen/include/xen/event.h | 6 +----- xen/include/xen/sched.h | 5 +++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c index ab3b48e..4924796 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -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; } @@ -1232,6 +1234,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 ) diff --git a/xen/include/xen/event.h b/xen/include/xen/event.h index 690f865..af923d1 100644 --- a/xen/include/xen/event.h +++ b/xen/include/xen/event.h @@ -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) diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 80c6f62..604d047 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -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; -- 1.7.10.4