diff options
author | Juergen Gross <jgross@suse.com> | 2014-11-28 05:53:51 -0500 |
---|---|---|
committer | David Vrabel <david.vrabel@citrix.com> | 2014-12-04 09:08:37 -0500 |
commit | 820c4db2be4ec179210b5c69103a5b2858513e8a (patch) | |
tree | be6d65daf9db284cf9ca311c9672d9c4bdac6271 | |
parent | 6f58d89e6c71db99fc9b211f9ec2180f33304628 (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.h | 6 | ||||
-rw-r--r-- | arch/x86/xen/p2m.c | 186 |
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, | |||
52 | extern int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, | 52 | extern 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); |
55 | extern int m2p_add_override(unsigned long mfn, struct page *page, | ||
56 | struct gnttab_map_grant_ref *kmap_op); | ||
57 | extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, | 55 | extern 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); |
60 | extern int m2p_remove_override(struct page *page, | ||
61 | struct gnttab_map_grant_ref *kmap_op, | ||
62 | unsigned long mfn); | ||
63 | extern struct page *m2p_find_override(unsigned long mfn); | ||
64 | extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn); | 58 | extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn); |
65 | 59 | ||
66 | static inline unsigned long pfn_to_mfn(unsigned long pfn) | 60 | static 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 | ||
899 | int 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 | |||
950 | out: | ||
951 | if (lazy) | ||
952 | arch_leave_lazy_mmu_mode(); | ||
953 | |||
954 | return ret; | ||
955 | } | ||
956 | EXPORT_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 */ |
959 | int m2p_add_override(unsigned long mfn, struct page *page, | 900 | static 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 | } |
1012 | EXPORT_SYMBOL_GPL(m2p_add_override); | ||
1013 | 953 | ||
1014 | int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, | 954 | int 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 | ||
1051 | out: | 1005 | out: |
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 | } |
1056 | EXPORT_SYMBOL_GPL(clear_foreign_p2m_mapping); | 1011 | EXPORT_SYMBOL_GPL(set_foreign_p2m_mapping); |
1057 | 1012 | ||
1058 | int m2p_remove_override(struct page *page, | 1013 | static 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 | |||
1035 | static 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 | } |
1153 | EXPORT_SYMBOL_GPL(m2p_remove_override); | ||
1154 | 1130 | ||
1155 | struct page *m2p_find_override(unsigned long mfn) | 1131 | int 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 | |||
1168 | out: | ||
1169 | if (lazy) | ||
1170 | arch_leave_lazy_mmu_mode(); | ||
1174 | return ret; | 1171 | return ret; |
1175 | } | 1172 | } |
1173 | EXPORT_SYMBOL_GPL(clear_foreign_p2m_mapping); | ||
1176 | 1174 | ||
1177 | unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn) | 1175 | unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn) |
1178 | { | 1176 | { |