[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/3] xen/arm: vgic-v3: Don't create empty re-distributor regions
On Tue, 4 Sep 2018, Julien Grall wrote: > At the moment, Xen is assuming the hardware domain will have the same > number of re-distributor regions as the host. However, as the > number of CPUs or the stride (e.g on GICv4) may be different we end up > exposing regions which does not contain any re-distributors. > > When booting, Linux will go through all the re-distributor region to > check whether a property (e.g vPLIs) is available accross all the > re-distributors. This will result to a data abort on empty regions > because there are no underlying re-distributor. > > So we need to limit the number of regions exposed to the hardware > domain. The code reworked to only expose the minimun number of regions > required by the hardware domain. It is assumed the regions will be > populated starting from the first one. I have a question: given that it is possible for a rdist_region to cover more than 1 cpu, could we get into troubles if the last rdist_region of the hardware_domain covers 2 cpus, but actually dom0 only has 1 vcpu? get_vcpu_from_rdist would return NULL and vgic_v3_rdistr_mmio_read/write would return 0. This case seems to be handled correctly but I wanted to double check. I think we also need to fix vgic_v3_rdist_count? Today it just returns vgic_v3_hw.nr_rdist_regions for dom0. It would be bad if we left it unfixed? If we do that, we might be able to get rid of the modifications to vgic_v3_real_domain_init. > Reported-by: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@xxxxxxxxxx> > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> > --- > xen/arch/arm/gic-v3.c | 10 ++++++++-- > xen/arch/arm/vgic-v3.c | 11 +++++++++++ > 2 files changed, 19 insertions(+), 2 deletions(-) > > diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c > index b2ed0f8b55..4a984cfb12 100644 > --- a/xen/arch/arm/gic-v3.c > +++ b/xen/arch/arm/gic-v3.c > @@ -1274,8 +1274,10 @@ static int gicv3_make_hwdom_dt_node(const struct > domain *d, > * GIC has two memory regions: Distributor + rdist regions > * CPU interface and virtual cpu interfaces accessesed as System > registers > * So cells are created only for Distributor and rdist regions > + * The hardware domain may not used all the regions. So only copy > + * what is necessary. > */ > - new_len = new_len * (gicv3.rdist_count + 1); > + new_len = new_len * (d->arch.vgic.nr_regions + 1); Do we also need to fix "#redistributor-regions" just above? > hw_reg = dt_get_property(gic, "reg", &len); > if ( !hw_reg ) > @@ -1503,7 +1505,11 @@ static int gicv3_make_hwdom_madt(const struct domain > *d, u32 offset) > > /* Add Generic Redistributor */ > size = sizeof(struct acpi_madt_generic_redistributor); > - for ( i = 0; i < gicv3.rdist_count; i++ ) > + /* > + * The hardware domain may not used all the regions. So only copy ^ use > + * what is necessary. > + */ > + for ( i = 0; i < d->arch.vgic.nr_regions; i++ ) > { > gicr = (struct acpi_madt_generic_redistributor *)(base_ptr + > table_len); > gicr->header.type = ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR; > > diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c > index df1bab3a35..9f729862da 100644 > --- a/xen/arch/arm/vgic-v3.c > +++ b/xen/arch/arm/vgic-v3.c > @@ -1695,8 +1695,19 @@ static int vgic_v3_real_domain_init(struct domain *d) > d->arch.vgic.rdist_regions[i].first_cpu = first_cpu; > > first_cpu += size / GICV3_GICR_SIZE; > + > + if ( first_cpu >= d->max_vcpus ) > + break; This is just a matter of code style and preferences, but I would prefer if the termination condition was at the top as part of the for statement. Of course, it works regardless, so the patch would be OK either way. > } > > + /* > + * The hardware domain may not used all the re-distributors ^ use > + * regions (e.g when the number of vCPUs does not match the > + * number of pCPUs). Update the number of regions to avoid > + * exposing unused region as they will not get emulated. ^ regions > + */ > + d->arch.vgic.nr_regions = i + 1; > d->arch.vgic.intid_bits = vgic_v3_hw.intid_bits; > } > else _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |