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

Re: [Xen-devel] [PATCH 4/8] evtchn: Dynamically allocate d->evtchn



On Tue, 2013-03-19 at 21:00 +0000, David Vrabel wrote:
> From: Wei Liu <wei.liu2@xxxxxxxxxx>
> 
> As we move to extended evtchn ABI we need bigger d->evtchn, as a result
> this will bloat struct domain. So move this array out of struct domain
> and allocate a dedicated array for it.
> 

Please check out the patch series I sent yesterday. I modified the
internal object store for event channel, which can save space when your
domain only has small number of event channels, which is the case for
FIFO-based ABI.


Wei.

> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
> ---
>  xen/common/event_channel.c |   14 ++++++++++++++
>  xen/include/xen/sched.h    |    2 +-
>  2 files changed, 15 insertions(+), 1 deletions(-)
> 
> diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
> index 3a91241..44672b5 100644
> --- a/xen/common/event_channel.c
> +++ b/xen/common/event_channel.c
> @@ -1136,15 +1136,27 @@ void notify_via_xen_event_channel(struct domain *ld, 
> int lport)
>  
>  int evtchn_init(struct domain *d)
>  {
> +    BUILD_BUG_ON(sizeof(struct evtchn *) * NR_EVTCHN_BUCKETS > PAGE_SIZE);
> +    d->evtchn = xzalloc_array(struct evtchn *, NR_EVTCHN_BUCKETS);
> +
> +    if ( d->evtchn == NULL )
> +        return -ENOMEM;
> +
>      spin_lock_init(&d->event_lock);
>      if ( get_free_port(d) != 0 )
> +    {
> +        xfree(d->evtchn);
>          return -EINVAL;
> +    }
>      evtchn_from_port(d, 0)->state = ECS_RESERVED;
>  
>  #if MAX_VIRT_CPUS > BITS_PER_LONG
>      d->poll_mask = xmalloc_array(unsigned long, 
> BITS_TO_LONGS(MAX_VIRT_CPUS));
>      if ( !d->poll_mask )
> +    {
> +        xfree(d->evtchn);
>          return -ENOMEM;
> +    }
>      bitmap_zero(d->poll_mask, MAX_VIRT_CPUS);
>  #endif
>  
> @@ -1180,6 +1192,8 @@ void evtchn_destroy(struct domain *d)
>      spin_unlock(&d->event_lock);
>  
>      clear_global_virq_handlers(d);
> +
> +    xfree(d->evtchn);
>  }
>  
> 
> diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
> index 0db73c0..ad9d7ef 100644
> --- a/xen/include/xen/sched.h
> +++ b/xen/include/xen/sched.h
> @@ -263,7 +263,7 @@ struct domain
>      spinlock_t       rangesets_lock;
>  
>      /* Event channel information. */
> -    struct evtchn   *evtchn[NR_EVTCHN_BUCKETS];
> +    struct evtchn  **evtchn;
>      spinlock_t       event_lock;
>      struct evtchn_port_ops *evtchn_port_ops;
>  



_______________________________________________
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®.