Fix the issue of system crash in vmx stress test.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sat, 14 Jan 2006 09:35:39 +0000 (10:35 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sat, 14 Jan 2006 09:35:39 +0000 (10:35 +0100)
There is a path that shadow L2 table is assigned
after it is unshadowed in stress test.

Signed-off-by: Xiaofeng Ling <xiaofeng.ling@intel.com>
xen/arch/x86/shadow.c
xen/arch/x86/shadow32.c

index b2fd143452408c3b8d2aace354166e4c16b16f49..6ae54e208a20d8494440d7eee4adabb80cb2f3db 100644 (file)
@@ -2138,6 +2138,7 @@ static void shadow_update_pagetables(struct vcpu *v)
 #if CONFIG_PAGING_LEVELS == 2
     unsigned long hl2mfn;
 #endif
+    int need_sync = 0;
 
     int max_mode = ( shadow_mode_external(d) ? SHM_external
                      : shadow_mode_translate(d) ? SHM_translate
@@ -2169,8 +2170,17 @@ static void shadow_update_pagetables(struct vcpu *v)
 #elif CONFIG_PAGING_LEVELS == 4
         smfn = shadow_l4_table(d, gpfn, gmfn);
 #endif
-    }else
-        shadow_sync_all(d);
+    }
+    else
+    {
+        /*
+         *  move sync later in order to avoid this smfn been 
+         *  unshadowed occasionally
+         */
+        need_sync = 1;
+    }
+
+
     if ( !get_shadow_ref(smfn) )
         BUG();
     old_smfn = pagetable_get_pfn(v->arch.shadow_table);
@@ -2241,6 +2251,9 @@ static void shadow_update_pagetables(struct vcpu *v)
     }
 #endif /* CONFIG_PAGING_LEVELS == 2 */
 
+    if(likely(need_sync))
+        shadow_sync_all(d);
+
 #if CONFIG_PAGING_LEVELS == 3
     /* FIXME: PAE code to be written */
 #endif
index eb09ea92c557fc3df6384e804b848d9ae49bca4d..a36238b3d8c900ef63eb366784026d478ee4bd3d 100644 (file)
@@ -2896,6 +2896,7 @@ void __update_pagetables(struct vcpu *v)
     unsigned long gmfn = pagetable_get_pfn(v->arch.guest_table);
     unsigned long gpfn = __mfn_to_gpfn(d, gmfn);
     unsigned long smfn, hl2mfn, old_smfn;
+    int need_sync = 0;
 
     int max_mode = ( shadow_mode_external(d) ? SHM_external
                      : shadow_mode_translate(d) ? SHM_translate
@@ -2921,7 +2922,13 @@ void __update_pagetables(struct vcpu *v)
     if ( unlikely(!(smfn = __shadow_status(d, gpfn, PGT_base_page_table))) )
         smfn = shadow_l2_table(d, gpfn, gmfn);
     else
-        shadow_sync_all(d);
+    {
+        /*
+         *  move sync later in order to avoid this smfn been 
+         *  unshadowed occasionally
+         */
+        need_sync = 1;
+    }
     if ( !get_shadow_ref(smfn) )
         BUG();
     old_smfn = pagetable_get_pfn(v->arch.shadow_table);
@@ -2985,6 +2992,9 @@ void __update_pagetables(struct vcpu *v)
         // XXX - maybe this can be optimized somewhat??
         local_flush_tlb();
     }
+
+    if(likely(need_sync))
+        shadow_sync_all(d);
 }
 
 void clear_all_shadow_status(struct domain *d)