Messages in this thread | | | Date | Wed, 21 Jun 2023 14:20:13 +0800 | Subject | Re: [PATCH -next v2 1/2] mm: compaction: convert to use a folio in isolate_migratepages_block() | From | Baolin Wang <> |
| |
Hi
On 6/19/2023 7:07 PM, Kefeng Wang wrote: > Directly use a folio instead of page_folio() when page successfully > isolated (hugepage and movable page) and after folio_get_nontail_page(), > which removes several calls to compound_head(). > > Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> > --- > v2: > - update comments and use node_stat_mod_folio, per Matthew Wilcox > - add missed PageLRU conversion and rebase on next-20230619 > > mm/compaction.c | 84 ++++++++++++++++++++++++++----------------------- > 1 file changed, 44 insertions(+), 40 deletions(-) > > diff --git a/mm/compaction.c b/mm/compaction.c > index 6149a2d324be..0334eefe4bfa 100644 > --- a/mm/compaction.c > +++ b/mm/compaction.c > @@ -795,6 +795,7 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, > struct lruvec *lruvec; > unsigned long flags = 0; > struct lruvec *locked = NULL; > + struct folio *folio = NULL; > struct page *page = NULL, *valid_page = NULL; > struct address_space *mapping; > unsigned long start_pfn = low_pfn; > @@ -891,7 +892,7 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, > if (!valid_page && pageblock_aligned(low_pfn)) { > if (!isolation_suitable(cc, page)) { > low_pfn = end_pfn; > - page = NULL; > + folio = NULL; > goto isolate_abort; > } > valid_page = page; > @@ -923,7 +924,8 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, > * Hugepage was successfully isolated and placed > * on the cc->migratepages list. > */ > - low_pfn += compound_nr(page) - 1; > + folio = page_folio(page); > + low_pfn += folio_nr_pages(folio) - 1; > goto isolate_success_no_list; > } > > @@ -991,8 +993,10 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, > locked = NULL; > } > > - if (isolate_movable_page(page, mode)) > + if (isolate_movable_page(page, mode)) { > + folio = page_folio(page); > goto isolate_success; > + } > } > > goto isolate_fail; > @@ -1003,7 +1007,8 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, > * sure the page is not being freed elsewhere -- the > * page release code relies on it. > */ > - if (unlikely(!get_page_unless_zero(page))) > + folio = folio_get_nontail_page(page);
I'm just curious, how can you make sure the 'page' is not a tail page? Since the validation is lockless.
| |