mm/rmap: split migration into its own function
Migration is currently implemented as a mode of operation for try_to_unmap_one() generally specified by passing the TTU_MIGRATION flag or in the case of splitting a huge anonymous page TTU_SPLIT_FREEZE. However it does not have much in common with the rest of the unmap functionality of try_to_unmap_one() and thus splitting it into a separate function reduces the complexity of try_to_unmap_one() making it more readable. Several simplifications can also be made in try_to_migrate_one() based on the following observations: - All users of TTU_MIGRATION also set TTU_IGNORE_MLOCK. - No users of TTU_MIGRATION ever set TTU_IGNORE_HWPOISON. - No users of TTU_MIGRATION ever set TTU_BATCH_FLUSH. TTU_SPLIT_FREEZE is a special case of migration used when splitting an anonymous page. This is most easily dealt with by calling the correct function from unmap_page() in mm/huge_memory.c - either try_to_migrate() for PageAnon or try_to_unmap(). Link: https://lkml.kernel.org/r/20210616105937.23201-5-apopple@nvidia.com Signed-off-by: Alistair Popple <apopple@nvidia.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Ralph Campbell <rcampbell@nvidia.com> Cc: Ben Skeggs <bskeggs@redhat.com> Cc: Hugh Dickins <hughd@google.com> Cc: Jason Gunthorpe <jgg@nvidia.com> Cc: John Hubbard <jhubbard@nvidia.com> Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org> Cc: Peter Xu <peterx@redhat.com> Cc: Shakeel Butt <shakeelb@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:
committed by
Linus Torvalds
parent
cd62734ca6
commit
a98a2f0c8c
@@ -1109,7 +1109,7 @@ static int __unmap_and_move(struct page *page, struct page *newpage,
|
||||
/* Establish migration ptes */
|
||||
VM_BUG_ON_PAGE(PageAnon(page) && !PageKsm(page) && !anon_vma,
|
||||
page);
|
||||
try_to_unmap(page, TTU_MIGRATION|TTU_IGNORE_MLOCK);
|
||||
try_to_migrate(page, 0);
|
||||
page_was_mapped = 1;
|
||||
}
|
||||
|
||||
@@ -1311,7 +1311,7 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
|
||||
|
||||
if (page_mapped(hpage)) {
|
||||
bool mapping_locked = false;
|
||||
enum ttu_flags ttu = TTU_MIGRATION|TTU_IGNORE_MLOCK;
|
||||
enum ttu_flags ttu = 0;
|
||||
|
||||
if (!PageAnon(hpage)) {
|
||||
/*
|
||||
@@ -1328,7 +1328,7 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
|
||||
ttu |= TTU_RMAP_LOCKED;
|
||||
}
|
||||
|
||||
try_to_unmap(hpage, ttu);
|
||||
try_to_migrate(hpage, ttu);
|
||||
page_was_mapped = 1;
|
||||
|
||||
if (mapping_locked)
|
||||
@@ -2602,7 +2602,6 @@ static void migrate_vma_prepare(struct migrate_vma *migrate)
|
||||
*/
|
||||
static void migrate_vma_unmap(struct migrate_vma *migrate)
|
||||
{
|
||||
int flags = TTU_MIGRATION | TTU_IGNORE_MLOCK;
|
||||
const unsigned long npages = migrate->npages;
|
||||
const unsigned long start = migrate->start;
|
||||
unsigned long addr, i, restore = 0;
|
||||
@@ -2614,7 +2613,7 @@ static void migrate_vma_unmap(struct migrate_vma *migrate)
|
||||
continue;
|
||||
|
||||
if (page_mapped(page)) {
|
||||
try_to_unmap(page, flags);
|
||||
try_to_migrate(page, 0);
|
||||
if (page_mapped(page))
|
||||
goto restore;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user