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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux