WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [IA64] Fix SMP-unsafe with XENMEM_add_to_

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] Fix SMP-unsafe with XENMEM_add_to_physmap on HVM
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 11 Aug 2008 05:50:11 -0700
Delivery-date: Mon, 11 Aug 2008 05:50:04 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
# Date 1215484903 -32400
# Node ID eb0fc71cfc72ed15ed35fa17617b7cab32164029
# Parent  00721ef8d8ef3fee031faf974682ba91c5d67ef6
[IA64] Fix SMP-unsafe with XENMEM_add_to_physmap on HVM

XENMEM_add_to_physmap hypercall on HVM is SMP-unsafe
and may cause a xen crash.
Actually I've met:

(XEN) ia64_fault, vector=0x18, ifa=0xe0000165c98814f0, iip=0xf0000000040a1b80, 
ipsr=0x0000121008226010, isr=0x0000008000000030
(XEN) General Exception: IA-64 Reserved Register/Field fault (data access).
...
(XEN) ****************************************
(XEN) Panic on CPU 2:
(XEN) Fault in Xen.
(XEN) ****************************************

This patch fixes it.

Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
---
 xen/arch/ia64/vmx/vtlb.c    |   24 ++++++++++++++++++++++
 xen/arch/ia64/xen/vhpt.c    |   48 +++++++++++++++++++++-----------------------
 xen/include/asm-ia64/vmmu.h |    1 
 3 files changed, 48 insertions(+), 25 deletions(-)

diff -r 00721ef8d8ef -r eb0fc71cfc72 xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Mon Jul 07 10:54:16 2008 +0900
+++ b/xen/arch/ia64/vmx/vtlb.c  Tue Jul 08 11:41:43 2008 +0900
@@ -623,6 +623,30 @@ void thash_purge_all(VCPU *v)
     local_flush_tlb_all();
 }
 
+static void __thash_purge_all(void *arg)
+{
+    struct vcpu *v = arg;
+
+    BUG_ON(vcpu_runnable(v) || v->is_running);
+    thash_purge_all(v);
+}
+
+void vmx_vcpu_flush_vtlb_all(VCPU *v)
+{
+    if (v == current) {
+        thash_purge_all(v);
+        return;
+    }
+
+    /* SMP safe */
+    vcpu_pause(v);
+    if (v->processor == smp_processor_id())
+        __thash_purge_all(v);
+    else
+        smp_call_function_single(v->processor, __thash_purge_all, v, 1, 1);
+    vcpu_unpause(v);
+}
+
 
 /*
  * Lookup the hash table and its collision chain to find an entry
diff -r 00721ef8d8ef -r eb0fc71cfc72 xen/arch/ia64/xen/vhpt.c
--- a/xen/arch/ia64/xen/vhpt.c  Mon Jul 07 10:54:16 2008 +0900
+++ b/xen/arch/ia64/xen/vhpt.c  Tue Jul 08 11:41:43 2008 +0900
@@ -249,31 +249,20 @@ domain_purge_swtc_entries_vcpu_dirty_mas
 // (e.g. vcpu == current), smp_mb() is unnecessary.
 void vcpu_flush_vtlb_all(struct vcpu *v)
 {
-       if (VMX_DOMAIN(v)) {
-               /* This code may be call for remapping shared_info and
-                  grant_table share page from guest_physmap_remove_page()
-                  in arch_memory_op() XENMEM_add_to_physmap to realize
-                  PV-on-HVM feature. */
-               /* FIXME: This is not SMP-safe yet about p2m table */
-               /* Purge vTLB for VT-i domain */
-               thash_purge_all(v);
-       }
-       else {
-               /* First VCPU tlb.  */
-               vcpu_purge_tr_entry(&PSCBX(v,dtlb));
-               vcpu_purge_tr_entry(&PSCBX(v,itlb));
-               smp_mb();
-
-               /* Then VHPT.  */
-               if (HAS_PERVCPU_VHPT(v->domain))
-                       vcpu_vhpt_flush(v);
-               else
-                       local_vhpt_flush();
-               smp_mb();
-
-               /* Then mTLB.  */
-               local_flush_tlb_all();
-       }
+       /* First VCPU tlb.  */
+       vcpu_purge_tr_entry(&PSCBX(v,dtlb));
+       vcpu_purge_tr_entry(&PSCBX(v,itlb));
+       smp_mb();
+
+       /* Then VHPT.  */
+       if (HAS_PERVCPU_VHPT(v->domain))
+               vcpu_vhpt_flush(v);
+       else
+               local_vhpt_flush();
+       smp_mb();
+
+       /* Then mTLB.  */
+       local_flush_tlb_all();
 
        /* We could clear bit in d->domain_dirty_cpumask only if domain d in
           not running on this processor.  There is currently no easy way to
@@ -296,6 +285,15 @@ void domain_flush_vtlb_all(struct domain
        for_each_vcpu(d, v) {
                if (!v->is_initialised)
                        continue;
+
+               if (VMX_DOMAIN(v)) {
+                       // This code may be called for remapping shared_info
+                       // and grant_table from guest_physmap_remove_page()
+                       // in arch_memory_op() XENMEM_add_to_physmap to realize
+                       // PV-on-HVM feature.
+                       vmx_vcpu_flush_vtlb_all(v);
+                       continue;
+               }
 
                if (v->processor == cpu)
                        vcpu_flush_vtlb_all(v);
diff -r 00721ef8d8ef -r eb0fc71cfc72 xen/include/asm-ia64/vmmu.h
--- a/xen/include/asm-ia64/vmmu.h       Mon Jul 07 10:54:16 2008 +0900
+++ b/xen/include/asm-ia64/vmmu.h       Tue Jul 08 11:41:43 2008 +0900
@@ -175,6 +175,7 @@ extern int thash_purge_and_insert(struct
  *
  */
 extern void thash_purge_all(struct vcpu *v);
+extern void vmx_vcpu_flush_vtlb_all(struct vcpu *v);
 
 /*
  * Lookup the hash table and its collision chain to find an entry

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [IA64] Fix SMP-unsafe with XENMEM_add_to_physmap on HVM, Xen patchbot-unstable <=