diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-09-28 14:07:25 +0100 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-09-28 14:07:25 +0100 |
commit | 82c66523be98425df658f4acf77c8cba355ba3e4 (patch) | |
tree | 6ed141e116df6a0a42697f4c32779a0c4e0fee88 | |
parent | ba17dc3655b24a15328394719a1b2fa73b179743 (diff) | |
download | xen-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.c | 8 | ||||
-rw-r--r-- | xen/arch/x86/shadow_public.c | 20 |
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; |