Commit 31189e7e authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Liu Shixin
Browse files

mm: convert isolate_page() to mf_isolate_folio()

mainline inclusion
from mainline-v6.8-rc1
commit 761d79fbad2a424a240a351b898b54eb674d3bdc
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAO6NS

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=761d79fbad2a424a240a351b898b54eb674d3bdc

--------------------------------

The only caller now has a folio, so pass it in and operate on it.  Saves
many page->folio conversions and introduces only one folio->page
conversion when calling isolate_movable_page().

Link: https://lkml.kernel.org/r/20231108182809.602073-6-willy@infradead.org


Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Conflicts:
	mm/memory-failure.c
[ Context conflicts with commit 6eedb5f3 ]
Signed-off-by: default avatarLiu Shixin <liushixin2@huawei.com>
parent 53af00c6
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -2648,37 +2648,37 @@ int soft_online_page(unsigned long pfn)
}
EXPORT_SYMBOL_GPL(soft_online_page);

static bool isolate_page(struct page *page, struct list_head *pagelist)
static bool mf_isolate_folio(struct folio *folio, struct list_head *pagelist)
{
	bool isolated = false;

	if (PageHuge(page)) {
		isolated = isolate_hugetlb(page_folio(page), pagelist);
	if (folio_test_hugetlb(folio)) {
		isolated = isolate_hugetlb(folio, pagelist);
	} else {
		bool lru = !__PageMovable(page);
		bool lru = !__folio_test_movable(folio);

		if (lru)
			isolated = isolate_lru_page(page);
			isolated = folio_isolate_lru(folio);
		else
			isolated = isolate_movable_page(page,
			isolated = isolate_movable_page(&folio->page,
							ISOLATE_UNEVICTABLE);

		if (isolated) {
			list_add(&page->lru, pagelist);
			list_add(&folio->lru, pagelist);
			if (lru)
				inc_node_page_state(page, NR_ISOLATED_ANON +
						    page_is_file_lru(page));
				node_stat_add_folio(folio, NR_ISOLATED_ANON +
						    folio_is_file_lru(folio));
		}
	}

	/*
	 * If we succeed to isolate the page, we grabbed another refcount on
	 * the page, so we can safely drop the one we got from get_any_page().
	 * If we failed to isolate the page, it means that we cannot go further
	 * If we succeed to isolate the folio, we grabbed another refcount on
	 * the folio, so we can safely drop the one we got from get_any_page().
	 * If we failed to isolate the folio, it means that we cannot go further
	 * and we will return an error, so drop the reference we got from
	 * get_any_page() as well.
	 */
	put_page(page);
	folio_put(folio);
	return isolated;
}

@@ -2732,7 +2732,7 @@ static int soft_offline_in_use_page(struct page *page)
		return 0;
	}

	if (isolate_page(&folio->page, &pagelist)) {
	if (mf_isolate_folio(folio, &pagelist)) {
		ret = migrate_pages(&pagelist, alloc_migration_target, NULL,
			(unsigned long)&mtc, MIGRATE_SYNC, MR_MEMORY_FAILURE, NULL);
		if (!ret) {