aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorAndrea Arcangeli <aarcange@redhat.com>2022-06-13 23:55:21 -0400
committerAndrea Arcangeli <aarcange@redhat.com>2023-11-11 22:03:38 -0500
commita567f6569380a7b5419f0c3cec5feee75a2b5cff (patch)
tree1a3cfc338b563cad9f1de08ba228758a2dbd3275
parente67f9e3a80496ceb47a5f31f1400599234a8fe24 (diff)
downloadaa-a567f6569380a7b5419f0c3cec5feee75a2b5cff.tar.gz
randprotect: mm: THP: preserved young bit in the THP split
page migration, in response to an AutoNUMA migrate-on-fault, should keep the pgtable young to avoid slowing down the next memory access. split_huge_page() or page migration for compaction or CMA are more neutral cases: the migration entry swpentry format has to be extended to retain also the young/old boolean information as it retains other pgtable bits already. In the meantime, it's preferable to set the young bit rather than to clear it, to avoid hurting performance post migration or post physical THP split. The below is a measurement of the time to read 10M of virtual memory after physical THP splits as those triggered by KSM and the respective number of dTLB misses as measured by perf. before: Duration = 740µs - 44,219 dTLB-load-misses:u after: Duration = 23µs - 5,198 dTLB-load-misses:u Cc: stable@kernel.org Fixes: e9b61f19858a ("thp: reintroduce split_huge_page()") Reported-by: Jonas Juffinger <jonas.juffinger@lamarr.at> Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
-rw-r--r--mm/huge_memory.c2
-rw-r--r--mm/migrate.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 6da963d3802839..6ffd1712d80560 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -3405,7 +3405,7 @@ void remove_migration_pmd(struct page_vma_mapped_walk *pvmw, struct page *new)
entry = pmd_to_swp_entry(*pvmw->pmd);
get_page(new);
- pmde = pmd_mkold(mk_huge_pmd(new, vma->vm_page_prot));
+ pmde = mk_huge_pmd(new, vma->vm_page_prot);
if (pmd_swp_soft_dirty(*pvmw->pmd))
pmde = pmd_mksoft_dirty(pmde);
if (is_writable_migration_entry(entry))
diff --git a/mm/migrate.c b/mm/migrate.c
index c7d5566623add5..cb463ad590d66e 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -203,7 +203,7 @@ static bool remove_migration_pte(struct page *page, struct vm_area_struct *vma,
#endif
get_page(new);
- pte = pte_mkold(mk_pte(new, READ_ONCE(vma->vm_page_prot)));
+ pte = mk_pte(new, READ_ONCE(vma->vm_page_prot));
if (pte_swp_soft_dirty(*pvmw.pte))
pte = pte_mksoft_dirty(pte);