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

Re: [Xen-devel] [PATCH v3 11/24] xen/arm: Let the toolstack configure the number of SPIs



On Tue, 13 Jan 2015, Julien Grall wrote:
> Each domain may have a different number of IRQs depending on the devices
> assigned to it.
> 
> Rather re-using the number of IRQs used by the hardwared GIC, let the
> toolstack specify the number of SPIs when the domain is created. This
> will avoid to waste memory.
> 
> To calculate the number of SPIs, we assume that any IRQ given via the option
> "irqs=" in xl is mapped 1:1 to the guest.
> 
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Jan Beulich <jbeulich@xxxxxxxx>
> Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
> 
> ---
>     Changes in v3:
>         - Fix typoes
>         - A separate has been created to extend the DOMCTL create domain
> 
>     Changes in v2:
>         - Patch added
> ---
>  tools/libxc/xc_domain.c       |  1 +
>  tools/libxl/libxl_arm.c       | 19 +++++++++++++++++++
>  xen/arch/arm/domain.c         |  7 ++++++-
>  xen/arch/arm/setup.c          |  1 +
>  xen/arch/arm/vgic.c           | 10 +++++-----
>  xen/include/asm-arm/domain.h  |  2 ++
>  xen/include/asm-arm/setup.h   |  1 +
>  xen/include/asm-arm/vgic.h    |  2 +-
>  xen/include/public/arch-arm.h |  2 ++
>  9 files changed, 38 insertions(+), 7 deletions(-)
> 
> diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
> index eebc121..eb066cf 100644
> --- a/tools/libxc/xc_domain.c
> +++ b/tools/libxc/xc_domain.c
> @@ -67,6 +67,7 @@ int xc_domain_create(xc_interface *xch,
>      /* No arch-specific configuration for now */
>  #elif defined (__arm__) || defined(__aarch64__)
>      config.gic_version = XEN_DOMCTL_CONFIG_GIC_DEFAULT;
> +    config.nr_spis = 0;
>  #else
>      errno = ENOSYS;
>      return -1;
> diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c
> index cddce6e..53177eb 100644
> --- a/tools/libxl/libxl_arm.c
> +++ b/tools/libxl/libxl_arm.c
> @@ -39,6 +39,25 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc,
>                                        libxl_domain_config *d_config,
>                                        xc_domain_configuration_t *xc_config)
>  {
> +    uint32_t nr_spis = 0;
> +    unsigned int i;
> +
> +    for (i = 0; i < d_config->b_info.num_irqs; i++) {
> +        int irq = d_config->b_info.irqs[i];

unsigned int

> +        int spi = irq - 32;

unsigned int


> +        if (irq < 32)
> +            continue;
> +
> +        if (nr_spis <= spi)
> +            nr_spis = spi + 1;

overflow check?


> +    }
> +
> +    LOG(DEBUG, "Configure the domain");
> +
> +    xc_config->nr_spis = nr_spis;
> +    LOG(DEBUG, " - Allocate %u SPIs", nr_spis);
> +
>      xc_config->gic_version = XEN_DOMCTL_CONFIG_GIC_DEFAULT;
>  
>      return 0;
> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
> index 2473b10..6e56665 100644
> --- a/xen/arch/arm/domain.c
> +++ b/xen/arch/arm/domain.c
> @@ -560,10 +560,15 @@ int arch_domain_create(struct domain *d, unsigned int 
> domcr_flags,
>      }
>      config->gic_version = gic_version;
>  
> +    /* Sanity check on the number of SPIs */
> +    rc = -EINVAL;
> +    if ( config->nr_spis > (gic_number_lines() - 32) )
> +        goto fail;
> +
>      if ( (rc = gicv_setup(d)) != 0 )
>          goto fail;
>  
> -    if ( (rc = domain_vgic_init(d)) != 0 )
> +    if ( (rc = domain_vgic_init(d, config->nr_spis)) != 0 )
>          goto fail;
>  
>      if ( (rc = domain_vtimer_init(d)) != 0 )
> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index 18227f6..b28a708 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -815,6 +815,7 @@ void __init start_xen(unsigned long boot_phys_offset,
>      /* Create initial domain 0. */
>      /* The vGIC for DOM0 is exactly emulated the hardware GIC */
>      config.gic_version = XEN_DOMCTL_CONFIG_GIC_DEFAULT;
> +    config.nr_spis = gic_number_lines() - 32;
>  
>      dom0 = domain_create(0, 0, 0, &config);
>      if ( IS_ERR(dom0) || (alloc_dom0_vcpu0(dom0) == NULL) )
> diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c
> index c915670..fc8a270 100644
> --- a/xen/arch/arm/vgic.c
> +++ b/xen/arch/arm/vgic.c
> @@ -67,16 +67,16 @@ static void vgic_init_pending_irq(struct pending_irq *p, 
> unsigned int virq)
>      p->irq = virq;
>  }
>  
> -int domain_vgic_init(struct domain *d)
> +int domain_vgic_init(struct domain *d, unsigned int nr_spis)
>  {
>      int i;
>  
>      d->arch.vgic.ctlr = 0;
>  
> -    if ( is_hardware_domain(d) )
> -        d->arch.vgic.nr_spis = gic_number_lines() - 32;
> -    else
> -        d->arch.vgic.nr_spis = 0; /* We don't need SPIs for the guest */
> +    /* The number of SPIs has to be aligned to 32 see
> +     * GICD_TYPER.ITLinesNumber definition
> +     */
> +    d->arch.vgic.nr_spis = ROUNDUP(nr_spis, 32);
>  
>      switch ( gic_hw_version() )
>      {
> diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h
> index d302fc9..101b4e9 100644
> --- a/xen/include/asm-arm/domain.h
> +++ b/xen/include/asm-arm/domain.h
> @@ -121,6 +121,8 @@ struct arch_domain
>      unsigned int evtchn_irq;
>  }  __cacheline_aligned;
>  
> +#define domain_is_configured(d) ((d)->arch.is_configured)

This is unused. Moreover it cannot find "is_configured" anywhere.


>  struct arch_vcpu
>  {
>      struct {
> diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
> index ba5a67d..254cc17 100644
> --- a/xen/include/asm-arm/setup.h
> +++ b/xen/include/asm-arm/setup.h
> @@ -54,6 +54,7 @@ void copy_from_paddr(void *dst, paddr_t paddr, unsigned 
> long len);
>  void arch_get_xen_caps(xen_capabilities_info_t *info);
>  
>  int construct_dom0(struct domain *d);
> +int configure_dom0(struct domain *d);
>  
>  void discard_initial_modules(void);
>  
> diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h
> index 1cd7808..e97a5eb 100644
> --- a/xen/include/asm-arm/vgic.h
> +++ b/xen/include/asm-arm/vgic.h
> @@ -177,7 +177,7 @@ enum gic_sgi_mode;
>  
>  #define vgic_num_irqs(d)        ((d)->arch.vgic.nr_spis + 32)
>  
> -extern int domain_vgic_init(struct domain *d);
> +extern int domain_vgic_init(struct domain *d, unsigned int nr_spis);
>  extern void domain_vgic_free(struct domain *d);
>  extern int vcpu_vgic_init(struct vcpu *v);
>  extern struct vcpu *vgic_get_target_vcpu(struct vcpu *v, unsigned int irq);
> diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h
> index 4c1b9f9..45d3b1f 100644
> --- a/xen/include/public/arch-arm.h
> +++ b/xen/include/public/arch-arm.h
> @@ -320,6 +320,8 @@ typedef uint64_t xen_callback_t;
>  struct xen_arch_domainconfig {
>      /* IN/OUT */
>      uint8_t gic_version;
> +    /* IN */
> +    uint32_t nr_spis;
>  };
>  
>  #endif
> -- 
> 2.1.4
> 

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