Skip to content

Commit 10c1045

Browse files
Mel Gormantorvalds
authored andcommitted
mm: numa: avoid unnecessary TLB flushes when setting NUMA hinting entries
If a PTE or PMD is already marked NUMA when scanning to mark entries for NUMA hinting then it is not necessary to update the entry and incur a TLB flush penalty. Avoid the avoidhead where possible. Signed-off-by: Mel Gorman <mgorman@suse.de> Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Dave Jones <davej@redhat.com> Cc: Hugh Dickins <hughd@google.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Kirill Shutemov <kirill.shutemov@linux.intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Rik van Riel <riel@redhat.com> Cc: Sasha Levin <sasha.levin@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent c0e7cad commit 10c1045

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

mm/huge_memory.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1493,12 +1493,14 @@ int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
14931493
return 0;
14941494
}
14951495

1496-
ret = 1;
1497-
entry = pmdp_get_and_clear_notify(mm, addr, pmd);
1498-
entry = pmd_modify(entry, newprot);
1499-
ret = HPAGE_PMD_NR;
1500-
set_pmd_at(mm, addr, pmd, entry);
1501-
BUG_ON(pmd_write(entry));
1496+
if (!prot_numa || !pmd_protnone(*pmd)) {
1497+
ret = 1;
1498+
entry = pmdp_get_and_clear_notify(mm, addr, pmd);
1499+
entry = pmd_modify(entry, newprot);
1500+
ret = HPAGE_PMD_NR;
1501+
set_pmd_at(mm, addr, pmd, entry);
1502+
BUG_ON(pmd_write(entry));
1503+
}
15021504
spin_unlock(ptl);
15031505
}
15041506

mm/mprotect.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
8686
page = vm_normal_page(vma, addr, oldpte);
8787
if (!page || PageKsm(page))
8888
continue;
89+
90+
/* Avoid TLB flush if possible */
91+
if (pte_protnone(oldpte))
92+
continue;
8993
}
9094

9195
ptent = ptep_modify_prot_start(mm, addr, pte);

0 commit comments

Comments
 (0)