[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCHv1 3/6] evtchn: simplify port_is_valid()



On 09/06/15 15:59, David Vrabel wrote:
> By keeping a count of the number of currently valid event channels,
> port_is_valid() can be simplified.
>
> d->valid_evtchns can also be tested without holding d->event_lock which
> will be useful later on.
>
> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
> ---
>  xen/common/event_channel.c |    3 +++
>  xen/include/xen/event.h    |    4 +---
>  xen/include/xen/sched.h    |    5 +++--
>  3 files changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
> index e4ade17..482c3ac 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;
>  
> +    atomic_add(EVTCHNS_PER_BUCKET, &d->valid_evtchns);
> +
>      return port;
>  }
>  
> @@ -1254,6 +1256,7 @@ int evtchn_init(struct domain *d)
>      d->evtchn = alloc_evtchn_bucket(d, 0);
>      if ( !d->evtchn )
>          return -ENOMEM;
> +    atomic_set(&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..77b4d31 100644
> --- a/xen/include/xen/event.h
> +++ b/xen/include/xen/event.h
> @@ -91,9 +91,7 @@ static inline bool_t port_is_valid(struct domain *d, 
> unsigned int p)
>          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 < atomic_read(&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..fab2e08 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 */
> +    atomic_t         valid_evtchns;   /* number of allocated event channels 
> */

atomic_t contains a signed integer.  You probably want a BUILD_BUG_ON()
if any ABI maximum value exceeds INT_MAX.

~Andrew

>      spinlock_t       event_lock;
>      const struct evtchn_port_ops *evtchn_port_ops;
>      struct evtchn_fifo_domain *evtchn_fifo;


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.