Skip to content

Commit a6a8f7c

Browse files
chleroytorvalds
authored andcommitted
powerpc/8xx: add support for huge pages on VMAP and VMALLOC
powerpc 8xx has 4 page sizes: - 4k - 16k - 512k - 8M At the time being, vmalloc and vmap only support huge pages which are leaf at PMD level. Here the PMD level is 4M, it doesn't correspond to any supported page size. For now, implement use of 16k and 512k pages which is done at PTE level. Support of 8M pages will be implemented later, it requires vmalloc to support hugepd tables. Link: https://lkml.kernel.org/r/8b972f1c03fb6bd59953035f0a3e4d26659de4f8.1620795204.git.christophe.leroy@csgroup.eu Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Mike Kravetz <mike.kravetz@oracle.com> Cc: Mike Rapoport <rppt@kernel.org> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Uladzislau Rezki <uladzislau.rezki@sony.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 3382bbe commit a6a8f7c

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

arch/powerpc/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ config PPC
187187
select GENERIC_VDSO_TIME_NS
188188
select HAVE_ARCH_AUDITSYSCALL
189189
select HAVE_ARCH_HUGE_VMALLOC if HAVE_ARCH_HUGE_VMAP
190-
select HAVE_ARCH_HUGE_VMAP if PPC_BOOK3S_64 && PPC_RADIX_MMU
190+
select HAVE_ARCH_HUGE_VMAP if PPC_RADIX_MMU || PPC_8xx
191191
select HAVE_ARCH_JUMP_LABEL
192192
select HAVE_ARCH_JUMP_LABEL_RELATIVE
193193
select HAVE_ARCH_KASAN if PPC32 && PPC_PAGE_SHIFT <= 14

arch/powerpc/include/asm/nohash/32/mmu-8xx.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@
178178
#ifndef __ASSEMBLY__
179179

180180
#include <linux/mmdebug.h>
181+
#include <linux/sizes.h>
181182

182183
void mmu_pin_tlb(unsigned long top, bool readonly);
183184

@@ -225,6 +226,48 @@ static inline unsigned int mmu_psize_to_shift(unsigned int mmu_psize)
225226
BUG();
226227
}
227228

229+
static inline bool arch_vmap_try_size(unsigned long addr, unsigned long end, u64 pfn,
230+
unsigned int max_page_shift, unsigned long size)
231+
{
232+
if (end - addr < size)
233+
return false;
234+
235+
if ((1UL << max_page_shift) < size)
236+
return false;
237+
238+
if (!IS_ALIGNED(addr, size))
239+
return false;
240+
241+
if (!IS_ALIGNED(PFN_PHYS(pfn), size))
242+
return false;
243+
244+
return true;
245+
}
246+
247+
static inline unsigned long arch_vmap_pte_range_map_size(unsigned long addr, unsigned long end,
248+
u64 pfn, unsigned int max_page_shift)
249+
{
250+
if (arch_vmap_try_size(addr, end, pfn, max_page_shift, SZ_512K))
251+
return SZ_512K;
252+
if (PAGE_SIZE == SZ_16K)
253+
return SZ_16K;
254+
if (arch_vmap_try_size(addr, end, pfn, max_page_shift, SZ_16K))
255+
return SZ_16K;
256+
return PAGE_SIZE;
257+
}
258+
#define arch_vmap_pte_range_map_size arch_vmap_pte_range_map_size
259+
260+
static inline int arch_vmap_pte_supported_shift(unsigned long size)
261+
{
262+
if (size >= SZ_512K)
263+
return 19;
264+
else if (size >= SZ_16K)
265+
return 14;
266+
else
267+
return PAGE_SHIFT;
268+
}
269+
#define arch_vmap_pte_supported_shift arch_vmap_pte_supported_shift
270+
228271
/* patch sites */
229272
extern s32 patch__itlbmiss_exit_1, patch__dtlbmiss_exit_1;
230273
extern s32 patch__itlbmiss_perf, patch__dtlbmiss_perf;

0 commit comments

Comments
 (0)