diff options
-rw-r--r-- | arch/powerpc/include/asm/pgtable-ppc64.h | 2 | ||||
-rw-r--r-- | arch/powerpc/mm/pgtable_64.c | 14 | ||||
-rw-r--r-- | arch/powerpc/mm/tlb_hash64.c | 2 |
3 files changed, 13 insertions, 5 deletions
diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h index eb9261024f51..7b3d54fae46f 100644 --- a/arch/powerpc/include/asm/pgtable-ppc64.h +++ b/arch/powerpc/include/asm/pgtable-ppc64.h | |||
@@ -413,7 +413,7 @@ static inline char *get_hpte_slot_array(pmd_t *pmdp) | |||
413 | } | 413 | } |
414 | 414 | ||
415 | extern void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, | 415 | extern void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, |
416 | pmd_t *pmdp); | 416 | pmd_t *pmdp, unsigned long old_pmd); |
417 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 417 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
418 | extern pmd_t pfn_pmd(unsigned long pfn, pgprot_t pgprot); | 418 | extern pmd_t pfn_pmd(unsigned long pfn, pgprot_t pgprot); |
419 | extern pmd_t mk_pmd(struct page *page, pgprot_t pgprot); | 419 | extern pmd_t mk_pmd(struct page *page, pgprot_t pgprot); |
diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c index 5039f3b04d6e..948a81e02ddb 100644 --- a/arch/powerpc/mm/pgtable_64.c +++ b/arch/powerpc/mm/pgtable_64.c | |||
@@ -538,7 +538,7 @@ unsigned long pmd_hugepage_update(struct mm_struct *mm, unsigned long addr, | |||
538 | *pmdp = __pmd((old & ~clr) | set); | 538 | *pmdp = __pmd((old & ~clr) | set); |
539 | #endif | 539 | #endif |
540 | if (old & _PAGE_HASHPTE) | 540 | if (old & _PAGE_HASHPTE) |
541 | hpte_do_hugepage_flush(mm, addr, pmdp); | 541 | hpte_do_hugepage_flush(mm, addr, pmdp, old); |
542 | return old; | 542 | return old; |
543 | } | 543 | } |
544 | 544 | ||
@@ -645,7 +645,7 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, | |||
645 | if (!(old & _PAGE_SPLITTING)) { | 645 | if (!(old & _PAGE_SPLITTING)) { |
646 | /* We need to flush the hpte */ | 646 | /* We need to flush the hpte */ |
647 | if (old & _PAGE_HASHPTE) | 647 | if (old & _PAGE_HASHPTE) |
648 | hpte_do_hugepage_flush(vma->vm_mm, address, pmdp); | 648 | hpte_do_hugepage_flush(vma->vm_mm, address, pmdp, old); |
649 | } | 649 | } |
650 | /* | 650 | /* |
651 | * This ensures that generic code that rely on IRQ disabling | 651 | * This ensures that generic code that rely on IRQ disabling |
@@ -723,7 +723,7 @@ void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, | |||
723 | * neesd to be flushed. | 723 | * neesd to be flushed. |
724 | */ | 724 | */ |
725 | void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, | 725 | void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, |
726 | pmd_t *pmdp) | 726 | pmd_t *pmdp, unsigned long old_pmd) |
727 | { | 727 | { |
728 | int ssize, i; | 728 | int ssize, i; |
729 | unsigned long s_addr; | 729 | unsigned long s_addr; |
@@ -746,7 +746,15 @@ void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, | |||
746 | return; | 746 | return; |
747 | 747 | ||
748 | /* get the base page size,vsid and segment size */ | 748 | /* get the base page size,vsid and segment size */ |
749 | #ifdef CONFIG_DEBUG_VM | ||
749 | psize = get_slice_psize(mm, s_addr); | 750 | psize = get_slice_psize(mm, s_addr); |
751 | BUG_ON(psize == MMU_PAGE_16M); | ||
752 | #endif | ||
753 | if (old_pmd & _PAGE_COMBO) | ||
754 | psize = MMU_PAGE_4K; | ||
755 | else | ||
756 | psize = MMU_PAGE_64K; | ||
757 | |||
750 | if (!is_kernel_addr(s_addr)) { | 758 | if (!is_kernel_addr(s_addr)) { |
751 | ssize = user_segment_size(s_addr); | 759 | ssize = user_segment_size(s_addr); |
752 | vsid = get_vsid(mm->context.id, s_addr, ssize); | 760 | vsid = get_vsid(mm->context.id, s_addr, ssize); |
diff --git a/arch/powerpc/mm/tlb_hash64.c b/arch/powerpc/mm/tlb_hash64.c index c99f6510a0b2..9adda5790463 100644 --- a/arch/powerpc/mm/tlb_hash64.c +++ b/arch/powerpc/mm/tlb_hash64.c | |||
@@ -216,7 +216,7 @@ void __flush_hash_table_range(struct mm_struct *mm, unsigned long start, | |||
216 | if (!(pte & _PAGE_HASHPTE)) | 216 | if (!(pte & _PAGE_HASHPTE)) |
217 | continue; | 217 | continue; |
218 | if (unlikely(hugepage_shift && pmd_trans_huge(*(pmd_t *)pte))) | 218 | if (unlikely(hugepage_shift && pmd_trans_huge(*(pmd_t *)pte))) |
219 | hpte_do_hugepage_flush(mm, start, (pmd_t *)pte); | 219 | hpte_do_hugepage_flush(mm, start, (pmd_t *)ptep, pte); |
220 | else | 220 | else |
221 | hpte_need_flush(mm, start, ptep, pte, 0); | 221 | hpte_need_flush(mm, start, ptep, pte, 0); |
222 | } | 222 | } |