From: Kefeng Wang <wangkefeng.wang@huawei.com>
To: Andrew Morton <akpm@linux-foundation.org>, <linux-mm@kvack.org>
Cc: Tony Luck <tony.luck@intel.com>,
Naoya Horiguchi <naoya.horiguchi@nec.com>,
Miaohe Lin <linmiaohe@huawei.com>,
Matthew Wilcox <willy@infradead.org>,
David Hildenbrand <david@redhat.com>,
Muchun Song <muchun.song@linux.dev>,
Benjamin LaHaise <bcrl@kvack.org>, <jglisse@redhat.com>,
<linux-aio@kvack.org>, <linux-fsdevel@vger.kernel.org>,
Kefeng Wang <wangkefeng.wang@huawei.com>
Subject: [PATCH rfcv2 08/11] mm: migrate: support poisoned recover from migrate folio
Date: Tue, 6 Feb 2024 19:21:31 +0800 [thread overview]
Message-ID: <20240206112134.1479464-9-wangkefeng.wang@huawei.com> (raw)
In-Reply-To: <20240206112134.1479464-1-wangkefeng.wang@huawei.com>
The folio migration is widely used in kernel, memory compaction, memory
hotplug, soft offline page, numa balance, memory demote/promotion, etc,
but once access a poisoned source folio when migrating, the kerenl will
panic.
There is a mechanism in the kernel to recover from uncorrectable memory
errors, ARCH_HAS_COPY_MC, which is already used in other core-mm paths,
eg, CoW, khugepaged, coredump, ksm copy, see copy_mc_to_{user,kernel},
copy_mc_{user_}highpage callers.
In order to support poisoned folio copy recover from migrate folio, we
chose to make folio migration tolerant of memory failures and return
error for folio migration, because folio migration is no guarantee
of success, this could avoid the similar panic shown below.
CPU: 1 PID: 88343 Comm: test_softofflin Kdump: loaded Not tainted 6.6.0
pc : copy_page+0x10/0xc0
lr : copy_highpage+0x38/0x50
...
Call trace:
copy_page+0x10/0xc0
folio_copy+0x78/0x90
migrate_folio_extra+0x54/0xa0
move_to_new_folio+0xd8/0x1f0
migrate_folio_move+0xb8/0x300
migrate_pages_batch+0x528/0x788
migrate_pages_sync+0x8c/0x258
migrate_pages+0x440/0x528
soft_offline_in_use_page+0x2ec/0x3c0
soft_offline_page+0x238/0x310
soft_offline_page_store+0x6c/0xc0
dev_attr_store+0x20/0x40
sysfs_kf_write+0x4c/0x68
kernfs_fop_write_iter+0x130/0x1c8
new_sync_write+0xa4/0x138
vfs_write+0x238/0x2d8
ksys_write+0x74/0x110
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
---
mm/migrate.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/mm/migrate.c b/mm/migrate.c
index 1db93b5eb819..6d99052848b4 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -669,16 +669,25 @@ static int __migrate_folio(struct address_space *mapping, struct folio *dst,
struct folio *src, void *src_private,
enum migrate_mode mode)
{
- int rc;
+ int rc, expected_cnt = folio_expected_refs(mapping, src);
- rc = folio_migrate_mapping(mapping, dst, src, 0);
- if (rc != MIGRATEPAGE_SUCCESS)
+ rc = folio_refs_check_and_freeze(mapping, src, expected_cnt);
+ if (rc)
return rc;
+ rc = folio_mc_copy(dst, src);
+ if (rc) {
+ if (mapping)
+ folio_ref_unfreeze(src, expected_cnt);
+ return rc;
+ }
+
+ folio_replace_mapping_and_unfreeze(mapping, dst, src, expected_cnt);
+
if (src_private)
folio_attach_private(dst, folio_detach_private(src));
- folio_migrate_copy(dst, src);
+ folio_migrate_flags(dst, src);
return MIGRATEPAGE_SUCCESS;
}
--
2.27.0
next prev parent reply other threads:[~2024-02-06 11:21 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-06 11:21 [PATCH rfcv2 00/11] mm: migrate: support poison recover from migrate folio Kefeng Wang
2024-02-06 11:21 ` [PATCH rfcv2 01/11] mm: migrate: simplify __buffer_migrate_folio() Kefeng Wang
2024-02-06 11:21 ` [PATCH rfcv2 02/11] mm: migrate_device: use more folio in __migrate_device_pages() Kefeng Wang
2024-02-06 11:21 ` [PATCH rfcv2 03/11] mm: migrate_device: unify migrate folio for MIGRATE_SYNC_NO_COPY Kefeng Wang
2024-02-06 11:21 ` [PATCH rfcv2 04/11] mm: migrate: remove migrate_folio_extra() Kefeng Wang
2024-02-06 11:21 ` [PATCH rfcv2 05/11] mm: remove MIGRATE_SYNC_NO_COPY mode Kefeng Wang
2024-02-06 11:21 ` [PATCH rfcv2 06/11] mm: migrate: split folio_migrate_mapping() Kefeng Wang
2024-02-06 11:21 ` [PATCH rfcv2 07/11] mm: add folio_mc_copy() Kefeng Wang
2024-02-06 11:21 ` Kefeng Wang [this message]
2024-02-06 11:21 ` [PATCH rfcv2 09/11] fs: hugetlbfs: support poison recover from hugetlbfs_migrate_folio() Kefeng Wang
2024-02-06 11:21 ` [PATCH rfcv2 10/11] mm: migrate: remove folio_migrate_copy() Kefeng Wang
2024-02-06 11:21 ` [PATCH rfcv2 11/11] fs: aio: add explicit check for large folio in aio_migrate_folio() Kefeng Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240206112134.1479464-9-wangkefeng.wang@huawei.com \
--to=wangkefeng.wang@huawei.com \
--cc=akpm@linux-foundation.org \
--cc=bcrl@kvack.org \
--cc=david@redhat.com \
--cc=jglisse@redhat.com \
--cc=linmiaohe@huawei.com \
--cc=linux-aio@kvack.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=muchun.song@linux.dev \
--cc=naoya.horiguchi@nec.com \
--cc=tony.luck@intel.com \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.