Commit 374fe8ea authored by Kefeng Wang's avatar Kefeng Wang Committed by Tong Tiangen
Browse files

fs: hugetlbfs: support poisoned recover from hugetlbfs_migrate_folio()

mainline inclusion
from mainline-v6.11-rc1
commit f00b295b9b61bb332b4f5951f479ab3aaeada5b8
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IAROKE
CVE: NA

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

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

This is similar to __migrate_folio(), use folio_mc_copy() in HugeTLB folio
migration to avoid panic when copy from poisoned folio.

Link: https://lkml.kernel.org/r/20240626085328.608006-6-wangkefeng.wang@huawei.com


Signed-off-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Benjamin LaHaise <bcrl@kvack.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Jane Chu <jane.chu@oracle.com>
Cc: Jérôme Glisse <jglisse@redhat.com>
Cc: Jiaqi Yan <jiaqiyan@google.com>
Cc: Lance Yang <ioworker0@gmail.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Miaohe Lin <linmiaohe@huawei.com>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Naoya Horiguchi <nao.horiguchi@gmail.com>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Vishal Moola (Oracle) <vishal.moola@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>

Conflicts:
	fs/hugetlbfs/inode.c
[Conflicts due to MIGRATE_SYNC_NO_COPY mode]

Signed-off-by: default avatarTong Tiangen <tongtiangen@huawei.com>
parent 1d263184
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -1156,9 +1156,6 @@ static int hugetlbfs_migrate_folio(struct address_space *mapping,
		hugetlb_set_folio_subpool(src, NULL);
	}

	if (mode != MIGRATE_SYNC_NO_COPY)
		folio_migrate_copy(dst, src);
	else
	folio_migrate_flags(dst, src);

	return MIGRATEPAGE_SUCCESS;
+8 −2
Original line number Diff line number Diff line
@@ -552,10 +552,16 @@ int migrate_huge_page_move_mapping(struct address_space *mapping,
				   struct folio *dst, struct folio *src)
{
	XA_STATE(xas, &mapping->i_pages, folio_index(src));
	int expected_count;
	int rc, expected_count = folio_expected_refs(mapping, src);

	if (folio_ref_count(src) != expected_count)
		return -EAGAIN;

	rc = folio_mc_copy(dst, src);
	if (unlikely(rc))
		return rc;

	xas_lock_irq(&xas);
	expected_count = folio_expected_refs(mapping, src);
	if (!folio_ref_freeze(src, expected_count)) {
		xas_unlock_irq(&xas);
		return -EAGAIN;