diff mbox

[Xen-devel,v4,04/21] xen/arm: p2m: apply_p2m_changes: Only load domain P2M when we flush TLBs

Message ID 1398172475-27873-5-git-send-email-julien.grall@linaro.org
State Accepted, archived
Headers show

Commit Message

Julien Grall April 22, 2014, 1:14 p.m. UTC
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>

---
    Changes in v4:
        - Patch added
---
 xen/arch/arm/p2m.c |   19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

Comments

Ian Campbell April 28, 2014, 1:54 p.m. UTC | #1
On Tue, 2014-04-22 at 14:14 +0100, Julien Grall wrote:
> 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>

Athough a flush_tlb_domain(d) type thing might be a nice addition.

> 
> ---
>     Changes in v4:
>         - Patch added
> ---
>  xen/arch/arm/p2m.c |   19 +++++++++----------
>  1 file changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index 0730da4..603c097 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -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;
Julien Grall April 28, 2014, 1:57 p.m. UTC | #2
On 04/28/2014 02:54 PM, Ian Campbell wrote:
> On Tue, 2014-04-22 at 14:14 +0100, Julien Grall wrote:
>> 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>
> 
> Athough a flush_tlb_domain(d) type thing might be a nice addition.

I will add a flush_tlb_domain in the next version of this patch series.

Regards,
diff mbox

Patch

diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
index 0730da4..603c097 100644
--- a/xen/arch/arm/p2m.c
+++ b/xen/arch/arm/p2m.c
@@ -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;