From: Andrew Morton <akpm@linux-foundation.org>
To: mm-commits@vger.kernel.org,wyihan@google.com,akpm@linux-foundation.org
Subject: + mm-selftests-add-shmem-into-memory-failure-test.patch added to mm-new branch
Date: Thu, 17 Sep 2026 16:57:32 -0700 [thread overview]
Message-ID: <20260917235732.989191F00893@smtp.kernel.org> (raw)
The patch titled
Subject: mm: selftests: Add shmem into memory failure test
has been added to the -mm mm-new branch. Its filename is
mm-selftests-add-shmem-into-memory-failure-test.patch
This patch will shortly appear at
https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/mm-selftests-add-shmem-into-memory-failure-test.patch
This patch will later appear in the mm-new branch at
git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Note, mm-new is a provisional staging ground for work-in-progress
patches, and acceptance into mm-new is a notification for others take
notice and to finish up reviews. Please do not hesitate to respond to
review feedback and post updated versions to replace or incrementally
fixup patches in mm-new.
The mm-new branch of mm.git is not included in linux-next
If a few days of testing in mm-new is successful, the patch will me moved
into mm.git's mm-unstable branch, which is included in linux-next
Before you just go and hit "reply", please:
a) Consider who else should be cc'ed
b) Prefer to cc a suitable mailing list as well
c) Ideally: find the original patch on the mailing list and do a
reply-to-all to that, adding suitable additional cc's
*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***
The -mm tree is included into linux-next via various
branches at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
and is updated there most days
------------------------------------------------------
From: Lisa Wang <wyihan@google.com>
Subject: mm: selftests: Add shmem into memory failure test
Date: Thu, 17 Sep 2026 20:43:51 +0000
Add a shmem memory failure selftest to test the shmem memory failure is
correct after modifying shmem return value.
Specifically, test the expected behavior under various scenarios
combining page dirtiness (dirty vs clean) and failure types (hard vs
soft):
+ Dirty + Hard: Trigger a SIGBUS on injection, and trigger another
SIGBUS when reading the page again.
+ Dirty + Soft: No SIGBUS is triggered, and the original value can be
read successfully.
+ Clean + Hard: No SIGBUS is triggered on injection, but trigger a
SIGBUS when trying to read the page again.
+ Clean + Soft: No SIGBUS is triggered, and the page can be read
successfully.
Link: https://lore.kernel.org/20260917-memory-failure-mf-delayed-fix-v6-5-4b00856b5364@google.com
Signed-off-by: Lisa Wang <wyihan@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Miaohe Lin <linmiaohe@huawei.com>
Cc: Ackerley Tng <ackerleytng@google.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: David Hildenbrand (Arm) <david@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Fuad Tabba <tabba@google.com>
Cc: Hidehiro Kawai <hidehiro.kawai.ez@hitachi.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Isaku Yamahata <isaku.yamahata@intel.com>
Cc: Jiaqi Yan <jiaqiyan@google.com>
Cc: Liam R. Howlett <liam@infradead.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: Michael Roth <michael.roth@amd.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Naoya Horiguchi <nao.horiguchi@gmail.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Sean Christopherson <seanjc@google.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vishal Annapurve <vannapurve@google.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Xiaoyao Li <xiaoyao.li@intel.com>
Cc: Yu Zhang <yu.c.zhang@linux.intel.com>
---
tools/testing/selftests/mm/memory-failure.c | 114 +++++++++++++++++-
1 file changed, 111 insertions(+), 3 deletions(-)
--- a/tools/testing/selftests/mm/memory-failure.c~mm-selftests-add-shmem-into-memory-failure-test
+++ a/tools/testing/selftests/mm/memory-failure.c
@@ -29,9 +29,14 @@ enum result_type {
MADV_HARD_ANON,
MADV_HARD_CLEAN_PAGECACHE,
MADV_HARD_DIRTY_PAGECACHE,
+ MADV_HARD_CLEAN_SHMEM,
+ MADV_HARD_DIRTY_SHMEM,
MADV_SOFT_ANON,
MADV_SOFT_CLEAN_PAGECACHE,
MADV_SOFT_DIRTY_PAGECACHE,
+ MADV_SOFT_CLEAN_SHMEM,
+ MADV_SOFT_DIRTY_SHMEM,
+ READ_ERROR,
};
static jmp_buf signal_jmp_buf;
@@ -157,17 +162,22 @@ static void check(struct __test_metadata
case MADV_HARD_CLEAN_PAGECACHE:
case MADV_SOFT_CLEAN_PAGECACHE:
case MADV_SOFT_DIRTY_PAGECACHE:
- /* It is not expected to receive a SIGBUS signal. */
- ASSERT_EQ(setjmp, 0);
-
+ case MADV_SOFT_DIRTY_SHMEM:
/* The page content should remain unchanged. */
ASSERT_TRUE(check_memory(vaddr, self->page_size));
+ /* FALLTHORUGH */
+ case MADV_HARD_CLEAN_SHMEM:
+ case MADV_SOFT_CLEAN_SHMEM:
+ /* It is not expected to receive a SIGBUS signal. */
+ ASSERT_EQ(setjmp, 0);
/* The backing pfn of addr should have changed. */
ASSERT_NE(pagemap_get_pfn(self->pagemap_fd, vaddr), self->pfn);
break;
case MADV_HARD_ANON:
case MADV_HARD_DIRTY_PAGECACHE:
+ case MADV_HARD_DIRTY_SHMEM:
+ case READ_ERROR:
/* The SIGBUS signal should have been received. */
ASSERT_EQ(setjmp, 1);
@@ -263,6 +273,20 @@ static int prepare_file(const char *fnam
return fd;
}
+static int prepare_shmem(const char *fname, unsigned long size)
+{
+ int fd;
+
+ fd = memfd_create(fname, 0);
+ if (fd < 0)
+ return -1;
+ if (ftruncate(fd, size) < 0) {
+ close(fd);
+ return -1;
+ }
+ return fd;
+}
+
/* Borrowed from mm/gup_longterm.c. */
static int get_fs_type(int fd)
{
@@ -362,6 +386,90 @@ TEST_F(memory_failure, dirty_pagecache)
ASSERT_EQ(munmap(addr, self->page_size), 0);
+ ASSERT_EQ(close(fd), 0);
+}
+
+TEST_F(memory_failure, dirty_shmem)
+{
+ int fd;
+ char *addr;
+ int ret;
+
+ fd = prepare_shmem("shmem-file", self->page_size);
+ if (fd < 0)
+ SKIP(return, "failed to open test shmem-file.\n");
+
+ addr = mmap(0, self->page_size, PROT_READ | PROT_WRITE,
+ MAP_SHARED, fd, 0);
+ if (addr == MAP_FAILED) {
+ close(fd);
+ SKIP(return, "mmap failed, not enough memory.\n");
+ }
+ memset(addr, 0xce, self->page_size);
+
+ prepare(_metadata, self, addr);
+
+ ret = sigsetjmp(signal_jmp_buf, 1);
+ if (!ret && !self->injection_attempted) {
+ self->injection_attempted = true;
+ ASSERT_EQ(variant->inject(self, addr), 0);
+ }
+
+ if (variant->type == MADV_HARD) {
+ check(_metadata, self, addr, MADV_HARD_DIRTY_SHMEM, ret);
+ ret = sigsetjmp(signal_jmp_buf, 1);
+ if (ret == 0)
+ FORCE_READ(*addr);
+ check(_metadata, self, addr, READ_ERROR, ret);
+ } else {
+ check(_metadata, self, addr, MADV_SOFT_DIRTY_SHMEM, ret);
+ }
+
+ ASSERT_EQ(munmap(addr, self->page_size), 0);
+
+ ASSERT_EQ(close(fd), 0);
+}
+
+TEST_F(memory_failure, clean_shmem)
+{
+ int fd;
+ char *addr;
+ int ret;
+
+ fd = prepare_shmem("shmem-file", self->page_size);
+ if (fd < 0)
+ SKIP(return, "failed to open test shmem-file.\n");
+
+ addr = mmap(0, self->page_size, PROT_READ | PROT_WRITE,
+ MAP_SHARED, fd, 0);
+ if (addr == MAP_FAILED) {
+ close(fd);
+ SKIP(return, "mmap failed, not enough memory.\n");
+ }
+ FORCE_READ(*addr);
+
+ prepare(_metadata, self, addr);
+
+ ret = sigsetjmp(signal_jmp_buf, 1);
+ if (!ret && !self->injection_attempted) {
+ self->injection_attempted = true;
+ ASSERT_EQ(variant->inject(self, addr), 0);
+ }
+
+ if (variant->type == MADV_HARD) {
+ check(_metadata, self, addr, MADV_HARD_CLEAN_SHMEM, ret);
+ ret = sigsetjmp(signal_jmp_buf, 1);
+ if (ret == 0)
+ FORCE_READ(*addr);
+ check(_metadata, self, addr, READ_ERROR, ret);
+ } else {
+ /* Test the address accessability without check_memory(). */
+ FORCE_READ(*addr);
+ check(_metadata, self, addr, MADV_SOFT_CLEAN_SHMEM, ret);
+ }
+
+ ASSERT_EQ(munmap(addr, self->page_size), 0);
+
ASSERT_EQ(close(fd), 0);
}
_
Patches currently in -mm which might be from wyihan@google.com are
mm-memory_failure-clarify-the-mf_delayed-definition.patch
mm-memory_failure-allow-truncate_error_folio-to-return-mf_delayed.patch
mm-shmem-update-shmem-handler-to-the-mf_delayed-definition.patch
mm-memory_failure-generalize-extra_pins-handling-to-all-mf_delayed-cases.patch
mm-selftests-add-shmem-into-memory-failure-test.patch
reply other threads:[~2026-09-17 23:57 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=20260917235732.989191F00893@smtp.kernel.org \
--to=akpm@linux-foundation.org \
--cc=mm-commits@vger.kernel.org \
--cc=wyihan@google.com \
/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.