Messages in this thread | | | Date | Wed, 21 Jun 2023 17:11:15 +0800 | Subject | Re: [PATCH -next v2 1/2] mm: compaction: convert to use a folio in isolate_migratepages_block() | From | Baolin Wang <> |
| |
On 6/21/2023 4:36 PM, Kefeng Wang wrote: > > > On 2023/6/21 14:20, Baolin Wang wrote: >> 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. > > folio_get_nontail_page is added by commit "3c1ea2c729ef (mm: add > folio_get_nontail_page())", see more comments [1] > > [1] https://lore.kernel.org/lkml/Y86sRiKAAOz2myNe@casper.infradead.org/
I see. Thanks for sharing. The changes look good to me at least. Please feel free to add: Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
| |