mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
mm: convert soft_offline_in_use_page() to use a folio
Replace the existing head-page logic with folio logic. Link: https://lkml.kernel.org/r/20231108182809.602073-5-willy@infradead.org Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Naoya Horiguchi <naoya.horiguchi@nec.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
19369d866a
commit
049b26048d
@ -2645,40 +2645,40 @@ static int soft_offline_in_use_page(struct page *page)
|
||||
{
|
||||
long ret = 0;
|
||||
unsigned long pfn = page_to_pfn(page);
|
||||
struct page *hpage = compound_head(page);
|
||||
struct folio *folio = page_folio(page);
|
||||
char const *msg_page[] = {"page", "hugepage"};
|
||||
bool huge = PageHuge(page);
|
||||
bool huge = folio_test_hugetlb(folio);
|
||||
LIST_HEAD(pagelist);
|
||||
struct migration_target_control mtc = {
|
||||
.nid = NUMA_NO_NODE,
|
||||
.gfp_mask = GFP_USER | __GFP_MOVABLE | __GFP_RETRY_MAYFAIL,
|
||||
};
|
||||
|
||||
if (!huge && PageTransHuge(hpage)) {
|
||||
if (!huge && folio_test_large(folio)) {
|
||||
if (try_to_split_thp_page(page)) {
|
||||
pr_info("soft offline: %#lx: thp split failed\n", pfn);
|
||||
return -EBUSY;
|
||||
}
|
||||
hpage = page;
|
||||
folio = page_folio(page);
|
||||
}
|
||||
|
||||
lock_page(page);
|
||||
folio_lock(folio);
|
||||
if (!huge)
|
||||
wait_on_page_writeback(page);
|
||||
folio_wait_writeback(folio);
|
||||
if (PageHWPoison(page)) {
|
||||
unlock_page(page);
|
||||
put_page(page);
|
||||
folio_unlock(folio);
|
||||
folio_put(folio);
|
||||
pr_info("soft offline: %#lx page already poisoned\n", pfn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!huge && PageLRU(page) && !PageSwapCache(page))
|
||||
if (!huge && folio_test_lru(folio) && !folio_test_swapcache(folio))
|
||||
/*
|
||||
* Try to invalidate first. This should work for
|
||||
* non dirty unmapped page cache pages.
|
||||
*/
|
||||
ret = invalidate_inode_page(page);
|
||||
unlock_page(page);
|
||||
ret = mapping_evict_folio(folio_mapping(folio), folio);
|
||||
folio_unlock(folio);
|
||||
|
||||
if (ret) {
|
||||
pr_info("soft_offline: %#lx: invalidated\n", pfn);
|
||||
@ -2686,7 +2686,7 @@ static int soft_offline_in_use_page(struct page *page)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (isolate_page(hpage, &pagelist)) {
|
||||
if (isolate_page(&folio->page, &pagelist)) {
|
||||
ret = migrate_pages(&pagelist, alloc_migration_target, NULL,
|
||||
(unsigned long)&mtc, MIGRATE_SYNC, MR_MEMORY_FAILURE, NULL);
|
||||
if (!ret) {
|
||||
|
Loading…
Reference in New Issue
Block a user