xen/arm: p2m: apply_p2m_changes: Only load domain P2M when we flush TLBs
authorJulien Grall <julien.grall@linaro.org>
Tue, 22 Apr 2014 13:14:18 +0000 (14:14 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Fri, 2 May 2014 12:14:10 +0000 (13:14 +0100)
apply_p2m_changes needs to switch to another VTTBR temporarily to avoid
flush every TLBs.

As it's only needed there, we can restrict the scope where the VTTBR of this
domain is loaded.

Signed-off-by: Julien Grall <julien.grall@linaro.org>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
xen/arch/arm/p2m.c

index 0730da4b09338296df38009272614d0f544e048e..603c097bd780ad93bba47ce488ed68591a44ed68 100644 (file)
@@ -296,9 +296,6 @@ static int apply_p2m_changes(struct domain *d,
 
     spin_lock(&p2m->lock);
 
-    if ( d != current->domain )
-        p2m_load_VTTBR(d);
-
     addr = start_gpaddr;
     while ( addr < end_gpaddr )
     {
@@ -454,12 +451,17 @@ static int apply_p2m_changes(struct domain *d,
 
     if ( flush )
     {
-        /* At the beginning of the function, Xen is updating VTTBR
-         * with the domain where the mappings are created. In this
-         * case it's only necessary to flush TLBs on every CPUs with
-         * the current VMID (our domain).
+        /* Update the VTTBR if necessary with the domain where mappings
+         * are created. In this case it's only necessary to flush TLBs
+         * on every CPUs with the current VMID (our domain).
          */
+        if ( d != current->domain )
+            p2m_load_VTTBR(d);
+
         flush_tlb();
+
+        if ( d != current->domain )
+            p2m_load_VTTBR(current->domain);
     }
 
     if ( op == ALLOCATE || op == INSERT )
@@ -478,9 +480,6 @@ out:
     if (second) unmap_domain_page(second);
     if (first) unmap_domain_page(first);
 
-    if ( d != current->domain )
-        p2m_load_VTTBR(current->domain);
-
     spin_unlock(&p2m->lock);
 
     return rc;