Fix the zombie domain when destroying 2.6 linux vmx guest.
The zombie domain is caused by unreleased shadow page
because of lack of put_shadow_ref.
When unshadow a L1 page, set l2e to zero and put ref.
Signed-off-by: <xiaofeng.ling@xxxxxxxxx>
# HG changeset patch
# User Xiaofeng Ling <xiaofeng.ling@xxxxxxxxx>
# Node ID dd78c7cb5cf29510b8651ea9394c9385e291b888
# Parent 27a2cb379c8ffcca77d9ec262d3baf06e7f85175
Fix the zombie domain when destroy 2.6 linux vmx guest.
The zombie domain is caused by unreleased shadow page
because of lack of put_shadow_ref.
When unshadow a L1 page, set l2e to zero and put ref.
Signed-off-by: <xiaofeng.ling@xxxxxxxxx>
diff -r 27a2cb379c8f -r dd78c7cb5cf2 xen/arch/x86/shadow.c
--- a/xen/arch/x86/shadow.c Mon Nov 21 17:06:42 2005 +0100
+++ b/xen/arch/x86/shadow.c Tue Nov 22 09:14:59 2005 +0800
@@ -1536,12 +1536,13 @@
perfc_incr_histo(l1_entries_checked, max_shadow - min_shadow + 1,
PT_UPDATES);
if ( d->arch.ops->guest_paging_levels >= PAGING_L3 &&
unshadow_l1 ) {
- pgentry_64_t l2e = {0};
+ pgentry_64_t l2e;
__shadow_get_l2e(entry->v, entry->va, &l2e);
if ( entry_get_flags(l2e) & _PAGE_PRESENT ) {
- entry_remove_flags(l2e, _PAGE_PRESENT);
+ put_shadow_ref(entry_get_pfn(l2e));
+ l2e = entry_empty();
__shadow_set_l2e(entry->v, entry->va, &l2e);
if (entry->v == current)
diff -r 27a2cb379c8f -r dd78c7cb5cf2 xen/arch/x86/shadow32.c
--- a/xen/arch/x86/shadow32.c Mon Nov 21 17:06:42 2005 +0100
+++ b/xen/arch/x86/shadow32.c Tue Nov 22 09:14:59 2005 +0800
@@ -2426,7 +2426,8 @@
__shadow_get_l2e(entry->v, entry->va, &l2e);
if (l2e_get_flags(l2e) & _PAGE_PRESENT) {
- l2e_remove_flags(l2e, _PAGE_PRESENT);
+ put_shadow_ref(l2e_get_pfn(l2e));
+ l2e = l2e_empty();
__shadow_set_l2e(entry->v, entry->va, l2e);
if (entry->v == current)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|