Message ID | 20181001185721.15467-3-julien.grall@arm.com |
---|---|
State | New |
Headers | show |
Series | [Xen-devel,v2,1/2] xen/arm: vgic-v3: Delay the initialization of the domain information | expand |
Hi, I forgot to remove patch from the previous series before sending the new one. Please ignore that patch. Sorry for the noise. Cheers, On 10/01/2018 07:57 PM, Julien Grall wrote: > A follow-up patch will require to know the number of vCPUs when > initializating the vGICv3 domain structure. However this information is > not available at domain creation. This is only known once > XEN_DOMCTL_max_vpus is called for that domain. > > In order to get the max vCPUs around, delay the domain part of the vGIC > v3 initialization until the first vCPU of the domain is initialized. > > Signed-off-by: Julien Grall <julien.grall@arm.com> > Tested-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> > Acked-but-disliked-by: Stefano Stabellini <sstabellini@kernel.org> > > --- > > Cc: Andrew Cooper <andrew.cooper3@citrix.com> > > This is nasty but I can't find a better way for Xen 4.11 and older. We > still need it for unstable because the number of vCPUs is not known in > arch_domain_init. There are discussion to rework the domain creation a > bit further but I would hope to fix the bug first. > > Andrew, I have CCed you to know whether you have a better idea where to > place this call on Xen 4.11 and older. > > Changes in v2: > - The patch is also needed for the time being on unstable > - Add Stefano's recently invented tag > - Add Shameer's tested tag > --- > xen/arch/arm/vgic-v3.c | 29 +++++++++++++++++++++++++++-- > 1 file changed, 27 insertions(+), 2 deletions(-) > > diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c > index 4b42739a52..df1bab3a35 100644 > --- a/xen/arch/arm/vgic-v3.c > +++ b/xen/arch/arm/vgic-v3.c > @@ -1573,9 +1573,11 @@ static const struct mmio_handler_ops vgic_distr_mmio_handler = { > .write = vgic_v3_distr_mmio_write, > }; > > +static int vgic_v3_real_domain_init(struct domain *d); > + > static int vgic_v3_vcpu_init(struct vcpu *v) > { > - int i; > + int i, rc; > paddr_t rdist_base; > struct vgic_rdist_region *region; > unsigned int last_cpu; > @@ -1584,6 +1586,19 @@ static int vgic_v3_vcpu_init(struct vcpu *v) > struct domain *d = v->domain; > > /* > + * This is the earliest place where the number of vCPUs is > + * known. This is required to initialize correctly the vGIC v3 > + * domain structure. We only to do that when vCPU 0 is > + * initilialized. > + */ > + if ( v->vcpu_id == 0 ) > + { > + rc = vgic_v3_real_domain_init(d); > + if ( rc ) > + return rc; > + } > + > + /* > * Find the region where the re-distributor lives. For this purpose, > * we look one region ahead as we have only the first CPU in hand. > */ > @@ -1641,7 +1656,7 @@ static inline unsigned int vgic_v3_rdist_count(struct domain *d) > GUEST_GICV3_RDIST_REGIONS; > } > > -static int vgic_v3_domain_init(struct domain *d) > +static int vgic_v3_real_domain_init(struct domain *d) > { > struct vgic_rdist_region *rdist_regions; > int rdist_count, i, ret; > @@ -1733,6 +1748,16 @@ static int vgic_v3_domain_init(struct domain *d) > return 0; > } > > +static int vgic_v3_domain_init(struct domain *d) > +{ > + /* > + * The domain initialization for vGIC v3 is delayed until the first vCPU > + * is created. This because the initialization may require to know the > + * number of vCPUs that is not known when creating the domain. > + */ > + return 0; > +} > + > static void vgic_v3_domain_free(struct domain *d) > { > vgic_v3_its_free_domain(d); >
diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index 4b42739a52..df1bab3a35 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -1573,9 +1573,11 @@ static const struct mmio_handler_ops vgic_distr_mmio_handler = { .write = vgic_v3_distr_mmio_write, }; +static int vgic_v3_real_domain_init(struct domain *d); + static int vgic_v3_vcpu_init(struct vcpu *v) { - int i; + int i, rc; paddr_t rdist_base; struct vgic_rdist_region *region; unsigned int last_cpu; @@ -1584,6 +1586,19 @@ static int vgic_v3_vcpu_init(struct vcpu *v) struct domain *d = v->domain; /* + * This is the earliest place where the number of vCPUs is + * known. This is required to initialize correctly the vGIC v3 + * domain structure. We only to do that when vCPU 0 is + * initilialized. + */ + if ( v->vcpu_id == 0 ) + { + rc = vgic_v3_real_domain_init(d); + if ( rc ) + return rc; + } + + /* * Find the region where the re-distributor lives. For this purpose, * we look one region ahead as we have only the first CPU in hand. */ @@ -1641,7 +1656,7 @@ static inline unsigned int vgic_v3_rdist_count(struct domain *d) GUEST_GICV3_RDIST_REGIONS; } -static int vgic_v3_domain_init(struct domain *d) +static int vgic_v3_real_domain_init(struct domain *d) { struct vgic_rdist_region *rdist_regions; int rdist_count, i, ret; @@ -1733,6 +1748,16 @@ static int vgic_v3_domain_init(struct domain *d) return 0; } +static int vgic_v3_domain_init(struct domain *d) +{ + /* + * The domain initialization for vGIC v3 is delayed until the first vCPU + * is created. This because the initialization may require to know the + * number of vCPUs that is not known when creating the domain. + */ + return 0; +} + static void vgic_v3_domain_free(struct domain *d) { vgic_v3_its_free_domain(d);