提交 6cc1a0ee 编写于 作者: A Aneesh Kumar K.V 提交者: Michael Ellerman

powerpc/mm/radix: Add radix callback for pmd accessors

This only does 64K Linux page support for now. 64K hash Linux config
THP needs to differentiate it from hugetlb huge page because with THP we
need to track hash pte slot information with respect to each subpage.
This is not needed with hugetlb hugepage, because we don't do MPSS with
hugetlb.

Radix doesn't have any such restrictions.
Signed-off-by: NAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: NMichael Ellerman <mpe@ellerman.id.au>
上级 a9252aae
...@@ -97,8 +97,8 @@ extern bool __rpte_sub_valid(real_pte_t rpte, unsigned long index); ...@@ -97,8 +97,8 @@ extern bool __rpte_sub_valid(real_pte_t rpte, unsigned long index);
extern int remap_pfn_range(struct vm_area_struct *, unsigned long addr, extern int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
unsigned long pfn, unsigned long size, pgprot_t); unsigned long pfn, unsigned long size, pgprot_t);
static inline int remap_4k_pfn(struct vm_area_struct *vma, unsigned long addr, static inline int hash__remap_4k_pfn(struct vm_area_struct *vma, unsigned long addr,
unsigned long pfn, pgprot_t prot) unsigned long pfn, pgprot_t prot)
{ {
if (pfn > (PTE_RPN_MASK >> PAGE_SHIFT)) { if (pfn > (PTE_RPN_MASK >> PAGE_SHIFT)) {
WARN(1, "remap_4k_pfn called with wrong pfn value\n"); WARN(1, "remap_4k_pfn called with wrong pfn value\n");
...@@ -182,14 +182,13 @@ static inline void mark_hpte_slot_valid(unsigned char *hpte_slot_array, ...@@ -182,14 +182,13 @@ static inline void mark_hpte_slot_valid(unsigned char *hpte_slot_array,
* that for explicit huge pages. * that for explicit huge pages.
* *
*/ */
static inline int pmd_trans_huge(pmd_t pmd) static inline int hash__pmd_trans_huge(pmd_t pmd)
{ {
return !!((pmd_val(pmd) & (_PAGE_PTE | H_PAGE_THP_HUGE)) == return !!((pmd_val(pmd) & (_PAGE_PTE | H_PAGE_THP_HUGE)) ==
(_PAGE_PTE | H_PAGE_THP_HUGE)); (_PAGE_PTE | H_PAGE_THP_HUGE));
} }
#define __HAVE_ARCH_PMD_SAME static inline int hash__pmd_same(pmd_t pmd_a, pmd_t pmd_b)
static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b)
{ {
return (((pmd_raw(pmd_a) ^ pmd_raw(pmd_b)) & ~cpu_to_be64(_PAGE_HPTEFLAGS)) == 0); return (((pmd_raw(pmd_a) ^ pmd_raw(pmd_b)) & ~cpu_to_be64(_PAGE_HPTEFLAGS)) == 0);
} }
......
...@@ -89,6 +89,29 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm, unsigned long addr, ...@@ -89,6 +89,29 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm, unsigned long addr,
pmd_hugepage_update(mm, addr, pmdp, _PAGE_WRITE, 0); pmd_hugepage_update(mm, addr, pmdp, _PAGE_WRITE, 0);
} }
static inline int pmd_trans_huge(pmd_t pmd)
{
if (radix_enabled())
return radix__pmd_trans_huge(pmd);
return hash__pmd_trans_huge(pmd);
}
#define __HAVE_ARCH_PMD_SAME
static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b)
{
if (radix_enabled())
return radix__pmd_same(pmd_a, pmd_b);
return hash__pmd_same(pmd_a, pmd_b);
}
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
static inline int remap_4k_pfn(struct vm_area_struct *vma, unsigned long addr,
unsigned long pfn, pgprot_t prot)
{
if (radix_enabled())
BUG();
return hash__remap_4k_pfn(vma, addr, pfn, prot);
}
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /*_ASM_POWERPC_BOOK3S_64_PGTABLE_64K_H */ #endif /*_ASM_POWERPC_BOOK3S_64_PGTABLE_64K_H */
...@@ -121,5 +121,14 @@ static inline int radix__pgd_bad(pgd_t pgd) ...@@ -121,5 +121,14 @@ static inline int radix__pgd_bad(pgd_t pgd)
return !!(pgd_val(pgd) & RADIX_PGD_BAD_BITS); return !!(pgd_val(pgd) & RADIX_PGD_BAD_BITS);
} }
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
static inline int radix__pmd_trans_huge(pmd_t pmd)
{
return !!(pmd_val(pmd) & _PAGE_PTE);
}
#endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册