mm/migrate: convert isolate_movable_page() to use folios

Removes 6 calls to compound_head() and prepares the function to take in a
folio instead of page argument.

Link: https://lkml.kernel.org/r/20230130214352.40538-4-vishal.moola@gmail.com
Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
Cc: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Vishal Moola (Oracle) 2023-01-30 13:43:51 -08:00 committed by Andrew Morton
parent da707a6d18
commit 19979497c0
1 changed files with 20 additions and 19 deletions

View File

@ -60,6 +60,7 @@
int isolate_movable_page(struct page *page, isolate_mode_t mode)
{
struct folio *folio = folio_get_nontail_page(page);
const struct movable_operations *mops;
/*
@ -71,11 +72,11 @@ int isolate_movable_page(struct page *page, isolate_mode_t mode)
* the put_page() at the end of this block will take care of
* release this page, thus avoiding a nasty leakage.
*/
if (unlikely(!get_page_unless_zero(page)))
if (!folio)
goto out;
if (unlikely(PageSlab(page)))
goto out_putpage;
if (unlikely(folio_test_slab(folio)))
goto out_putfolio;
/* Pairs with smp_wmb() in slab freeing, e.g. SLUB's __free_slab() */
smp_rmb();
/*
@ -83,12 +84,12 @@ int isolate_movable_page(struct page *page, isolate_mode_t mode)
* we use non-atomic bitops on newly allocated page flags so
* unconditionally grabbing the lock ruins page's owner side.
*/
if (unlikely(!__PageMovable(page)))
goto out_putpage;
if (unlikely(!__folio_test_movable(folio)))
goto out_putfolio;
/* Pairs with smp_wmb() in slab allocation, e.g. SLUB's alloc_slab_page() */
smp_rmb();
if (unlikely(PageSlab(page)))
goto out_putpage;
if (unlikely(folio_test_slab(folio)))
goto out_putfolio;
/*
* As movable pages are not isolated from LRU lists, concurrent
@ -101,29 +102,29 @@ int isolate_movable_page(struct page *page, isolate_mode_t mode)
* lets be sure we have the page lock
* before proceeding with the movable page isolation steps.
*/
if (unlikely(!trylock_page(page)))
goto out_putpage;
if (unlikely(!folio_trylock(folio)))
goto out_putfolio;
if (!PageMovable(page) || PageIsolated(page))
if (!folio_test_movable(folio) || folio_test_isolated(folio))
goto out_no_isolated;
mops = page_movable_ops(page);
VM_BUG_ON_PAGE(!mops, page);
mops = folio_movable_ops(folio);
VM_BUG_ON_FOLIO(!mops, folio);
if (!mops->isolate_page(page, mode))
if (!mops->isolate_page(&folio->page, mode))
goto out_no_isolated;
/* Driver shouldn't use PG_isolated bit of page->flags */
WARN_ON_ONCE(PageIsolated(page));
SetPageIsolated(page);
unlock_page(page);
WARN_ON_ONCE(folio_test_isolated(folio));
folio_set_isolated(folio);
folio_unlock(folio);
return 0;
out_no_isolated:
unlock_page(page);
out_putpage:
put_page(page);
folio_unlock(folio);
out_putfolio:
folio_put(folio);
out:
return -EBUSY;
}