From: Li Wang <wangli.ahau@gmail.com>
To: Wei Gao <wegao@suse.com>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH v9] mremap07.c: New test for mremap() with MREMAP_DONTUNMAP
Date: Wed, 22 Apr 2026 13:14:36 +0800 [thread overview]
Message-ID: <aehZPI4rKuzujsj6@gmail.com> (raw)
Hi Wei,
Wei Gao wrote:
> This test verifies the mremap() syscall with the MREMAP_DONTUNMAP flag.
> It uses userfaultfd to verify that accessing the old memory region
> correctly triggers a page fault after the mapping has been moved.
>
> MREMAP_DONTUNMAP behavior with userfaultfd was not covered by existing
> mremap tests. This test provides coverage for the feature requested in
> the linked issue.
>
> Closes: https://github.com/linux-test-project/ltp/issues/1168
> Signed-off-by: Wei Gao <wegao@suse.com>
> ---
> v8->v9:
> - Removed `MREMAP_DONTUNMAP` check from `configure.ac` and moved fallback to `include/lapi/mmap.h`.
> - Renamed address variables to `old_addr` and `new_addr` for clarity.
> - Replaced hardcoded strings with `TEST_STRING_A` and `TEST_STRING_B` macros.
> - Improved code formatting and indentation.
> - Removed `.min_kver = "5.7"` in favor of dynamic feature detection.
> - Added runtime `EINVAL` check to trigger `TCONF` on unsupported kernels.
> - Added verification logic for data content at `new_addr`.
> - Fixed stability issues for multiple test iterations (`-i` option).
Patch merged with some improvements (for better readability and reliability):
--- a/testcases/kernel/syscalls/mremap/mremap07.c
+++ b/testcases/kernel/syscalls/mremap/mremap07.c
@@ -19,7 +19,6 @@
#include "tst_safe_pthread.h"
#include "lapi/userfaultfd.h"
#include "lapi/mmap.h"
-#include "config.h"
static int page_size;
static int uffd = -1;
@@ -33,33 +32,24 @@ static void *fault_handler_thread(void *arg LTP_ATTRIBUTE_UNUSED)
{
struct uffd_msg msg;
struct uffdio_copy uffdio_copy;
+ struct pollfd pollfd = { .fd = uffd, .events = POLLIN };
TST_CHECKPOINT_WAIT(0);
- struct pollfd pollfd;
-
- pollfd.fd = uffd;
- pollfd.events = POLLIN;
-
- int nready = poll(&pollfd, 1, -1);
-
- if (nready == -1)
+ if (poll(&pollfd, 1, -1) == -1)
tst_brk(TBROK | TERRNO, "poll() failed");
- if (nready == 0)
- tst_brk(TBROK, "poll() timed out unexpectedly");
-
SAFE_READ(1, uffd, &msg, sizeof(msg));
if (msg.event != UFFD_EVENT_PAGEFAULT)
tst_brk(TBROK, "Received unexpected UFFD_EVENT: %d", msg.event);
- if ((char *)msg.arg.pagefault.address != old_addr)
+ if (msg.arg.pagefault.address != (unsigned long)old_addr)
tst_brk(TBROK, "Page fault on unexpected address: %p",
- (void *)msg.arg.pagefault.address);
+ (void *)msg.arg.pagefault.address);
tst_res(TINFO, "Userfaultfd handler caught a page fault at %p",
- (void *)msg.arg.pagefault.address);
+ (void *)msg.arg.pagefault.address);
uffdio_copy.src = (unsigned long)new_addr;
uffdio_copy.dst = (unsigned long)old_addr;
@@ -73,12 +63,32 @@ static void *fault_handler_thread(void *arg LTP_ATTRIBUTE_UNUSED)
return NULL;
}
+static void check_mremap_dontunmap(void)
+{
+ char *test = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+
+ char *tmp = mremap(test, page_size, page_size,
+ MREMAP_DONTUNMAP | MREMAP_MAYMOVE, NULL);
+
+ if (tmp == MAP_FAILED) {
+ if (errno == EINVAL)
+ tst_brk(TCONF | TERRNO,
+ "MREMAP_DONTUNMAP not supported");
+ tst_brk(TBROK | TERRNO, "mremap failed");
+ }
+
+ SAFE_MUNMAP(tmp, page_size);
+ SAFE_MUNMAP(test, page_size);
+}
+
static void setup(void)
{
struct uffdio_api uffdio_api;
struct uffdio_register uffdio_register;
page_size = getpagesize();
+ check_mremap_dontunmap();
uffd = SAFE_USERFAULTFD(O_CLOEXEC | O_NONBLOCK, true);
uffdio_api.api = UFFD_API;
@@ -92,7 +102,7 @@ static void setup(void)
tst_res(TINFO, "Original mapping created at %p", (void *)old_addr);
- strcpy(old_addr, TEST_STRING_A);
+ memcpy(old_addr, TEST_STRING_A, sizeof(TEST_STRING_A));
uffdio_register.range.start = (unsigned long)old_addr;
uffdio_register.range.len = page_size;
@@ -118,23 +128,17 @@ static void run(void)
pthread_t handler_thread;
SAFE_PTHREAD_CREATE(&handler_thread, NULL,
- fault_handler_thread, NULL);
+ fault_handler_thread, NULL);
new_addr = mremap(old_addr, page_size, page_size,
- MREMAP_DONTUNMAP | MREMAP_MAYMOVE, NULL);
-
- if (new_addr == MAP_FAILED) {
- if (errno == EINVAL) {
- tst_brk(TCONF | TERRNO,
- "mremap with MREMAP_DONTUNMAP not supported?");
- }
+ MREMAP_DONTUNMAP | MREMAP_MAYMOVE, NULL);
+ if (new_addr == MAP_FAILED)
tst_brk(TBROK | TERRNO, "mremap failed");
- }
tst_res(TINFO, "New mapping created at %p", (void *)new_addr);
TST_EXP_EQ_STR(new_addr, TEST_STRING_A);
- strcpy(new_addr, TEST_STRING_B);
+ memcpy(new_addr, TEST_STRING_B, sizeof(TEST_STRING_B));
TST_CHECKPOINT_WAKE(0);
@@ -148,8 +152,7 @@ static void run(void)
TST_EXP_EQ_STR(old_addr, TEST_STRING_B);
SAFE_MUNMAP(new_addr, page_size);
- new_addr = NULL;
- strcpy(old_addr, TEST_STRING_A);
+ memcpy(old_addr, TEST_STRING_A, sizeof(TEST_STRING_A));
}
static struct tst_test test = {
--
Regards,
Li Wang
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next reply other threads:[~2026-04-22 5:15 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-22 5:14 Li Wang [this message]
-- strict thread matches above, loose matches on Subject: below --
2026-04-17 12:27 [LTP] [PATCH v8] mremap07.c: New test for mremap() with MREMAP_DONTUNMAP Wei Gao via ltp
2026-04-22 2:30 ` [LTP] [PATCH v9] " Wei Gao via ltp
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=aehZPI4rKuzujsj6@gmail.com \
--to=wangli.ahau@gmail.com \
--cc=20260422023115.27534-1-wegao@suse.com \
--cc=ltp@lists.linux.it \
--cc=wegao@suse.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.