aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>2016-04-29 09:26:09 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2016-05-11 07:53:46 -0400
commit764041e0f43cc7846f6d8eb246d65b53cc06c764 (patch)
tree1930ed5310ec45c5044e7deef802700c3dcb6e5d
parentd8c476eeb697c9aac46b390e9cbd7af7032814f1 (diff)
powerpc/mm/radix: Add checks in slice code to catch radix usage
Radix doesn't need slice support. Catch incorrect usage of slice code when radix is enabled. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r--arch/powerpc/mm/slice.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c
index ee21b8699cee..2b27458902ee 100644
--- a/arch/powerpc/mm/slice.c
+++ b/arch/powerpc/mm/slice.c
@@ -395,6 +395,7 @@ unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len,
395 395
396 /* Sanity checks */ 396 /* Sanity checks */
397 BUG_ON(mm->task_size == 0); 397 BUG_ON(mm->task_size == 0);
398 VM_BUG_ON(radix_enabled());
398 399
399 slice_dbg("slice_get_unmapped_area(mm=%p, psize=%d...\n", mm, psize); 400 slice_dbg("slice_get_unmapped_area(mm=%p, psize=%d...\n", mm, psize);
400 slice_dbg(" addr=%lx, len=%lx, flags=%lx, topdown=%d\n", 401 slice_dbg(" addr=%lx, len=%lx, flags=%lx, topdown=%d\n",
@@ -568,6 +569,16 @@ unsigned int get_slice_psize(struct mm_struct *mm, unsigned long addr)
568 unsigned char *hpsizes; 569 unsigned char *hpsizes;
569 int index, mask_index; 570 int index, mask_index;
570 571
572 /*
573 * Radix doesn't use slice, but can get enabled along with MMU_SLICE
574 */
575 if (radix_enabled()) {
576#ifdef CONFIG_PPC_64K_PAGES
577 return MMU_PAGE_64K;
578#else
579 return MMU_PAGE_4K;
580#endif
581 }
571 if (addr < SLICE_LOW_TOP) { 582 if (addr < SLICE_LOW_TOP) {
572 u64 lpsizes; 583 u64 lpsizes;
573 lpsizes = mm->context.low_slices_psize; 584 lpsizes = mm->context.low_slices_psize;
@@ -605,6 +616,7 @@ void slice_set_user_psize(struct mm_struct *mm, unsigned int psize)
605 616
606 slice_dbg("slice_set_user_psize(mm=%p, psize=%d)\n", mm, psize); 617 slice_dbg("slice_set_user_psize(mm=%p, psize=%d)\n", mm, psize);
607 618
619 VM_BUG_ON(radix_enabled());
608 spin_lock_irqsave(&slice_convert_lock, flags); 620 spin_lock_irqsave(&slice_convert_lock, flags);
609 621
610 old_psize = mm->context.user_psize; 622 old_psize = mm->context.user_psize;
@@ -649,6 +661,7 @@ void slice_set_range_psize(struct mm_struct *mm, unsigned long start,
649{ 661{
650 struct slice_mask mask = slice_range_to_mask(start, len); 662 struct slice_mask mask = slice_range_to_mask(start, len);
651 663
664 VM_BUG_ON(radix_enabled());
652 slice_convert(mm, mask, psize); 665 slice_convert(mm, mask, psize);
653} 666}
654 667
@@ -678,6 +691,9 @@ int is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
678 struct slice_mask mask, available; 691 struct slice_mask mask, available;
679 unsigned int psize = mm->context.user_psize; 692 unsigned int psize = mm->context.user_psize;
680 693
694 if (radix_enabled())
695 return 0;
696
681 mask = slice_range_to_mask(addr, len); 697 mask = slice_range_to_mask(addr, len);
682 available = slice_mask_for_size(mm, psize); 698 available = slice_mask_for_size(mm, psize);
683#ifdef CONFIG_PPC_64K_PAGES 699#ifdef CONFIG_PPC_64K_PAGES