diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-03-10 13:24:37 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-03-11 02:11:34 -0400 |
commit | 9e5efaa9360f26e0052d16f7a40d002a6a18863b (patch) | |
tree | e337345b30c7da10e6c00f4305dec8b5b73afc12 /arch/powerpc | |
parent | 353bca5ed4e0705ed4a1ac7b82491b223c3b55ba (diff) |
powerpc/mm: Properly wire up get_user_pages_fast() on 32-bit
While we did add support for _PAGE_SPECIAL on some 32-bit platforms,
we never actually built get_user_pages_fast() on them. This fixes
it which requires a little bit of ifdef'ing around.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/mm/Makefile | 4 | ||||
-rw-r--r-- | arch/powerpc/mm/gup.c | 16 |
2 files changed, 17 insertions, 3 deletions
diff --git a/arch/powerpc/mm/Makefile b/arch/powerpc/mm/Makefile index 953cc4a1cde5..6d2838fc8792 100644 --- a/arch/powerpc/mm/Makefile +++ b/arch/powerpc/mm/Makefile | |||
@@ -6,7 +6,7 @@ ifeq ($(CONFIG_PPC64),y) | |||
6 | EXTRA_CFLAGS += -mno-minimal-toc | 6 | EXTRA_CFLAGS += -mno-minimal-toc |
7 | endif | 7 | endif |
8 | 8 | ||
9 | obj-y := fault.o mem.o pgtable.o \ | 9 | obj-y := fault.o mem.o pgtable.o gup.o \ |
10 | init_$(CONFIG_WORD_SIZE).o \ | 10 | init_$(CONFIG_WORD_SIZE).o \ |
11 | pgtable_$(CONFIG_WORD_SIZE).o | 11 | pgtable_$(CONFIG_WORD_SIZE).o |
12 | obj-$(CONFIG_PPC_MMU_NOHASH) += mmu_context_nohash.o tlb_nohash.o \ | 12 | obj-$(CONFIG_PPC_MMU_NOHASH) += mmu_context_nohash.o tlb_nohash.o \ |
@@ -14,7 +14,7 @@ obj-$(CONFIG_PPC_MMU_NOHASH) += mmu_context_nohash.o tlb_nohash.o \ | |||
14 | hash-$(CONFIG_PPC_NATIVE) := hash_native_64.o | 14 | hash-$(CONFIG_PPC_NATIVE) := hash_native_64.o |
15 | obj-$(CONFIG_PPC64) += hash_utils_64.o \ | 15 | obj-$(CONFIG_PPC64) += hash_utils_64.o \ |
16 | slb_low.o slb.o stab.o \ | 16 | slb_low.o slb.o stab.o \ |
17 | gup.o mmap.o $(hash-y) | 17 | mmap.o $(hash-y) |
18 | obj-$(CONFIG_PPC_STD_MMU_32) += ppc_mmu_32.o | 18 | obj-$(CONFIG_PPC_STD_MMU_32) += ppc_mmu_32.o |
19 | obj-$(CONFIG_PPC_STD_MMU) += hash_low_$(CONFIG_WORD_SIZE).o \ | 19 | obj-$(CONFIG_PPC_STD_MMU) += hash_low_$(CONFIG_WORD_SIZE).o \ |
20 | tlb_hash$(CONFIG_WORD_SIZE).o \ | 20 | tlb_hash$(CONFIG_WORD_SIZE).o \ |
diff --git a/arch/powerpc/mm/gup.c b/arch/powerpc/mm/gup.c index 28a114db3ba0..bc400c78c97f 100644 --- a/arch/powerpc/mm/gup.c +++ b/arch/powerpc/mm/gup.c | |||
@@ -14,6 +14,8 @@ | |||
14 | #include <linux/rwsem.h> | 14 | #include <linux/rwsem.h> |
15 | #include <asm/pgtable.h> | 15 | #include <asm/pgtable.h> |
16 | 16 | ||
17 | #ifdef __HAVE_ARCH_PTE_SPECIAL | ||
18 | |||
17 | /* | 19 | /* |
18 | * The performance critical leaf functions are made noinline otherwise gcc | 20 | * The performance critical leaf functions are made noinline otherwise gcc |
19 | * inlines everything into a single function which results in too much | 21 | * inlines everything into a single function which results in too much |
@@ -151,8 +153,11 @@ int get_user_pages_fast(unsigned long start, int nr_pages, int write, | |||
151 | unsigned long addr, len, end; | 153 | unsigned long addr, len, end; |
152 | unsigned long next; | 154 | unsigned long next; |
153 | pgd_t *pgdp; | 155 | pgd_t *pgdp; |
154 | int psize, nr = 0; | 156 | int nr = 0; |
157 | #ifdef CONFIG_PPC64 | ||
155 | unsigned int shift; | 158 | unsigned int shift; |
159 | int psize; | ||
160 | #endif | ||
156 | 161 | ||
157 | pr_debug("%s(%lx,%x,%s)\n", __func__, start, nr_pages, write ? "write" : "read"); | 162 | pr_debug("%s(%lx,%x,%s)\n", __func__, start, nr_pages, write ? "write" : "read"); |
158 | 163 | ||
@@ -205,8 +210,13 @@ int get_user_pages_fast(unsigned long start, int nr_pages, int write, | |||
205 | */ | 210 | */ |
206 | local_irq_disable(); | 211 | local_irq_disable(); |
207 | 212 | ||
213 | #ifdef CONFIG_PPC64 | ||
214 | /* Those bits are related to hugetlbfs implementation and only exist | ||
215 | * on 64-bit for now | ||
216 | */ | ||
208 | psize = get_slice_psize(mm, addr); | 217 | psize = get_slice_psize(mm, addr); |
209 | shift = mmu_psize_defs[psize].shift; | 218 | shift = mmu_psize_defs[psize].shift; |
219 | #endif /* CONFIG_PPC64 */ | ||
210 | 220 | ||
211 | #ifdef CONFIG_HUGETLB_PAGE | 221 | #ifdef CONFIG_HUGETLB_PAGE |
212 | if (unlikely(mmu_huge_psizes[psize])) { | 222 | if (unlikely(mmu_huge_psizes[psize])) { |
@@ -236,7 +246,9 @@ int get_user_pages_fast(unsigned long start, int nr_pages, int write, | |||
236 | do { | 246 | do { |
237 | pgd_t pgd = *pgdp; | 247 | pgd_t pgd = *pgdp; |
238 | 248 | ||
249 | #ifdef CONFIG_PPC64 | ||
239 | VM_BUG_ON(shift != mmu_psize_defs[get_slice_psize(mm, addr)].shift); | 250 | VM_BUG_ON(shift != mmu_psize_defs[get_slice_psize(mm, addr)].shift); |
251 | #endif | ||
240 | pr_debug(" %016lx: normal pgd %p\n", addr, | 252 | pr_debug(" %016lx: normal pgd %p\n", addr, |
241 | (void *)pgd_val(pgd)); | 253 | (void *)pgd_val(pgd)); |
242 | next = pgd_addr_end(addr, end); | 254 | next = pgd_addr_end(addr, end); |
@@ -279,3 +291,5 @@ slow_irqon: | |||
279 | return ret; | 291 | return ret; |
280 | } | 292 | } |
281 | } | 293 | } |
294 | |||
295 | #endif /* __HAVE_ARCH_PTE_SPECIAL */ | ||