Re: [PATCH -next v2 1/2] mm: compaction: convert to use a folio in isolate_migratepages_block()

From: Kefeng Wang
Date: Wed Jun 21 2023 - 04:36:28 EST




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@xxxxxxxxxx>
---
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@xxxxxxxxxxxxxxxxxxxx/