Skip to contentSkip to conversation

nestedhvm: reduce IPIs with nested-on-nested

PATCH In review Christoph Egger 2 participants 2 messages Aug 18, 2011

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 nestedhvm: reduce IPIs with nested-on-nested

In p2m_get_nestedp2m() there is no need to send IPIs via nestedhvm_vmcx_flushtlb() since p2m_flush_table() already did that.

Stop sending IPIs to flush the nested-on-nested pagetable after write operations. Instead flush the TLB only. This fixes an endless loop of nested page faults after adding an entry to the nested-on-nested pagetable.

Signature · 6 lines
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632
xen/arch/x86/mm/hap/nested_hap.c +4 -2
diff -r ce4768a78051 xen/arch/x86/mm/hap/nested_hap.c
@@ -86,8 +86,10 @@ nestedp2m_write_p2m_entry(struct p2m_dom
 
     old_flags = l1e_get_flags(*p);
     safe_write_pte(p, new);
-    if (old_flags & _PAGE_PRESENT)
-        nestedhvm_vmcx_flushtlb(p2m);
+
+    if ( (old_flags & _PAGE_PRESENT)
+         && (level == 1 || (level == 2 && (old_flags & _PAGE_PSE))) )
+            flush_tlb_mask(&p2m->p2m_dirty_cpumask);
     
     paging_unlock(d);
 }
xen/arch/x86/mm/p2m.c +0 -1
diff -r ce4768a78051 xen/arch/x86/mm/p2m.c
@@ -1164,7 +1164,6 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
     p2m->cr3 = cr3;
     nv->nv_flushp2m = 0;
     hvm_asid_flush_vcpu(v);
-    nestedhvm_vmcx_flushtlb(p2m);
     cpu_set(v->processor, p2m->p2m_dirty_cpumask);
     p2m_unlock(p2m);
     nestedp2m_unlock(d);

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#1 lore raw

Hi,

xen/arch/x86/mm/hap/nested_hap.c nestedp2m_write_p2m_entry(struct p2m_dom · line 92

Quoted 12 lines · Christoph Egger
xen/arch/x86/mm/hap/nested_hap.c +4 -2
@@ -86,8 +86,10 @@ nestedp2m_write_p2m_entry(struct p2m_dom
 
     old_flags = l1e_get_flags(*p);
     safe_write_pte(p, new);
-    if (old_flags & _PAGE_PRESENT)
-        nestedhvm_vmcx_flushtlb(p2m);
+
+    if ( (old_flags & _PAGE_PRESENT)
+         && (level == 1 || (level == 2 && (old_flags & _PAGE_PSE))) )
+            flush_tlb_mask(&p2m->p2m_dirty_cpumask);

I think you need to flush on all levels, since the TLB can contain partial walks.

xen/arch/x86/mm/p2m.c p2m_get_nestedp2m(struct vcpu *v, uint64 · line 1167

Quoted 11 lines
xen/arch/x86/mm/hap/nested_hap.c +0 -0
     paging_unlock(d);
 }
 

diff -r ce4768a78051 xen/arch/x86/mm/p2m.c

xen/arch/x86/mm/p2m.c +0 -1
@@ -1164,7 +1164,6 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
     p2m->cr3 = cr3;
     nv->nv_flushp2m = 0;
     hvm_asid_flush_vcpu(v);
-    nestedhvm_vmcx_flushtlb(p2m);

This is an unrelated fix and should be in a separate patch.

Cheers,

Tim.

Signature · 3 lines
Tim Deegan <[email protected]>
Principal Software Engineer, Xen Platform Team
Citrix Systems UK Ltd.  (Company #02937203, SL9 0BG)