[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH 2/3] xen/arm: Defer GICv2 CPU interface mapping until the first access
Hi Michal, > -----Original Message----- > From: Michal Orzel <michal.orzel@xxxxxxx> > Subject: Re: [PATCH 2/3] xen/arm: Defer GICv2 CPU interface mapping until > the first access > > Hi Henry, > > On 16/01/2023 02:58, Henry Wang wrote: > > Note that GICv2 changes introduced by this patch is not applied to the > > "New vGIC" implementation, as the "New vGIC" is not used. Also since > The fact that "New vGIC" is not used very often and its work is in-progress > does not mean that we can implement changes resulting in a build failure > when enabling CONFIG_NEW_VGIC, which is the case with your patch. > So this needs to be fixed. I will add the "New vGIC" changes in v2. > > > @@ -153,6 +153,8 @@ struct vgic_dist { > > /* Base address for guest GIC */ > > paddr_t dbase; /* Distributor base address */ > > paddr_t cbase; /* CPU interface base address */ > > + paddr_t csize; /* CPU interface size */ > > + paddr_t vbase; /* virtual CPU interface base address */ > Could you swap them so that base address variables are grouped? Sure, my original thought was grouping the CPU interface related fields but since you prefer grouping the base address, I will follow your suggestion. > > > #ifdef CONFIG_GICV3 > > /* GIC V3 addressing */ > > /* List of contiguous occupied by the redistributors */ > > diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c > > index 061c92acbd..d98f166050 100644 > > --- a/xen/arch/arm/traps.c > > +++ b/xen/arch/arm/traps.c > > @@ -1787,9 +1787,12 @@ static inline bool hpfar_is_valid(bool s1ptw, > uint8_t fsc) > > } > > > > /* > > - * When using ACPI, most of the MMIO regions will be mapped on- > demand > > - * in stage-2 page tables for the hardware domain because Xen is not > > - * able to know from the EFI memory map the MMIO regions. > > + * Try to map the MMIO regions for some special cases: > > + * 1. When using ACPI, most of the MMIO regions will be mapped on- > demand > > + * in stage-2 page tables for the hardware domain because Xen is not > > + * able to know from the EFI memory map the MMIO regions. > > + * 2. For guests using GICv2, the GICv2 CPU interface mapping is created > > + * on the first access of the MMIO region. > > */ > > static bool try_map_mmio(gfn_t gfn) > > { > > @@ -1798,6 +1801,16 @@ static bool try_map_mmio(gfn_t gfn) > > /* For the hardware domain, all MMIOs are mapped with GFN == MFN > */ > > mfn_t mfn = _mfn(gfn_x(gfn)); > > > > + /* > > + * Map the GICv2 virtual cpu interface in the gic cpu interface > NIT: in all the other places you use CPU (capital letters) Oh good catch, thank you. I think this part is the same as the original in-code comment, but since I am touching this part anyway, it would be good to correct them. > > > + * region of the guest on the first access of the MMIO region. > > + */ > > + if ( d->arch.vgic.version == GIC_V2 && > > + gfn_x(gfn) == gfn_x(gaddr_to_gfn(d->arch.vgic.cbase)) ) > There is a macro gnf_eq that you can use to avoid opencoding it. Thanks! I will fix in v2. > > > + return !map_mmio_regions(d, gaddr_to_gfn(d->arch.vgic.cbase), > At this point you can use just gfn instead of gaddr_to_gfn(d->arch.vgic.cbase) Will fix in v2. > > > + d->arch.vgic.csize / PAGE_SIZE, > > + maddr_to_mfn(d->arch.vgic.vbase)); > > + > > /* > > * Device-Tree should already have everything mapped when building > > * the hardware domain. > > diff --git a/xen/arch/arm/vgic-v2.c b/xen/arch/arm/vgic-v2.c > > index 0026cb4360..21e14a5a6f 100644 > > --- a/xen/arch/arm/vgic-v2.c > > +++ b/xen/arch/arm/vgic-v2.c > > @@ -644,10 +644,6 @@ static int vgic_v2_vcpu_init(struct vcpu *v) > > > > static int vgic_v2_domain_init(struct domain *d) > > { > > - int ret; > > - paddr_t csize; > > - paddr_t vbase; > > - > > /* > > * The hardware domain and direct-mapped domain both get the > hardware > > * address. > > @@ -667,8 +663,8 @@ static int vgic_v2_domain_init(struct domain *d) > > * aligned to PAGE_SIZE. > > */ > > d->arch.vgic.cbase = vgic_v2_hw.cbase; > > - csize = vgic_v2_hw.csize; > > - vbase = vgic_v2_hw.vbase; > > + d->arch.vgic.csize = vgic_v2_hw.csize; > > + d->arch.vgic.vbase = vgic_v2_hw.vbase; > > } > > else if ( is_domain_direct_mapped(d) ) > > { > > @@ -683,8 +679,8 @@ static int vgic_v2_domain_init(struct domain *d) > > */ > > d->arch.vgic.dbase = vgic_v2_hw.dbase; > > d->arch.vgic.cbase = vgic_v2_hw.cbase; > > - csize = GUEST_GICC_SIZE; > > - vbase = vgic_v2_hw.vbase + vgic_v2_hw.aliased_offset; > > + d->arch.vgic.csize = GUEST_GICC_SIZE; > > + d->arch.vgic.vbase = vgic_v2_hw.vbase + vgic_v2_hw.aliased_offset; > > } > > else > > { > > @@ -697,19 +693,10 @@ static int vgic_v2_domain_init(struct domain *d) > > */ > > BUILD_BUG_ON(GUEST_GICC_SIZE != SZ_8K); > > d->arch.vgic.cbase = GUEST_GICC_BASE; > > - csize = GUEST_GICC_SIZE; > > - vbase = vgic_v2_hw.vbase + vgic_v2_hw.aliased_offset; > > + d->arch.vgic.csize = GUEST_GICC_SIZE; > > + d->arch.vgic.vbase = vgic_v2_hw.vbase + vgic_v2_hw.aliased_offset; > > } > > > > - /* > > - * Map the gic virtual cpu interface in the gic cpu interface > > - * region of the guest. > > - */ > > - ret = map_mmio_regions(d, gaddr_to_gfn(d->arch.vgic.cbase), > > - csize / PAGE_SIZE, maddr_to_mfn(vbase)); > > - if ( ret ) > > - return ret; > > - > Maybe adding some comment like "Mapping of the virtual CPU interface is > deferred until first access" > would be helpful. Sure, I will add the comment in v2. Kind regards, Henry > > ~Michal
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |