]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs: hugetlbfs: support poisoned recover from hugetlbfs_migrate_folio()
authorKefeng Wang <wangkefeng.wang@huawei.com>
Wed, 26 Jun 2024 08:53:27 +0000 (16:53 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 6 Jul 2024 18:53:20 +0000 (11:53 -0700)
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: Kefeng 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: Andrew Morton <akpm@linux-foundation.org>
fs/hugetlbfs/inode.c
mm/migrate.c

index 9456e1d55540fd317519fa45f4b0c8730bdd2835..ecad73a4f71350d7b6b4f634c3f048780933d4ca 100644 (file)
@@ -1128,7 +1128,7 @@ static int hugetlbfs_migrate_folio(struct address_space *mapping,
                hugetlb_set_folio_subpool(src, NULL);
        }
 
-       folio_migrate_copy(dst, src);
+       folio_migrate_flags(dst, src);
 
        return MIGRATEPAGE_SUCCESS;
 }
index 9dd5eb846d386cb9374f9a9ab3053d8055d2ed7a..da1e115cc4036d6d945c8fc1bcb66b4c7260cd68 100644 (file)
@@ -550,10 +550,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;