diff options
author | Boris Ostrovsky <boris.ostrovsky@oracle.com> | 2013-09-09 06:44:26 -0400 |
---|---|---|
committer | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2013-09-09 06:50:52 -0400 |
commit | d7f8f48d1eb3186b1b80b2ed9a7adab191f753e9 (patch) | |
tree | 712a6bf69b28b03a0defce46f7289d4cfba94eb0 /arch | |
parent | 9dd4b2944c46e1fdbd0a516c221c8a2670cbf005 (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.c | 10 |
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; |