# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1261645572 0
# Node ID ddb3646ad6813375c086238bb1427d274951539d
# Parent 020e7a7d447453e38c3563c9cb1b3d37ac5a8652
x86/mm: early put_page when XENMEM_add_to_physmap(XENMAPSPACE_gmfn)
When using a stub domain, xen massively complains as follows:
(XEN) sh error: sh_remove_all_mappings(): can't find all mappings of
mfn be=
3c5: c=3D8000000000000004 t=3D00000000
(XEN) sh error: sh_remove_all_mappings(): can't find all mappings of
mfn be=
3c4: c=3D8000000000000004 t=3D00000000
...
This comes from the XENMEM_add_to_physmap hypercall from hvmloader.
The guest_physmap_remove_page function calls sh_remove_all_mappings()
which checks reference count of the page. Then, calling
guest_physmap_remove_page after temporarily get_page is obviously
wrong. And early put_page is harmless here since domain_lock is
acquired.
Also, the restore program seems not to complain extra mappings
long before. Instead, the stub domain does. Thus the comment in
sh_remove_all_mappings() is rewritten.
Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
---
xen/arch/x86/mm.c | 6 +++---
xen/arch/x86/mm/shadow/common.c | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff -r 020e7a7d4474 -r ddb3646ad681 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Thu Dec 24 08:59:47 2009 +0000
+++ b/xen/arch/x86/mm.c Thu Dec 24 09:06:12 2009 +0000
@@ -4304,6 +4304,9 @@ long arch_memory_op(int op, XEN_GUEST_HA
domain_lock(d);
+ if ( page )
+ put_page(page);
+
/* Remove previously mapped page if it was present. */
prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
if ( mfn_valid(prev_mfn) )
@@ -4326,9 +4329,6 @@ long arch_memory_op(int op, XEN_GUEST_HA
rc = guest_physmap_add_page(d, xatp.gpfn, mfn, 0);
domain_unlock(d);
-
- if ( page )
- put_page(page);
rcu_unlock_domain(d);
diff -r 020e7a7d4474 -r ddb3646ad681 xen/arch/x86/mm/shadow/common.c
--- a/xen/arch/x86/mm/shadow/common.c Thu Dec 24 08:59:47 2009 +0000
+++ b/xen/arch/x86/mm/shadow/common.c Thu Dec 24 09:06:12 2009 +0000
@@ -2606,7 +2606,7 @@ int sh_remove_all_mappings(struct vcpu *
{
/* Don't complain if we're in HVM and there are some extra mappings:
* The qemu helper process has an untyped mapping of this dom's RAM
- * and the HVM restore program takes another. */
+ * and the stub domain takes another. */
if ( !(shadow_mode_external(v->domain)
&& (page->count_info & PGC_count_mask) <= 3
&& (page->u.inuse.type_info & PGT_count_mask) == 0) )
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|