[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 1/2] xen/arm: vgic-v3: Delay the initialization of the domain information


I forgot to remove patch from the previous series before sending the new one.

Please ignore that patch. Sorry for the noise.


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@xxxxxxx>
Tested-by: Shameer Kolothum <shameerali.kolothum.thodi@xxxxxxxxxx>
Acked-but-disliked-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>


Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>

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)
-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)

Julien Grall

Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.