diff options
author | David Vrabel <david.vrabel@citrix.com> | 2015-01-05 15:13:41 +0100 |
---|---|---|
committer | David Vrabel <david.vrabel@citrix.com> | 2015-01-28 15:03:10 +0100 |
commit | 853d0289340026b30f93fd0e768340221d4e605c (patch) | |
tree | 17d52ad1d7ae43007d8b664bbdba2a50db7dbb81 /arch/x86/xen/p2m.c | |
parent | mm: add 'foreign' alias for the 'pinned' page flag (diff) | |
download | linux-853d0289340026b30f93fd0e768340221d4e605c.tar.xz linux-853d0289340026b30f93fd0e768340221d4e605c.zip |
xen/grant-table: pre-populate kernel unmap ops for xen_gnttab_unmap_refs()
When unmapping grants, instead of converting the kernel map ops to
unmap ops on the fly, pre-populate the set of unmap ops.
This allows the grant unmap for the kernel mappings to be trivially
batched in the future.
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Diffstat (limited to 'arch/x86/xen/p2m.c')
-rw-r--r-- | arch/x86/xen/p2m.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index 70fb5075c901..df40b2888eae 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c @@ -816,7 +816,7 @@ static struct page *m2p_find_override(unsigned long mfn) } static int m2p_remove_override(struct page *page, - struct gnttab_map_grant_ref *kmap_op, + struct gnttab_unmap_grant_ref *kunmap_op, unsigned long mfn) { unsigned long flags; @@ -840,7 +840,7 @@ static int m2p_remove_override(struct page *page, list_del(&page->lru); spin_unlock_irqrestore(&m2p_override_lock, flags); - if (kmap_op != NULL) { + if (kunmap_op != NULL) { if (!PageHighMem(page)) { struct multicall_space mcs; struct gnttab_unmap_and_replace *unmap_op; @@ -855,13 +855,13 @@ static int m2p_remove_override(struct page *page, * issued. In this case handle is going to -1 because * it hasn't been modified yet. */ - if (kmap_op->handle == -1) + if (kunmap_op->handle == -1) xen_mc_flush(); /* * Now if kmap_op->handle is negative it means that the * hypercall actually returned an error. */ - if (kmap_op->handle == GNTST_general_error) { + if (kunmap_op->handle == GNTST_general_error) { pr_warn("m2p_remove_override: pfn %lx mfn %lx, failed to modify kernel mappings", pfn, mfn); put_balloon_scratch_page(); @@ -873,9 +873,9 @@ static int m2p_remove_override(struct page *page, mcs = __xen_mc_entry( sizeof(struct gnttab_unmap_and_replace)); unmap_op = mcs.args; - unmap_op->host_addr = kmap_op->host_addr; + unmap_op->host_addr = kunmap_op->host_addr; unmap_op->new_addr = scratch_page_address; - unmap_op->handle = kmap_op->handle; + unmap_op->handle = kunmap_op->handle; MULTI_grant_table_op(mcs.mc, GNTTABOP_unmap_and_replace, unmap_op, 1); @@ -887,7 +887,6 @@ static int m2p_remove_override(struct page *page, xen_mc_issue(PARAVIRT_LAZY_MMU); - kmap_op->host_addr = 0; put_balloon_scratch_page(); } } @@ -912,7 +911,7 @@ static int m2p_remove_override(struct page *page, } int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, - struct gnttab_map_grant_ref *kmap_ops, + struct gnttab_unmap_grant_ref *kunmap_ops, struct page **pages, unsigned int count) { int i, ret = 0; @@ -921,7 +920,7 @@ int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, if (xen_feature(XENFEAT_auto_translated_physmap)) return 0; - if (kmap_ops && + if (kunmap_ops && !in_interrupt() && paravirt_get_lazy_mode() == PARAVIRT_LAZY_NONE) { arch_enter_lazy_mmu_mode(); @@ -942,8 +941,8 @@ int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, ClearPagePrivate(pages[i]); set_phys_to_machine(pfn, pages[i]->index); - if (kmap_ops) - ret = m2p_remove_override(pages[i], &kmap_ops[i], mfn); + if (kunmap_ops) + ret = m2p_remove_override(pages[i], &kunmap_ops[i], mfn); if (ret) goto out; } |