mips, thp: remove infrastructure for handling splitting PMDs
With new refcounting we don't need to mark PMDs splitting. Let's drop code to handle this. pmdp_splitting_flush() is not needed too: on splitting PMD we will do pmdp_clear_flush() + set_pte_at(). pmdp_clear_flush() will do IPI as needed for fast_gup. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Sasha Levin <sasha.levin@oracle.com> Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Cc: Jerome Marchand <jmarchan@redhat.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Hugh Dickins <hughd@google.com> Cc: Dave Hansen <dave.hansen@intel.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Rik van Riel <riel@redhat.com> Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> Cc: Steve Capper <steve.capper@linaro.org> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Michal Hocko <mhocko@suse.cz> Cc: Christoph Lameter <cl@linux.com> Cc: David Rientjes <rientjes@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
0ebd744615
commit
b27873702b
@ -131,14 +131,12 @@
|
|||||||
/* Huge TLB page */
|
/* Huge TLB page */
|
||||||
#define _PAGE_HUGE_SHIFT (_PAGE_MODIFIED_SHIFT + 1)
|
#define _PAGE_HUGE_SHIFT (_PAGE_MODIFIED_SHIFT + 1)
|
||||||
#define _PAGE_HUGE (1 << _PAGE_HUGE_SHIFT)
|
#define _PAGE_HUGE (1 << _PAGE_HUGE_SHIFT)
|
||||||
#define _PAGE_SPLITTING_SHIFT (_PAGE_HUGE_SHIFT + 1)
|
|
||||||
#define _PAGE_SPLITTING (1 << _PAGE_SPLITTING_SHIFT)
|
|
||||||
#endif /* CONFIG_64BIT && CONFIG_MIPS_HUGE_TLB_SUPPORT */
|
#endif /* CONFIG_64BIT && CONFIG_MIPS_HUGE_TLB_SUPPORT */
|
||||||
|
|
||||||
#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
|
#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
|
||||||
/* XI - page cannot be executed */
|
/* XI - page cannot be executed */
|
||||||
#ifdef _PAGE_SPLITTING_SHIFT
|
#ifdef _PAGE_HUGE_SHIFT
|
||||||
#define _PAGE_NO_EXEC_SHIFT (_PAGE_SPLITTING_SHIFT + 1)
|
#define _PAGE_NO_EXEC_SHIFT (_PAGE_HUGE_SHIFT + 1)
|
||||||
#else
|
#else
|
||||||
#define _PAGE_NO_EXEC_SHIFT (_PAGE_MODIFIED_SHIFT + 1)
|
#define _PAGE_NO_EXEC_SHIFT (_PAGE_MODIFIED_SHIFT + 1)
|
||||||
#endif
|
#endif
|
||||||
@ -153,8 +151,8 @@
|
|||||||
|
|
||||||
#if defined(_PAGE_NO_READ_SHIFT)
|
#if defined(_PAGE_NO_READ_SHIFT)
|
||||||
#define _PAGE_GLOBAL_SHIFT (_PAGE_NO_READ_SHIFT + 1)
|
#define _PAGE_GLOBAL_SHIFT (_PAGE_NO_READ_SHIFT + 1)
|
||||||
#elif defined(_PAGE_SPLITTING_SHIFT)
|
#elif defined(_PAGE_HUGE_SHIFT)
|
||||||
#define _PAGE_GLOBAL_SHIFT (_PAGE_SPLITTING_SHIFT + 1)
|
#define _PAGE_GLOBAL_SHIFT (_PAGE_HUGE_SHIFT + 1)
|
||||||
#else
|
#else
|
||||||
#define _PAGE_GLOBAL_SHIFT (_PAGE_MODIFIED_SHIFT + 1)
|
#define _PAGE_GLOBAL_SHIFT (_PAGE_MODIFIED_SHIFT + 1)
|
||||||
#endif
|
#endif
|
||||||
|
@ -482,27 +482,9 @@ static inline pmd_t pmd_mkhuge(pmd_t pmd)
|
|||||||
return pmd;
|
return pmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int pmd_trans_splitting(pmd_t pmd)
|
|
||||||
{
|
|
||||||
return !!(pmd_val(pmd) & _PAGE_SPLITTING);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline pmd_t pmd_mksplitting(pmd_t pmd)
|
|
||||||
{
|
|
||||||
pmd_val(pmd) |= _PAGE_SPLITTING;
|
|
||||||
|
|
||||||
return pmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void set_pmd_at(struct mm_struct *mm, unsigned long addr,
|
extern void set_pmd_at(struct mm_struct *mm, unsigned long addr,
|
||||||
pmd_t *pmdp, pmd_t pmd);
|
pmd_t *pmdp, pmd_t pmd);
|
||||||
|
|
||||||
#define __HAVE_ARCH_PMDP_SPLITTING_FLUSH
|
|
||||||
/* Extern to avoid header file madness */
|
|
||||||
extern void pmdp_splitting_flush(struct vm_area_struct *vma,
|
|
||||||
unsigned long address,
|
|
||||||
pmd_t *pmdp);
|
|
||||||
|
|
||||||
#define __HAVE_ARCH_PMD_WRITE
|
#define __HAVE_ARCH_PMD_WRITE
|
||||||
static inline int pmd_write(pmd_t pmd)
|
static inline int pmd_write(pmd_t pmd)
|
||||||
{
|
{
|
||||||
|
@ -107,18 +107,7 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end,
|
|||||||
pmd_t pmd = *pmdp;
|
pmd_t pmd = *pmdp;
|
||||||
|
|
||||||
next = pmd_addr_end(addr, end);
|
next = pmd_addr_end(addr, end);
|
||||||
/*
|
if (pmd_none(pmd))
|
||||||
* The pmd_trans_splitting() check below explains why
|
|
||||||
* pmdp_splitting_flush has to flush the tlb, to stop
|
|
||||||
* this gup-fast code from running while we set the
|
|
||||||
* splitting bit in the pmd. Returning zero will take
|
|
||||||
* the slow path that will call wait_split_huge_page()
|
|
||||||
* if the pmd is still in splitting state. gup-fast
|
|
||||||
* can't because it has irq disabled and
|
|
||||||
* wait_split_huge_page() would never return as the
|
|
||||||
* tlb flush IPI wouldn't run.
|
|
||||||
*/
|
|
||||||
if (pmd_none(pmd) || pmd_trans_splitting(pmd))
|
|
||||||
return 0;
|
return 0;
|
||||||
if (unlikely(pmd_huge(pmd))) {
|
if (unlikely(pmd_huge(pmd))) {
|
||||||
if (!gup_huge_pmd(pmd, addr, next, write, pages,nr))
|
if (!gup_huge_pmd(pmd, addr, next, write, pages,nr))
|
||||||
|
@ -62,20 +62,6 @@ void pmd_init(unsigned long addr, unsigned long pagetable)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
|
||||||
|
|
||||||
void pmdp_splitting_flush(struct vm_area_struct *vma,
|
|
||||||
unsigned long address,
|
|
||||||
pmd_t *pmdp)
|
|
||||||
{
|
|
||||||
if (!pmd_trans_splitting(*pmdp)) {
|
|
||||||
pmd_t pmd = pmd_mksplitting(*pmdp);
|
|
||||||
set_pmd_at(vma->vm_mm, address, pmdp, pmd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pmd_t mk_pmd(struct page *page, pgprot_t prot)
|
pmd_t mk_pmd(struct page *page, pgprot_t prot)
|
||||||
{
|
{
|
||||||
pmd_t pmd;
|
pmd_t pmd;
|
||||||
|
@ -240,7 +240,6 @@ static void output_pgtable_bits_defines(void)
|
|||||||
pr_define("_PAGE_MODIFIED_SHIFT %d\n", _PAGE_MODIFIED_SHIFT);
|
pr_define("_PAGE_MODIFIED_SHIFT %d\n", _PAGE_MODIFIED_SHIFT);
|
||||||
#ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
|
#ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
|
||||||
pr_define("_PAGE_HUGE_SHIFT %d\n", _PAGE_HUGE_SHIFT);
|
pr_define("_PAGE_HUGE_SHIFT %d\n", _PAGE_HUGE_SHIFT);
|
||||||
pr_define("_PAGE_SPLITTING_SHIFT %d\n", _PAGE_SPLITTING_SHIFT);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_CPU_MIPSR2
|
#ifdef CONFIG_CPU_MIPSR2
|
||||||
if (cpu_has_rixi) {
|
if (cpu_has_rixi) {
|
||||||
|
Loading…
Reference in New Issue
Block a user