diff options
author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2016-04-29 09:26:09 -0400 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2016-05-11 07:53:46 -0400 |
commit | 764041e0f43cc7846f6d8eb246d65b53cc06c764 (patch) | |
tree | 1930ed5310ec45c5044e7deef802700c3dcb6e5d | |
parent | d8c476eeb697c9aac46b390e9cbd7af7032814f1 (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.c | 16 |
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 |