diff options
author | Zoltan Kiss <zoltan.kiss@citrix.com> | 2014-01-23 16:23:44 -0500 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2014-01-31 09:48:32 -0500 |
commit | 08ece5bb2312b4510b161a6ef6682f37f4eac8a1 (patch) | |
tree | d331f6b82ca8f0346afdf54bc793fb10c4bdaec8 /arch/x86/xen | |
parent | 47c542050d306e50f09512eb6339dbf2fc02fddd (diff) |
xen/grant-table: Avoid m2p_override during mapping
The grant mapping API does m2p_override unnecessarily: only gntdev needs it,
for blkback and future netback patches it just cause a lock contention, as
those pages never go to userspace. Therefore this series does the following:
- the original functions were renamed to __gnttab_[un]map_refs, with a new
parameter m2p_override
- based on m2p_override either they follow the original behaviour, or just set
the private flag and call set_phys_to_machine
- gnttab_[un]map_refs are now a wrapper to call __gnttab_[un]map_refs with
m2p_override false
- a new function gnttab_[un]map_refs_userspace provides the old behaviour
It also removes a stray space from page.h and change ret to 0 if
XENFEAT_auto_translated_physmap, as that is the only possible return value
there.
v2:
- move the storing of the old mfn in page->index to gnttab_map_refs
- move the function header update to a separate patch
v3:
- a new approach to retain old behaviour where it needed
- squash the patches into one
v4:
- move out the common bits from m2p* functions, and pass pfn/mfn as parameter
- clear page->private before doing anything with the page, so m2p_find_override
won't race with this
v5:
- change return value handling in __gnttab_[un]map_refs
- remove a stray space in page.h
- add detail why ret = 0 now at some places
v6:
- don't pass pfn to m2p* functions, just get it locally
Signed-off-by: Zoltan Kiss <zoltan.kiss@citrix.com>
Suggested-by: David Vrabel <david.vrabel@citrix.com>
Acked-by: David Vrabel <david.vrabel@citrix.com>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'arch/x86/xen')
-rw-r--r-- | arch/x86/xen/p2m.c | 17 |
1 files changed, 2 insertions, 15 deletions
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index 696c694986d0..8009acbe41e4 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c | |||
@@ -899,13 +899,6 @@ int m2p_add_override(unsigned long mfn, struct page *page, | |||
899 | "m2p_add_override: pfn %lx not mapped", pfn)) | 899 | "m2p_add_override: pfn %lx not mapped", pfn)) |
900 | return -EINVAL; | 900 | return -EINVAL; |
901 | } | 901 | } |
902 | WARN_ON(PagePrivate(page)); | ||
903 | SetPagePrivate(page); | ||
904 | set_page_private(page, mfn); | ||
905 | page->index = pfn_to_mfn(pfn); | ||
906 | |||
907 | if (unlikely(!set_phys_to_machine(pfn, FOREIGN_FRAME(mfn)))) | ||
908 | return -ENOMEM; | ||
909 | 902 | ||
910 | if (kmap_op != NULL) { | 903 | if (kmap_op != NULL) { |
911 | if (!PageHighMem(page)) { | 904 | if (!PageHighMem(page)) { |
@@ -944,19 +937,16 @@ int m2p_add_override(unsigned long mfn, struct page *page, | |||
944 | } | 937 | } |
945 | EXPORT_SYMBOL_GPL(m2p_add_override); | 938 | EXPORT_SYMBOL_GPL(m2p_add_override); |
946 | int m2p_remove_override(struct page *page, | 939 | int m2p_remove_override(struct page *page, |
947 | struct gnttab_map_grant_ref *kmap_op) | 940 | struct gnttab_map_grant_ref *kmap_op, |
941 | unsigned long mfn) | ||
948 | { | 942 | { |
949 | unsigned long flags; | 943 | unsigned long flags; |
950 | unsigned long mfn; | ||
951 | unsigned long pfn; | 944 | unsigned long pfn; |
952 | unsigned long uninitialized_var(address); | 945 | unsigned long uninitialized_var(address); |
953 | unsigned level; | 946 | unsigned level; |
954 | pte_t *ptep = NULL; | 947 | pte_t *ptep = NULL; |
955 | 948 | ||
956 | pfn = page_to_pfn(page); | 949 | pfn = page_to_pfn(page); |
957 | mfn = get_phys_to_machine(pfn); | ||
958 | if (mfn == INVALID_P2M_ENTRY || !(mfn & FOREIGN_FRAME_BIT)) | ||
959 | return -EINVAL; | ||
960 | 950 | ||
961 | if (!PageHighMem(page)) { | 951 | if (!PageHighMem(page)) { |
962 | address = (unsigned long)__va(pfn << PAGE_SHIFT); | 952 | address = (unsigned long)__va(pfn << PAGE_SHIFT); |
@@ -970,10 +960,7 @@ int m2p_remove_override(struct page *page, | |||
970 | spin_lock_irqsave(&m2p_override_lock, flags); | 960 | spin_lock_irqsave(&m2p_override_lock, flags); |
971 | list_del(&page->lru); | 961 | list_del(&page->lru); |
972 | spin_unlock_irqrestore(&m2p_override_lock, flags); | 962 | spin_unlock_irqrestore(&m2p_override_lock, flags); |
973 | WARN_ON(!PagePrivate(page)); | ||
974 | ClearPagePrivate(page); | ||
975 | 963 | ||
976 | set_phys_to_machine(pfn, page->index); | ||
977 | if (kmap_op != NULL) { | 964 | if (kmap_op != NULL) { |
978 | if (!PageHighMem(page)) { | 965 | if (!PageHighMem(page)) { |
979 | struct multicall_space mcs; | 966 | struct multicall_space mcs; |