mm/migrate: move NUMA hinting fault folio isolation + checks under PTL
BugLink: https://bugs.launchpad.net/bugs/2076866 Currently we always take a folio reference even if migration will not even be tried or isolation failed, requiring us to grab+drop an additional reference. Further, we end up calling folio_likely_mapped_shared() while the folio might have already been unmapped, because after we dropped the PTL, that can easily happen. We want to stop touching mapcounts and friends from such context, and only call folio_likely_mapped_shared() while the folio is still mapped: mapcount information is pretty much stale and unreliable otherwise. So let's move checks into numamigrate_isolate_folio(), rename that function to migrate_misplaced_folio_prepare(), and call that function from callsites where we call migrate_misplaced_folio(), but still with the PTL held. We can now stop taking temporary folio references, and really only take a reference if folio isolation succeeded. Doing the folio_likely_mapped_shared() + folio isolation under PT lock is now similar to how we handle MADV_PAGEOUT. While at it, combine the folio_is_file_lru() checks. [david@redhat.com: fix list_del() corruption] Link: https://lkml.kernel.org/r/8f85c31a-e603-4578-bf49-136dae0d4b69@redhat.com Link: https://lkml.kernel.org/r/20240626191129.658CFC32782@smtp.kernel.org Link: https://lkml.kernel.org/r/20240620212935.656243-3-david@redhat.com Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com> Reviewed-by: Zi Yan <ziy@nvidia.com> Tested-by: Donet Tom <donettom@linux.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> (cherry picked from commit ee86814b0562f18255b55c5e6a01a022895994cf) Signed-off-by: Frank Heimes <frank.heimes@canonical.com> Acked-by: Stefan Bader <stefan.bader@canonical.com> Acked-by: Mehmet Basaran <mehmet.basaran@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
This commit is contained in:
committed by
Stefan Bader
parent
b33fe324c0
commit
44fa32600e
+5
-4
@@ -4906,8 +4906,6 @@ int numa_migrate_prep(struct folio *folio, struct vm_fault *vmf,
|
||||
{
|
||||
struct vm_area_struct *vma = vmf->vma;
|
||||
|
||||
folio_get(folio);
|
||||
|
||||
/* Record the current PID acceesing VMA */
|
||||
vma_set_access_pid_bit(vma);
|
||||
|
||||
@@ -5038,10 +5036,13 @@ static vm_fault_t do_numa_page(struct vm_fault *vmf)
|
||||
else
|
||||
last_cpupid = folio_last_cpupid(folio);
|
||||
target_nid = numa_migrate_prep(folio, vmf, vmf->address, nid, &flags);
|
||||
if (target_nid == NUMA_NO_NODE) {
|
||||
folio_put(folio);
|
||||
if (target_nid == NUMA_NO_NODE)
|
||||
goto out_map;
|
||||
if (migrate_misplaced_folio_prepare(folio, vma, target_nid)) {
|
||||
flags |= TNF_MIGRATE_FAIL;
|
||||
goto out_map;
|
||||
}
|
||||
/* The folio is isolated and isolation code holds a folio reference. */
|
||||
pte_unmap_unlock(vmf->pte, vmf->ptl);
|
||||
writable = false;
|
||||
ignore_writable = true;
|
||||
|
||||
Reference in New Issue
Block a user