aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-09-28 14:07:25 +0100
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-09-28 14:07:25 +0100
commit82c66523be98425df658f4acf77c8cba355ba3e4 (patch)
tree6ed141e116df6a0a42697f4c32779a0c4e0fee88
parentba17dc3655b24a15328394719a1b2fa73b179743 (diff)
downloadxen-82c66523be98425df658f4acf77c8cba355ba3e4.tar.gz
xen-82c66523be98425df658f4acf77c8cba355ba3e4.tar.bz2
xen-82c66523be98425df658f4acf77c8cba355ba3e4.zip
imported patch ../tmp/fix_free_monitor_pagetable.patch
-rw-r--r--xen/arch/x86/shadow32.c8
-rw-r--r--xen/arch/x86/shadow_public.c20
2 files changed, 19 insertions, 9 deletions
diff --git a/xen/arch/x86/shadow32.c b/xen/arch/x86/shadow32.c
index 796767132c..4b2a417c25 100644
--- a/xen/arch/x86/shadow32.c
+++ b/xen/arch/x86/shadow32.c
@@ -755,9 +755,13 @@ void free_monitor_pagetable(struct vcpu *v)
/*
* Then free monitor_table.
+ * Note: for VMX guest, only BSP need do this free.
*/
- mfn = pagetable_get_pfn(v->arch.monitor_table);
- free_domheap_page(&frame_table[mfn]);
+ if (!(VMX_DOMAIN(v) && v->vcpu_id)) {
+ mfn = pagetable_get_pfn(v->arch.monitor_table);
+ unmap_domain_page(v->arch.monitor_vtable);
+ free_domheap_page(&frame_table[mfn]);
+ }
v->arch.monitor_table = mk_pagetable(0);
v->arch.monitor_vtable = 0;
diff --git a/xen/arch/x86/shadow_public.c b/xen/arch/x86/shadow_public.c
index 771e8d0fc1..fad54a7f97 100644
--- a/xen/arch/x86/shadow_public.c
+++ b/xen/arch/x86/shadow_public.c
@@ -256,14 +256,16 @@ void free_monitor_pagetable(struct vcpu *v)
{
unsigned long mfn;
-// ASSERT( pagetable_val(v->arch.monitor_table) );
+ ASSERT( pagetable_val(v->arch.monitor_table) );
/*
* free monitor_table.
+ * Note: for VMX guest, only BSP need do this free.
*/
- //mfn = (pagetable_val(v->arch.monitor_table)) >> PAGE_SHIFT;
- mfn = pagetable_get_pfn(v->arch.monitor_table);
- unmap_domain_page(v->arch.monitor_vtable);
- free_domheap_page(&frame_table[mfn]);
+ if (!(VMX_DOMAIN(v) && v->vcpu_id)) {
+ mfn = pagetable_get_pfn(v->arch.monitor_table);
+ unmap_domain_page(v->arch.monitor_vtable);
+ free_domheap_page(&frame_table[mfn]);
+ }
v->arch.monitor_table = mk_pagetable(0);
v->arch.monitor_vtable = 0;
}
@@ -358,9 +360,13 @@ void free_monitor_pagetable(struct vcpu *v)
/*
* Then free monitor_table.
+ * Note: for VMX guest, only BSP need do this free.
*/
- mfn = pagetable_get_pfn(v->arch.monitor_table);
- free_domheap_page(&frame_table[mfn]);
+ if (!(VMX_DOMAIN(v) && v->vcpu_id)) {
+ mfn = pagetable_get_pfn(v->arch.monitor_table);
+ unmap_domain_page(v->arch.monitor_vtable);
+ free_domheap_page(&frame_table[mfn]);
+ }
v->arch.monitor_table = mk_pagetable(0);
v->arch.monitor_vtable = 0;