aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuergen Gross <jgross@suse.com>2014-11-28 05:53:51 -0500
committerDavid Vrabel <david.vrabel@citrix.com>2014-12-04 09:08:37 -0500
commit820c4db2be4ec179210b5c69103a5b2858513e8a (patch)
treebe6d65daf9db284cf9ca311c9672d9c4bdac6271
parent6f58d89e6c71db99fc9b211f9ec2180f33304628 (diff)
xen: Make functions static
Some functions in arch/x86/xen/p2m.c are used locally only. Make them static. Rearrange the functions in p2m.c to avoid forward declarations. Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
-rw-r--r--arch/x86/include/asm/xen/page.h6
-rw-r--r--arch/x86/xen/p2m.c186
2 files changed, 92 insertions, 100 deletions
diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h
index f58ef6c0613b..5a65a7551698 100644
--- a/arch/x86/include/asm/xen/page.h
+++ b/arch/x86/include/asm/xen/page.h
@@ -52,15 +52,9 @@ extern unsigned long set_phys_range_identity(unsigned long pfn_s,
52extern int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, 52extern int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
53 struct gnttab_map_grant_ref *kmap_ops, 53 struct gnttab_map_grant_ref *kmap_ops,
54 struct page **pages, unsigned int count); 54 struct page **pages, unsigned int count);
55extern int m2p_add_override(unsigned long mfn, struct page *page,
56 struct gnttab_map_grant_ref *kmap_op);
57extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, 55extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops,
58 struct gnttab_map_grant_ref *kmap_ops, 56 struct gnttab_map_grant_ref *kmap_ops,
59 struct page **pages, unsigned int count); 57 struct page **pages, unsigned int count);
60extern int m2p_remove_override(struct page *page,
61 struct gnttab_map_grant_ref *kmap_op,
62 unsigned long mfn);
63extern struct page *m2p_find_override(unsigned long mfn);
64extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn); 58extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn);
65 59
66static inline unsigned long pfn_to_mfn(unsigned long pfn) 60static inline unsigned long pfn_to_mfn(unsigned long pfn)
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
index 04814c629abf..2d8b9086c3ec 100644
--- a/arch/x86/xen/p2m.c
+++ b/arch/x86/xen/p2m.c
@@ -896,68 +896,9 @@ static unsigned long mfn_hash(unsigned long mfn)
896 return hash_long(mfn, M2P_OVERRIDE_HASH_SHIFT); 896 return hash_long(mfn, M2P_OVERRIDE_HASH_SHIFT);
897} 897}
898 898
899int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
900 struct gnttab_map_grant_ref *kmap_ops,
901 struct page **pages, unsigned int count)
902{
903 int i, ret = 0;
904 bool lazy = false;
905 pte_t *pte;
906
907 if (xen_feature(XENFEAT_auto_translated_physmap))
908 return 0;
909
910 if (kmap_ops &&
911 !in_interrupt() &&
912 paravirt_get_lazy_mode() == PARAVIRT_LAZY_NONE) {
913 arch_enter_lazy_mmu_mode();
914 lazy = true;
915 }
916
917 for (i = 0; i < count; i++) {
918 unsigned long mfn, pfn;
919
920 /* Do not add to override if the map failed. */
921 if (map_ops[i].status)
922 continue;
923
924 if (map_ops[i].flags & GNTMAP_contains_pte) {
925 pte = (pte_t *)(mfn_to_virt(PFN_DOWN(map_ops[i].host_addr)) +
926 (map_ops[i].host_addr & ~PAGE_MASK));
927 mfn = pte_mfn(*pte);
928 } else {
929 mfn = PFN_DOWN(map_ops[i].dev_bus_addr);
930 }
931 pfn = page_to_pfn(pages[i]);
932
933 WARN_ON(PagePrivate(pages[i]));
934 SetPagePrivate(pages[i]);
935 set_page_private(pages[i], mfn);
936 pages[i]->index = pfn_to_mfn(pfn);
937
938 if (unlikely(!set_phys_to_machine(pfn, FOREIGN_FRAME(mfn)))) {
939 ret = -ENOMEM;
940 goto out;
941 }
942
943 if (kmap_ops) {
944 ret = m2p_add_override(mfn, pages[i], &kmap_ops[i]);
945 if (ret)
946 goto out;
947 }
948 }
949
950out:
951 if (lazy)
952 arch_leave_lazy_mmu_mode();
953
954 return ret;
955}
956EXPORT_SYMBOL_GPL(set_foreign_p2m_mapping);
957
958/* Add an MFN override for a particular page */ 899/* Add an MFN override for a particular page */
959int m2p_add_override(unsigned long mfn, struct page *page, 900static int m2p_add_override(unsigned long mfn, struct page *page,
960 struct gnttab_map_grant_ref *kmap_op) 901 struct gnttab_map_grant_ref *kmap_op)
961{ 902{
962 unsigned long flags; 903 unsigned long flags;
963 unsigned long pfn; 904 unsigned long pfn;
@@ -1009,14 +950,14 @@ int m2p_add_override(unsigned long mfn, struct page *page,
1009 950
1010 return 0; 951 return 0;
1011} 952}
1012EXPORT_SYMBOL_GPL(m2p_add_override);
1013 953
1014int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, 954int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
1015 struct gnttab_map_grant_ref *kmap_ops, 955 struct gnttab_map_grant_ref *kmap_ops,
1016 struct page **pages, unsigned int count) 956 struct page **pages, unsigned int count)
1017{ 957{
1018 int i, ret = 0; 958 int i, ret = 0;
1019 bool lazy = false; 959 bool lazy = false;
960 pte_t *pte;
1020 961
1021 if (xen_feature(XENFEAT_auto_translated_physmap)) 962 if (xen_feature(XENFEAT_auto_translated_physmap))
1022 return 0; 963 return 0;
@@ -1029,35 +970,71 @@ int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops,
1029 } 970 }
1030 971
1031 for (i = 0; i < count; i++) { 972 for (i = 0; i < count; i++) {
1032 unsigned long mfn = get_phys_to_machine(page_to_pfn(pages[i])); 973 unsigned long mfn, pfn;
1033 unsigned long pfn = page_to_pfn(pages[i]);
1034 974
1035 if (mfn == INVALID_P2M_ENTRY || !(mfn & FOREIGN_FRAME_BIT)) { 975 /* Do not add to override if the map failed. */
1036 ret = -EINVAL; 976 if (map_ops[i].status)
1037 goto out; 977 continue;
978
979 if (map_ops[i].flags & GNTMAP_contains_pte) {
980 pte = (pte_t *)(mfn_to_virt(PFN_DOWN(map_ops[i].host_addr)) +
981 (map_ops[i].host_addr & ~PAGE_MASK));
982 mfn = pte_mfn(*pte);
983 } else {
984 mfn = PFN_DOWN(map_ops[i].dev_bus_addr);
1038 } 985 }
986 pfn = page_to_pfn(pages[i]);
1039 987
1040 set_page_private(pages[i], INVALID_P2M_ENTRY); 988 WARN_ON(PagePrivate(pages[i]));
1041 WARN_ON(!PagePrivate(pages[i])); 989 SetPagePrivate(pages[i]);
1042 ClearPagePrivate(pages[i]); 990 set_page_private(pages[i], mfn);
1043 set_phys_to_machine(pfn, pages[i]->index); 991 pages[i]->index = pfn_to_mfn(pfn);
1044 992
1045 if (kmap_ops) 993 if (unlikely(!set_phys_to_machine(pfn, FOREIGN_FRAME(mfn)))) {
1046 ret = m2p_remove_override(pages[i], &kmap_ops[i], mfn); 994 ret = -ENOMEM;
1047 if (ret)
1048 goto out; 995 goto out;
996 }
997
998 if (kmap_ops) {
999 ret = m2p_add_override(mfn, pages[i], &kmap_ops[i]);
1000 if (ret)
1001 goto out;
1002 }
1049 } 1003 }
1050 1004
1051out: 1005out:
1052 if (lazy) 1006 if (lazy)
1053 arch_leave_lazy_mmu_mode(); 1007 arch_leave_lazy_mmu_mode();
1008
1054 return ret; 1009 return ret;
1055} 1010}
1056EXPORT_SYMBOL_GPL(clear_foreign_p2m_mapping); 1011EXPORT_SYMBOL_GPL(set_foreign_p2m_mapping);
1057 1012
1058int m2p_remove_override(struct page *page, 1013static struct page *m2p_find_override(unsigned long mfn)
1059 struct gnttab_map_grant_ref *kmap_op, 1014{
1060 unsigned long mfn) 1015 unsigned long flags;
1016 struct list_head *bucket = &m2p_overrides[mfn_hash(mfn)];
1017 struct page *p, *ret;
1018
1019 ret = NULL;
1020
1021 spin_lock_irqsave(&m2p_override_lock, flags);
1022
1023 list_for_each_entry(p, bucket, lru) {
1024 if (page_private(p) == mfn) {
1025 ret = p;
1026 break;
1027 }
1028 }
1029
1030 spin_unlock_irqrestore(&m2p_override_lock, flags);
1031
1032 return ret;
1033}
1034
1035static int m2p_remove_override(struct page *page,
1036 struct gnttab_map_grant_ref *kmap_op,
1037 unsigned long mfn)
1061{ 1038{
1062 unsigned long flags; 1039 unsigned long flags;
1063 unsigned long pfn; 1040 unsigned long pfn;
@@ -1150,29 +1127,50 @@ int m2p_remove_override(struct page *page,
1150 1127
1151 return 0; 1128 return 0;
1152} 1129}
1153EXPORT_SYMBOL_GPL(m2p_remove_override);
1154 1130
1155struct page *m2p_find_override(unsigned long mfn) 1131int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops,
1132 struct gnttab_map_grant_ref *kmap_ops,
1133 struct page **pages, unsigned int count)
1156{ 1134{
1157 unsigned long flags; 1135 int i, ret = 0;
1158 struct list_head *bucket = &m2p_overrides[mfn_hash(mfn)]; 1136 bool lazy = false;
1159 struct page *p, *ret;
1160 1137
1161 ret = NULL; 1138 if (xen_feature(XENFEAT_auto_translated_physmap))
1139 return 0;
1162 1140
1163 spin_lock_irqsave(&m2p_override_lock, flags); 1141 if (kmap_ops &&
1142 !in_interrupt() &&
1143 paravirt_get_lazy_mode() == PARAVIRT_LAZY_NONE) {
1144 arch_enter_lazy_mmu_mode();
1145 lazy = true;
1146 }
1164 1147
1165 list_for_each_entry(p, bucket, lru) { 1148 for (i = 0; i < count; i++) {
1166 if (page_private(p) == mfn) { 1149 unsigned long mfn = get_phys_to_machine(page_to_pfn(pages[i]));
1167 ret = p; 1150 unsigned long pfn = page_to_pfn(pages[i]);
1168 break; 1151
1152 if (mfn == INVALID_P2M_ENTRY || !(mfn & FOREIGN_FRAME_BIT)) {
1153 ret = -EINVAL;
1154 goto out;
1169 } 1155 }
1170 }
1171 1156
1172 spin_unlock_irqrestore(&m2p_override_lock, flags); 1157 set_page_private(pages[i], INVALID_P2M_ENTRY);
1158 WARN_ON(!PagePrivate(pages[i]));
1159 ClearPagePrivate(pages[i]);
1160 set_phys_to_machine(pfn, pages[i]->index);
1173 1161
1162 if (kmap_ops)
1163 ret = m2p_remove_override(pages[i], &kmap_ops[i], mfn);
1164 if (ret)
1165 goto out;
1166 }
1167
1168out:
1169 if (lazy)
1170 arch_leave_lazy_mmu_mode();
1174 return ret; 1171 return ret;
1175} 1172}
1173EXPORT_SYMBOL_GPL(clear_foreign_p2m_mapping);
1176 1174
1177unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn) 1175unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn)
1178{ 1176{