[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |