|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 2/2] xen/arm: vgic-v3: Don't create empty re-distributor regions
On Mon, 1 Oct 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.
>
> Lastly, rename vgic_v3_rdist_count to reflect the value return by the
> helper.
>
> Reported-by: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@xxxxxxxxxx>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
> Tested-by: Shameer Kolothum <shameerali.kolothum.thodi@xxxxxxxxxx>
>
> ---
> Changes in v2:
> - Rename vgic_v3_rdist_count to vgic_v3_max_rdist_count
> - Fixup #re-distributors
> - Fix typoes
> - Add Shameer's tested tag
> ---
> xen/arch/arm/gic-v3.c | 14 +++++++++++---
> xen/arch/arm/vgic-v3.c | 21 ++++++++++++++++++---
> 2 files changed, 29 insertions(+), 6 deletions(-)
>
> diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c
> index c98a163ee7..2c1454f425 100644
> --- a/xen/arch/arm/gic-v3.c
> +++ b/xen/arch/arm/gic-v3.c
> @@ -1265,7 +1265,8 @@ static int gicv3_make_hwdom_dt_node(const struct domain
> *d,
> if ( res )
> return res;
>
> - res = fdt_property_cell(fdt, "#redistributor-regions",
> gicv3.rdist_count);
> + res = fdt_property_cell(fdt, "#redistributor-regions",
> + d->arch.vgic.nr_regions);
> if ( res )
> return res;
>
> @@ -1274,8 +1275,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 use 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);
>
> hw_reg = dt_get_property(gic, "reg", &len);
> if ( !hw_reg )
> @@ -1466,6 +1469,7 @@ static inline bool gic_dist_supports_dvis(void)
> }
>
> static int gicv3_make_hwdom_madt(const struct domain *d, u32 offset)
> +
> {
Aside from this spurious change, the patch is OK. Provided you remove
the blank on commit:
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> struct acpi_subtable_header *header;
> struct acpi_madt_generic_interrupt *host_gicc, *gicc;
> @@ -1503,7 +1507,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
> + * 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..efe824c6fb 100644
> --- a/xen/arch/arm/vgic-v3.c
> +++ b/xen/arch/arm/vgic-v3.c
> @@ -1640,7 +1640,11 @@ static int vgic_v3_vcpu_init(struct vcpu *v)
> return 0;
> }
>
> -static inline unsigned int vgic_v3_rdist_count(struct domain *d)
> +/*
> + * Return the maximum number possible of re-distributor regions for
> + * a given domain.
> + */
> +static inline unsigned int vgic_v3_max_rdist_count(struct domain *d)
> {
> /*
> * Normally there is only one GICv3 redistributor region.
> @@ -1662,7 +1666,7 @@ static int vgic_v3_real_domain_init(struct domain *d)
> int rdist_count, i, ret;
>
> /* Allocate memory for Re-distributor regions */
> - rdist_count = vgic_v3_rdist_count(d);
> + rdist_count = vgic_v3_max_rdist_count(d);
>
> rdist_regions = xzalloc_array(struct vgic_rdist_region, rdist_count);
> if ( !rdist_regions )
> @@ -1695,8 +1699,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;
> }
>
> + /*
> + * The hardware domain may not use all the re-distributors
> + * 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.
> + */
> + d->arch.vgic.nr_regions = i + 1;
> +
> d->arch.vgic.intid_bits = vgic_v3_hw.intid_bits;
> }
> else
> @@ -1825,7 +1840,7 @@ int vgic_v3_init(struct domain *d, int *mmio_count)
> }
>
> /* GICD region + number of Redistributors */
> - *mmio_count = vgic_v3_rdist_count(d) + 1;
> + *mmio_count = vgic_v3_max_rdist_count(d) + 1;
>
> /* one region per ITS */
> *mmio_count += vgic_v3_its_count(d);
> --
> 2.11.0
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |