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:
parent
da707a6d18
commit
19979497c0
39
mm/migrate.c
39
mm/migrate.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue