aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorBoris Ostrovsky <boris.ostrovsky@oracle.com>2013-09-09 06:44:26 -0400
committerStefano Stabellini <stefano.stabellini@eu.citrix.com>2013-09-09 06:50:52 -0400
commitd7f8f48d1eb3186b1b80b2ed9a7adab191f753e9 (patch)
tree712a6bf69b28b03a0defce46f7289d4cfba94eb0 /arch
parent9dd4b2944c46e1fdbd0a516c221c8a2670cbf005 (diff)
xen/p2m: Don't call get_balloon_scratch_page() twice, keep interrupts disabled for multicalls
m2p_remove_override() calls get_balloon_scratch_page() in MULTI_update_va_mapping() even though it already has pointer to this page from the earlier call (in scratch_page). This second call doesn't have a matching put_balloon_scratch_page() thus not restoring preempt count back. (Also, there is no put_balloon_scratch_page() in the error path.) In addition, the second multicall uses __xen_mc_entry() which does not disable interrupts. Rearrange xen_mc_* calls to keep interrupts off while performing multicalls. This commit fixes a regression introduced by: commit ee0726407feaf504dff304fb603652fb2d778b42 Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Date: Tue Jul 23 17:23:54 2013 +0000 xen/m2p: use GNTTABOP_unmap_and_replace to reinstate the original mapping Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/xen/p2m.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
index 0d4ec35895d4..8b901e8d782d 100644
--- a/arch/x86/xen/p2m.c
+++ b/arch/x86/xen/p2m.c
@@ -990,10 +990,13 @@ int m2p_remove_override(struct page *page,
990 printk(KERN_WARNING "m2p_remove_override: " 990 printk(KERN_WARNING "m2p_remove_override: "
991 "pfn %lx mfn %lx, failed to modify kernel mappings", 991 "pfn %lx mfn %lx, failed to modify kernel mappings",
992 pfn, mfn); 992 pfn, mfn);
993 put_balloon_scratch_page();
993 return -1; 994 return -1;
994 } 995 }
995 996
996 mcs = xen_mc_entry( 997 xen_mc_batch();
998
999 mcs = __xen_mc_entry(
997 sizeof(struct gnttab_unmap_and_replace)); 1000 sizeof(struct gnttab_unmap_and_replace));
998 unmap_op = mcs.args; 1001 unmap_op = mcs.args;
999 unmap_op->host_addr = kmap_op->host_addr; 1002 unmap_op->host_addr = kmap_op->host_addr;
@@ -1003,12 +1006,11 @@ int m2p_remove_override(struct page *page,
1003 MULTI_grant_table_op(mcs.mc, 1006 MULTI_grant_table_op(mcs.mc,
1004 GNTTABOP_unmap_and_replace, unmap_op, 1); 1007 GNTTABOP_unmap_and_replace, unmap_op, 1);
1005 1008
1006 xen_mc_issue(PARAVIRT_LAZY_MMU);
1007
1008 mcs = __xen_mc_entry(0); 1009 mcs = __xen_mc_entry(0);
1009 MULTI_update_va_mapping(mcs.mc, scratch_page_address, 1010 MULTI_update_va_mapping(mcs.mc, scratch_page_address,
1010 pfn_pte(page_to_pfn(get_balloon_scratch_page()), 1011 pfn_pte(page_to_pfn(scratch_page),
1011 PAGE_KERNEL_RO), 0); 1012 PAGE_KERNEL_RO), 0);
1013
1012 xen_mc_issue(PARAVIRT_LAZY_MMU); 1014 xen_mc_issue(PARAVIRT_LAZY_MMU);
1013 1015
1014 kmap_op->host_addr = 0; 1016 kmap_op->host_addr = 0;