* [PATCH v7 0/7] selftests/mm: skip several tests when thp is not available
@ 2026-03-30 15:14 Chunyu Hu
2026-03-30 15:14 ` [PATCH v7 1/7] selftests/mm/guard-regions: skip collapse test when thp not enabled Chunyu Hu
` (7 more replies)
0 siblings, 8 replies; 17+ messages in thread
From: Chunyu Hu @ 2026-03-30 15:14 UTC (permalink / raw)
To: akpm, david, shuah, linux-mm, ljs
Cc: linux-kselftest, linux-kernel, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko, ziy, baolin.wang, npache,
ryan.roberts, dev.jain, baohua, lance.yang, chuhu
There are several tests requires transprarent hugepages, when run on thp
disabled kernel such as realtime kernel, there will be false negative.
Mark those tests as skip when thp is not available.
Changes in v7:
- patch 1 add reviewed-by from Lorenzo
- patch 4 new patch to make ksft_exit_fail_perror variable length
arguments
- patch 5 change to use %.*s to print the buf when error happened
Limit the buflen arg as 2 minimum. Check the error path (numwritten
< 0).
And use the ksft_exit_fail_perror to print the logs in error path
Chagnes in v6:
- patch 3 add reviewed-by from Lorenzo
- patch 4 handle the errno before and after close(), suggested by AI
Changes in v5:
- patch 1, patch 3 updated reviwed-by and acked-by
- patch 4 adds new patch for robust write_file()
Changes in v4:
- patch 1 update to use thp_available instead of thp_is_enabled,
suggested by ai review
- removed reviewed-by and acked-by
Changes in v3:
- patch 1 update commit message to show the log snippet with where the
fail happens, change the 'false positive' to 'false negative'.
Update reviwed by
- patch 2 update reviewed-by
- patch 3 make write_file to void return
- patch 4 and patch 5 updated reviewed-by/acked-by
Changes in v2:
- replace 'false postive' with 'false negative' in cover letter
- patch 1 and patch 2 add reviewed-by/acked-by
- new patch 3 to add write_file() in vm_util as a common helper
- patch 4 removed the {} in if block, removed the write_file helper
rename chunk in v1. Add reviewed-by
- patch 5 move the exit chunk to the front of ksft_print_headers() as
suggested by David. Add review by.
Chunyu Hu (7):
selftests/mm/guard-regions: skip collapse test when thp not enabled
selftests/mm: soft-dirty: skip two tests when thp is not available
selftests/mm: move write_file helper to vm_util
kselftest: make ksft_exit_fail_perror support va args
selftests/mm/vm_util: robust write_file()
selftests/mm: split_huge_page_test: skip the test when thp is not
available
selftests/mm: transhuge_stress: skip the test when thp not available
tools/testing/selftests/kselftest.h | 21 +++++++++--
tools/testing/selftests/mm/guard-regions.c | 4 +++
tools/testing/selftests/mm/soft-dirty.c | 4 ++-
.../selftests/mm/split_huge_page_test.c | 19 +++-------
tools/testing/selftests/mm/thp_settings.c | 35 ++-----------------
tools/testing/selftests/mm/thp_settings.h | 1 -
tools/testing/selftests/mm/transhuge-stress.c | 4 +++
tools/testing/selftests/mm/vm_util.c | 24 +++++++++++++
tools/testing/selftests/mm/vm_util.h | 2 ++
9 files changed, 62 insertions(+), 52 deletions(-)
base-commit: 7aaa8047eafd0bd628065b15757d9b48c5f9c07d
--
2.53.0
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v7 1/7] selftests/mm/guard-regions: skip collapse test when thp not enabled
2026-03-30 15:14 [PATCH v7 0/7] selftests/mm: skip several tests when thp is not available Chunyu Hu
@ 2026-03-30 15:14 ` Chunyu Hu
2026-03-30 15:14 ` [PATCH v7 2/7] selftests/mm: soft-dirty: skip two tests when thp is not available Chunyu Hu
` (6 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Chunyu Hu @ 2026-03-30 15:14 UTC (permalink / raw)
To: akpm, david, shuah, linux-mm, ljs
Cc: linux-kselftest, linux-kernel, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko, ziy, baolin.wang, npache,
ryan.roberts, dev.jain, baohua, lance.yang, chuhu, Li Wang
When thp is not available, just skip the collape tests to avoid the false
negative.
Without the change, run with a thp disabled kernel:
./run_vmtests.sh -t madv_guard -n 1
<snip/>
# RUN guard_regions.anon.collapse ...
# guard-regions.c:2217:collapse:Expected madvise(ptr, size, MADV_NOHUGEPAGE) (-1) == 0 (0)
# collapse: Test terminated by assertion
# FAIL guard_regions.anon.collapse
not ok 2 guard_regions.anon.collapse
<snip/>
# RUN guard_regions.shmem.collapse ...
# guard-regions.c:2217:collapse:Expected madvise(ptr, size, MADV_NOHUGEPAGE) (-1) == 0 (0)
# collapse: Test terminated by assertion
# FAIL guard_regions.shmem.collapse
not ok 32 guard_regions.shmem.collapse
<snip/>
# RUN guard_regions.file.collapse ...
# guard-regions.c:2217:collapse:Expected madvise(ptr, size, MADV_NOHUGEPAGE) (-1) == 0 (0)
# collapse: Test terminated by assertion
# FAIL guard_regions.file.collapse
not ok 62 guard_regions.file.collapse
<snip/>
# FAILED: 87 / 90 tests passed.
# 17 skipped test(s) detected. Consider enabling relevant config options to improve coverage.
# Totals: pass:70 fail:3 xfail:0 xpass:0 skip:17 error:0
With this change, run with thp disabled kernel:
./run_vmtests.sh -t madv_guard -n 1
<snip/>
# RUN guard_regions.anon.collapse ...
# SKIP Transparent Hugepages not available
# OK guard_regions.anon.collapse
ok 2 guard_regions.anon.collapse # SKIP Transparent Hugepages not available
<snip/>
# RUN guard_regions.file.collapse ...
# SKIP Transparent Hugepages not available
# OK guard_regions.file.collapse
ok 62 guard_regions.file.collapse # SKIP Transparent Hugepages not available
<snip/>
# RUN guard_regions.shmem.collapse ...
# SKIP Transparent Hugepages not available
# OK guard_regions.shmem.collapse
ok 32 guard_regions.shmem.collapse # SKIP Transparent Hugepages not available
<snip/>
# PASSED: 90 / 90 tests passed.
# 20 skipped test(s) detected. Consider enabling relevant config options to improve coverage.
# Totals: pass:70 fail:0 xfail:0 xpass:0 skip:20 error:0
Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Reviewed-by: Zi Yan <ziy@nvidia.com>
Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
CC: Li Wang <liwang@redhat.com>
Signed-off-by: Chunyu Hu <chuhu@redhat.com>
---
Changes in v7:
- Add reviewed-by from Lorenzo
Changes in v5:
- updated reviewed-by and acked-by
Changes in v4:
- use thp_available instead of thp_is_enabled() as when thp is set to
never, madvise(MADV_COLLAPSE) will still succeed by design. So a
failure in madvise(MADV_COLLAPSE) on guard region will verify guard
region denies it. This is suggested from AI.
- removed the 'Reviewed-by' and 'Acked-by' as the code changes. Sorry for
that but it seems the changes is a little huge? (1 out of 2 lines)..
Changes in v3:
- commit message: update the log snippet with where the fail happens and
add the '-n1' to the command.
- fix the 'false positive' to 'false negative'
- add reviwed by from Mike
Changes in v2:
- add reviewed by from Zi and Lorenzo
- add acked-by from David
---
tools/testing/selftests/mm/guard-regions.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/tools/testing/selftests/mm/guard-regions.c b/tools/testing/selftests/mm/guard-regions.c
index dbd21d66d383..48e8b1539be3 100644
--- a/tools/testing/selftests/mm/guard-regions.c
+++ b/tools/testing/selftests/mm/guard-regions.c
@@ -21,6 +21,7 @@
#include <sys/uio.h>
#include <unistd.h>
#include "vm_util.h"
+#include "thp_settings.h"
#include "../pidfd/pidfd.h"
@@ -2195,6 +2196,9 @@ TEST_F(guard_regions, collapse)
char *ptr;
int i;
+ if (!thp_available())
+ SKIP(return, "Transparent Hugepages not available\n");
+
/* Need file to be correct size for tests for non-anon. */
if (variant->backing != ANON_BACKED)
ASSERT_EQ(ftruncate(self->fd, size), 0);
base-commit: 7aaa8047eafd0bd628065b15757d9b48c5f9c07d
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v7 2/7] selftests/mm: soft-dirty: skip two tests when thp is not available
2026-03-30 15:14 [PATCH v7 0/7] selftests/mm: skip several tests when thp is not available Chunyu Hu
2026-03-30 15:14 ` [PATCH v7 1/7] selftests/mm/guard-regions: skip collapse test when thp not enabled Chunyu Hu
@ 2026-03-30 15:14 ` Chunyu Hu
2026-03-30 15:14 ` [PATCH v7 3/7] selftests/mm: move write_file helper to vm_util Chunyu Hu
` (5 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Chunyu Hu @ 2026-03-30 15:14 UTC (permalink / raw)
To: akpm, david, shuah, linux-mm, ljs
Cc: linux-kselftest, linux-kernel, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko, ziy, baolin.wang, npache,
ryan.roberts, dev.jain, baohua, lance.yang, chuhu, Li Wang
The test_hugepage test contain two sub tests. If just reporting one skip
when thp not available, there will be error in the log because the test
count don't match the test plan. Change to skip two tests by running the
ksft_test_result_skip twice in this case.
Without the fix (run test on thp disabled kernel):
./run_vmtests.sh -t soft_dirty
# --------------------
# running ./soft-dirty
# --------------------
# TAP version 13
# 1..19
# ok 1 Test test_simple
# ok 2 Test test_vma_reuse dirty bit of allocated page
# ok 3 Test test_vma_reuse dirty bit of reused address page
# ok 4 # SKIP Transparent Hugepages not available
# ok 5 Test test_mprotect-anon dirty bit of new written page
# ok 6 Test test_mprotect-anon soft-dirty clear after clear_refs
# ok 7 Test test_mprotect-anon soft-dirty clear after marking RO
# ok 8 Test test_mprotect-anon soft-dirty clear after marking RW
# ok 9 Test test_mprotect-anon soft-dirty after rewritten
# ok 10 Test test_mprotect-file dirty bit of new written page
# ok 11 Test test_mprotect-file soft-dirty clear after clear_refs
# ok 12 Test test_mprotect-file soft-dirty clear after marking RO
# ok 13 Test test_mprotect-file soft-dirty clear after marking RW
# ok 14 Test test_mprotect-file soft-dirty after rewritten
# ok 15 Test test_merge-anon soft-dirty after remap merge 1st pg
# ok 16 Test test_merge-anon soft-dirty after remap merge 2nd pg
# ok 17 Test test_merge-anon soft-dirty after mprotect merge 1st pg
# ok 18 Test test_merge-anon soft-dirty after mprotect merge 2nd pg
# # 1 skipped test(s) detected. Consider enabling relevant config options to improve coverage.
# # Planned tests != run tests (19 != 18)
# # Totals: pass:17 fail:0 xfail:0 xpass:0 skip:1 error:0
# [FAIL]
not ok 52 soft-dirty # exit=1
With the fix (run test on thp disabled kernel):
./run_vmtests.sh -t soft_dirty
# --------------------
# running ./soft-dirty
# TAP version 13
# --------------------
# running ./soft-dirty
# --------------------
# TAP version 13
# 1..19
# ok 1 Test test_simple
# ok 2 Test test_vma_reuse dirty bit of allocated page
# ok 3 Test test_vma_reuse dirty bit of reused address page
# # Transparent Hugepages not available
# ok 4 # SKIP Test test_hugepage huge page allocation
# ok 5 # SKIP Test test_hugepage huge page dirty bit
# ok 6 Test test_mprotect-anon dirty bit of new written page
# ok 7 Test test_mprotect-anon soft-dirty clear after clear_refs
# ok 8 Test test_mprotect-anon soft-dirty clear after marking RO
# ok 9 Test test_mprotect-anon soft-dirty clear after marking RW
# ok 10 Test test_mprotect-anon soft-dirty after rewritten
# ok 11 Test test_mprotect-file dirty bit of new written page
# ok 12 Test test_mprotect-file soft-dirty clear after clear_refs
# ok 13 Test test_mprotect-file soft-dirty clear after marking RO
# ok 14 Test test_mprotect-file soft-dirty clear after marking RW
# ok 15 Test test_mprotect-file soft-dirty after rewritten
# ok 16 Test test_merge-anon soft-dirty after remap merge 1st pg
# ok 17 Test test_merge-anon soft-dirty after remap merge 2nd pg
# ok 18 Test test_merge-anon soft-dirty after mprotect merge 1st pg
# ok 19 Test test_merge-anon soft-dirty after mprotect merge 2nd pg
# # 2 skipped test(s) detected. Consider enabling relevant config options to improve coverage.
# # Totals: pass:17 fail:0 xfail:0 xpass:0 skip:2 error:0
# [PASS]
ok 1 soft-dirty
hwpoison_inject
# SUMMARY: PASS=1 SKIP=0 FAIL=0
1..1
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Reviewed-by: Zi Yan <ziy@nvidia.com>
CC: Li Wang <liwang@redhat.com>
Signed-off-by: Chunyu Hu <chuhu@redhat.com>
---
Changes in v3:
- Add reviewed by from Mike
Changes in v2:
- add reviewed by from Lorenzo and Zi
- add acked-by from David
---
tools/testing/selftests/mm/soft-dirty.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/mm/soft-dirty.c b/tools/testing/selftests/mm/soft-dirty.c
index 59c0dbe99a9b..bcfcac99b436 100644
--- a/tools/testing/selftests/mm/soft-dirty.c
+++ b/tools/testing/selftests/mm/soft-dirty.c
@@ -82,7 +82,9 @@ static void test_hugepage(int pagemap_fd, int pagesize)
int i, ret;
if (!thp_is_enabled()) {
- ksft_test_result_skip("Transparent Hugepages not available\n");
+ ksft_print_msg("Transparent Hugepages not available\n");
+ ksft_test_result_skip("Test %s huge page allocation\n", __func__);
+ ksft_test_result_skip("Test %s huge page dirty bit\n", __func__);
return;
}
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v7 3/7] selftests/mm: move write_file helper to vm_util
2026-03-30 15:14 [PATCH v7 0/7] selftests/mm: skip several tests when thp is not available Chunyu Hu
2026-03-30 15:14 ` [PATCH v7 1/7] selftests/mm/guard-regions: skip collapse test when thp not enabled Chunyu Hu
2026-03-30 15:14 ` [PATCH v7 2/7] selftests/mm: soft-dirty: skip two tests when thp is not available Chunyu Hu
@ 2026-03-30 15:14 ` Chunyu Hu
2026-03-30 15:15 ` [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments Chunyu Hu
` (4 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Chunyu Hu @ 2026-03-30 15:14 UTC (permalink / raw)
To: akpm, david, shuah, linux-mm, ljs
Cc: linux-kselftest, linux-kernel, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko, ziy, baolin.wang, npache,
ryan.roberts, dev.jain, baohua, lance.yang, chuhu
thp_settings provides write_file() helper for safely writing to a file and
exit when write failure happens. It's a very low level helper and many sub
tests need such a helper, not only thp tests.
split_huge_page_test also defines a write_file locally. The two have minior
differences in return type and used exit api. And there would be conflicts
if split_huge_page_test wanted to include thp_settings.h because of
different prototype, making it less convenient.
It's possisble to merge the two, although some tests don't use the
kselftest infrastrucutre for testing. It would also work when using the
ksft_exit_msg() to exit in my test, as the counters are all zero. Output
will be like:
TAP version 13
1..62
Bail out! /proc/sys/vm/drop_caches1 open failed: No such file or directory
# Totals: pass:0 fail:0 xfail:0 xpass:0 skip:0 error:0
So here we just keep the version in split_huge_page_test, and move it into
the vm_util. This makes it easy to maitain and user could just include one
vm_util.h when they don't need thp setting helpers. Keep the prototype of
void return as the function will exit on any error, return value is not
necessary, and will simply the callers like write_num() and write_string().
Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Reviewed-by: Zi Yan <ziy@nvidia.com>
Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Suggested-by: Mike Rapoport <rppt@kernel.org>
Signed-off-by: Chunyu Hu <chuhu@redhat.com>
---
Changes in v6:
- add reviewed-by from Lorenzo
Changes in v5:
- updated acked-by and reviewed-by
Changes in v3:
- make the write_file void return
Changes in v2:
new patch from v2
---
.../selftests/mm/split_huge_page_test.c | 15 --------
tools/testing/selftests/mm/thp_settings.c | 35 ++-----------------
tools/testing/selftests/mm/thp_settings.h | 1 -
tools/testing/selftests/mm/vm_util.c | 15 ++++++++
tools/testing/selftests/mm/vm_util.h | 2 ++
5 files changed, 20 insertions(+), 48 deletions(-)
diff --git a/tools/testing/selftests/mm/split_huge_page_test.c b/tools/testing/selftests/mm/split_huge_page_test.c
index e0167111bdd1..93f205327b84 100644
--- a/tools/testing/selftests/mm/split_huge_page_test.c
+++ b/tools/testing/selftests/mm/split_huge_page_test.c
@@ -255,21 +255,6 @@ static int check_after_split_folio_orders(char *vaddr_start, size_t len,
return status;
}
-static void write_file(const char *path, const char *buf, size_t buflen)
-{
- int fd;
- ssize_t numwritten;
-
- fd = open(path, O_WRONLY);
- if (fd == -1)
- ksft_exit_fail_msg("%s open failed: %s\n", path, strerror(errno));
-
- numwritten = write(fd, buf, buflen - 1);
- close(fd);
- if (numwritten < 1)
- ksft_exit_fail_msg("Write failed\n");
-}
-
static void write_debugfs(const char *fmt, ...)
{
char input[INPUT_MAX];
diff --git a/tools/testing/selftests/mm/thp_settings.c b/tools/testing/selftests/mm/thp_settings.c
index 574bd0f8ae48..e748ebfb3d4e 100644
--- a/tools/testing/selftests/mm/thp_settings.c
+++ b/tools/testing/selftests/mm/thp_settings.c
@@ -6,6 +6,7 @@
#include <string.h>
#include <unistd.h>
+#include "vm_util.h"
#include "thp_settings.h"
#define THP_SYSFS "/sys/kernel/mm/transparent_hugepage/"
@@ -64,29 +65,6 @@ int read_file(const char *path, char *buf, size_t buflen)
return (unsigned int) numread;
}
-int write_file(const char *path, const char *buf, size_t buflen)
-{
- int fd;
- ssize_t numwritten;
-
- fd = open(path, O_WRONLY);
- if (fd == -1) {
- printf("open(%s)\n", path);
- exit(EXIT_FAILURE);
- return 0;
- }
-
- numwritten = write(fd, buf, buflen - 1);
- close(fd);
- if (numwritten < 1) {
- printf("write(%s)\n", buf);
- exit(EXIT_FAILURE);
- return 0;
- }
-
- return (unsigned int) numwritten;
-}
-
unsigned long read_num(const char *path)
{
char buf[21];
@@ -104,10 +82,7 @@ void write_num(const char *path, unsigned long num)
char buf[21];
sprintf(buf, "%ld", num);
- if (!write_file(path, buf, strlen(buf) + 1)) {
- perror(path);
- exit(EXIT_FAILURE);
- }
+ write_file(path, buf, strlen(buf) + 1);
}
int thp_read_string(const char *name, const char * const strings[])
@@ -165,11 +140,7 @@ void thp_write_string(const char *name, const char *val)
printf("%s: Pathname is too long\n", __func__);
exit(EXIT_FAILURE);
}
-
- if (!write_file(path, val, strlen(val) + 1)) {
- perror(path);
- exit(EXIT_FAILURE);
- }
+ write_file(path, val, strlen(val) + 1);
}
unsigned long thp_read_num(const char *name)
diff --git a/tools/testing/selftests/mm/thp_settings.h b/tools/testing/selftests/mm/thp_settings.h
index 76eeb712e5f1..7748a9009191 100644
--- a/tools/testing/selftests/mm/thp_settings.h
+++ b/tools/testing/selftests/mm/thp_settings.h
@@ -63,7 +63,6 @@ struct thp_settings {
};
int read_file(const char *path, char *buf, size_t buflen);
-int write_file(const char *path, const char *buf, size_t buflen);
unsigned long read_num(const char *path);
void write_num(const char *path, unsigned long num);
diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c
index a6d4ff7dfdc0..ad96d19d1b85 100644
--- a/tools/testing/selftests/mm/vm_util.c
+++ b/tools/testing/selftests/mm/vm_util.c
@@ -764,3 +764,18 @@ int unpoison_memory(unsigned long pfn)
return ret > 0 ? 0 : -errno;
}
+
+void write_file(const char *path, const char *buf, size_t buflen)
+{
+ int fd;
+ ssize_t numwritten;
+
+ fd = open(path, O_WRONLY);
+ if (fd == -1)
+ ksft_exit_fail_msg("%s open failed: %s\n", path, strerror(errno));
+
+ numwritten = write(fd, buf, buflen - 1);
+ close(fd);
+ if (numwritten < 1)
+ ksft_exit_fail_msg("Write failed\n");
+}
diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h
index e9c4e24769c1..1a07305ceff4 100644
--- a/tools/testing/selftests/mm/vm_util.h
+++ b/tools/testing/selftests/mm/vm_util.h
@@ -166,3 +166,5 @@ int unpoison_memory(unsigned long pfn);
#define PAGEMAP_PRESENT(ent) (((ent) & (1ull << 63)) != 0)
#define PAGEMAP_PFN(ent) ((ent) & ((1ull << 55) - 1))
+
+void write_file(const char *path, const char *buf, size_t buflen);
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments
2026-03-30 15:14 [PATCH v7 0/7] selftests/mm: skip several tests when thp is not available Chunyu Hu
` (2 preceding siblings ...)
2026-03-30 15:14 ` [PATCH v7 3/7] selftests/mm: move write_file helper to vm_util Chunyu Hu
@ 2026-03-30 15:15 ` Chunyu Hu
2026-03-31 10:31 ` Chunyu Hu
2026-04-01 11:03 ` Mark Brown
2026-03-30 15:15 ` [PATCH v7 5/7] selftests/mm/vm_util: robust write_file() Chunyu Hu
` (3 subsequent siblings)
7 siblings, 2 replies; 17+ messages in thread
From: Chunyu Hu @ 2026-03-30 15:15 UTC (permalink / raw)
To: akpm, david, shuah, linux-mm, ljs
Cc: linux-kselftest, linux-kernel, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko, ziy, baolin.wang, npache,
ryan.roberts, dev.jain, baohua, lance.yang, chuhu
The ksft_exit_fail_perror function previously only accepted a single string
argument, which limited its flexibility for providing specific context to
failure messages.
This change updates ksft_exit_fail_perror to support variable arguments,
similar to ksft_exit_fail_msg. Adding the __printf(1, 2) attribute enables
compile-time checking for format string correctness.
Signed-off-by: Chunyu Hu <chuhu@redhat.com>
---
Changes in v7:
- new patch to convert ksft_exit_fail_perror support variable arguments
---
tools/testing/selftests/kselftest.h | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/tools/testing/selftests/kselftest.h b/tools/testing/selftests/kselftest.h
index afbcf8412ae5..11cabdabb3f6 100644
--- a/tools/testing/selftests/kselftest.h
+++ b/tools/testing/selftests/kselftest.h
@@ -43,7 +43,7 @@
* the program is aborting before finishing all tests):
*
* ksft_exit_fail_msg(fmt, ...);
- * ksft_exit_fail_perror(msg);
+ * ksft_exit_fail_perror(fmt, ...);
*
*/
#ifndef __KSELFTEST_H
@@ -417,9 +417,24 @@ static inline __noreturn __printf(1, 2) void ksft_exit_fail_msg(const char *msg,
exit(KSFT_FAIL);
}
-static inline __noreturn void ksft_exit_fail_perror(const char *msg)
+static inline __noreturn __printf(1, 2) void ksft_exit_fail_perror(const char *msg, ...)
{
- ksft_exit_fail_msg("%s: %s (%d)\n", msg, strerror(errno), errno);
+ va_list args;
+ char *buf = NULL;
+ int saved_errno = errno;
+
+ va_start(args, msg);
+ if (vasprintf(&buf, msg, args) == -1) {
+ va_end(args);
+ ksft_exit_fail_msg("vasprintf failed: %s (%d)\n", strerror(saved_errno),
+ saved_errno);
+ }
+ va_end(args);
+
+ errno = saved_errno;
+ ksft_exit_fail_msg("%s: %s (%d)\n", buf, strerror(errno), errno);
+
+ free(buf);
}
static inline __noreturn void ksft_exit_xfail(void)
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v7 5/7] selftests/mm/vm_util: robust write_file()
2026-03-30 15:14 [PATCH v7 0/7] selftests/mm: skip several tests when thp is not available Chunyu Hu
` (3 preceding siblings ...)
2026-03-30 15:15 ` [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments Chunyu Hu
@ 2026-03-30 15:15 ` Chunyu Hu
2026-03-30 15:15 ` [PATCH v7 6/7] selftests/mm: split_huge_page_test: skip the test when thp is not available Chunyu Hu
` (2 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Chunyu Hu @ 2026-03-30 15:15 UTC (permalink / raw)
To: akpm, david, shuah, linux-mm, ljs
Cc: linux-kselftest, linux-kernel, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko, ziy, baolin.wang, npache,
ryan.roberts, dev.jain, baohua, lance.yang, chuhu
Add three more checks for buflen and numwritten. The buflen should be at
least two, that means at least one char and the null-end. The error case
check is added by checking numwriten < 0 instead of numwritten < 1. And the
truncate case is checked. The test will exit if any of these conditions
aren't met.
Additionally, add more print information when a write failure occurs or
a truncated write happens, providing clearer diagnostics.
Signed-off-by: Chunyu Hu <chuhu@redhat.com>
---
Changes in v7:
- add an empty line before the 'buflen < 1' line. And change to
'buflen < 2 to limit the buflen at least to be 2, so at least one char
is allowed.
- handle the numwriten < 0 case, which is the error path.
- use ksft_exit_fail_perror in error exit path.
- use %.*s to print the buf when error happened
Changes in v6:
- save/restore errno before and after the close(), so the log could show
the correct error info on failure. Suggested by AI.
Chagnes in v5:
- new patch for making improve on write_file. Add more safety checks and
diagnostics info in log
---
tools/testing/selftests/mm/vm_util.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c
index ad96d19d1b85..00aaf33387f5 100644
--- a/tools/testing/selftests/mm/vm_util.c
+++ b/tools/testing/selftests/mm/vm_util.c
@@ -767,15 +767,24 @@ int unpoison_memory(unsigned long pfn)
void write_file(const char *path, const char *buf, size_t buflen)
{
- int fd;
+ int fd, saved_errno;
ssize_t numwritten;
+ if (buflen < 2)
+ ksft_exit_fail_msg("Incorrect buffer len: %zu\n", buflen);
+
fd = open(path, O_WRONLY);
if (fd == -1)
- ksft_exit_fail_msg("%s open failed: %s\n", path, strerror(errno));
+ ksft_exit_fail_perror("%s open failed", path);
numwritten = write(fd, buf, buflen - 1);
+ saved_errno = errno;
close(fd);
- if (numwritten < 1)
- ksft_exit_fail_msg("Write failed\n");
+ errno = saved_errno;
+ if (numwritten < 0)
+ ksft_exit_fail_perror("%s write(%.*s) failed", path, (int)(buflen - 1),
+ buf);
+ if (numwritten != buflen - 1)
+ ksft_exit_fail_msg("%s write(%.*s) is truncated, expected %zu bytes, got %zd bytes\n",
+ path, (int)(buflen - 1), buf, buflen - 1, numwritten);
}
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v7 6/7] selftests/mm: split_huge_page_test: skip the test when thp is not available
2026-03-30 15:14 [PATCH v7 0/7] selftests/mm: skip several tests when thp is not available Chunyu Hu
` (4 preceding siblings ...)
2026-03-30 15:15 ` [PATCH v7 5/7] selftests/mm/vm_util: robust write_file() Chunyu Hu
@ 2026-03-30 15:15 ` Chunyu Hu
2026-03-30 15:15 ` [PATCH v7 7/7] selftests/mm: transhuge_stress: skip the test when thp " Chunyu Hu
2026-03-30 19:25 ` [PATCH v7 0/7] selftests/mm: skip several tests when thp is " Andrew Morton
7 siblings, 0 replies; 17+ messages in thread
From: Chunyu Hu @ 2026-03-30 15:15 UTC (permalink / raw)
To: akpm, david, shuah, linux-mm, ljs
Cc: linux-kselftest, linux-kernel, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko, ziy, baolin.wang, npache,
ryan.roberts, dev.jain, baohua, lance.yang, chuhu, Li Wang
When thp is not enabled on some kernel config such as realtime kernel, the
test will report failure. Fix the false positive by skipping the test
directly when thp is not enabled.
Tested with thp disabled kernel:
Before The fix:
# --------------------------------------------------
# running ./split_huge_page_test /tmp/xfs_dir_Ywup9p
# --------------------------------------------------
# TAP version 13
# Bail out! Reading PMD pagesize failed
# # Totals: pass:0 fail:0 xfail:0 xpass:0 skip:0 error:0
# [FAIL]
not ok 61 split_huge_page_test /tmp/xfs_dir_Ywup9p # exit=1
After the fix:
# --------------------------------------------------
# running ./split_huge_page_test /tmp/xfs_dir_YHPUPl
# --------------------------------------------------
# TAP version 13
# 1..0 # SKIP Transparent Hugepages not available
# [SKIP]
ok 6 split_huge_page_test /tmp/xfs_dir_YHPUPl # SKIP
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
Reviewed-by: Zi Yan <ziy@nvidia.com>
CC: Li Wang <liwang@redhat.com>
Signed-off-by: Chunyu Hu <chuhu@redhat.com>
---
V3 chagnes:
- add acked-by from David
- add reviewed by from Mike
V2 changes:
- removed the {} in if block
- removed the write_file helper rename chunk, as there's a new patch 3 to
resolve the conflict with thp_settings.h by moving it to vm_util.
- Add reviewed by from Zi and Lorenzo
---
tools/testing/selftests/mm/split_huge_page_test.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/tools/testing/selftests/mm/split_huge_page_test.c b/tools/testing/selftests/mm/split_huge_page_test.c
index 93f205327b84..500d07c4938b 100644
--- a/tools/testing/selftests/mm/split_huge_page_test.c
+++ b/tools/testing/selftests/mm/split_huge_page_test.c
@@ -21,6 +21,7 @@
#include <time.h>
#include "vm_util.h"
#include "kselftest.h"
+#include "thp_settings.h"
uint64_t pagesize;
unsigned int pageshift;
@@ -757,6 +758,9 @@ int main(int argc, char **argv)
ksft_finished();
}
+ if (!thp_is_enabled())
+ ksft_exit_skip("Transparent Hugepages not available\n");
+
if (argc > 1)
optional_xfs_path = argv[1];
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v7 7/7] selftests/mm: transhuge_stress: skip the test when thp not available
2026-03-30 15:14 [PATCH v7 0/7] selftests/mm: skip several tests when thp is not available Chunyu Hu
` (5 preceding siblings ...)
2026-03-30 15:15 ` [PATCH v7 6/7] selftests/mm: split_huge_page_test: skip the test when thp is not available Chunyu Hu
@ 2026-03-30 15:15 ` Chunyu Hu
2026-03-30 19:25 ` [PATCH v7 0/7] selftests/mm: skip several tests when thp is " Andrew Morton
7 siblings, 0 replies; 17+ messages in thread
From: Chunyu Hu @ 2026-03-30 15:15 UTC (permalink / raw)
To: akpm, david, shuah, linux-mm, ljs
Cc: linux-kselftest, linux-kernel, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko, ziy, baolin.wang, npache,
ryan.roberts, dev.jain, baohua, lance.yang, chuhu, Li Wang
The test requires thp, skip the test when thp is not available to avoid
false positive.
Tested with thp disabled kernel.
Before the fix:
# --------------------------------
# running ./transhuge-stress -d 20
# --------------------------------
# TAP version 13
# 1..1
# transhuge-stress: allocate 1453 transhuge pages, using 2907 MiB virtual memory and 11 MiB of ram
# Bail out! MADV_HUGEPAGE# Planned tests != run tests (1 != 0)
# # Totals: pass:0 fail:0 xfail:0 xpass:0 skip:0 error:0
# [FAIL]
not ok 60 transhuge-stress -d 20 # exit=1
After the fix:
# --------------------------------
# running ./transhuge-stress -d 20
# --------------------------------
# TAP version 13
# 1..0 # SKIP Transparent Hugepages not available
# [SKIP]
ok 5 transhuge-stress -d 20 # SKIP
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
Reviewed-by: Zi Yan <ziy@nvidia.com>
CC: Li Wang <liwang@redhat.com>
Signed-off-by: Chunyu Hu <chuhu@redhat.com>
---
V3 changes:
- Add review by from Mike
- Add acked-by from David
V2 changes:
- Move the exit chunk to the front of ksft_print_headers() as suggested
by David.
- Add reviewed by from Zi and Lorenzo
---
tools/testing/selftests/mm/transhuge-stress.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/tools/testing/selftests/mm/transhuge-stress.c b/tools/testing/selftests/mm/transhuge-stress.c
index bcad47c09518..7a9f1035099b 100644
--- a/tools/testing/selftests/mm/transhuge-stress.c
+++ b/tools/testing/selftests/mm/transhuge-stress.c
@@ -17,6 +17,7 @@
#include <sys/mman.h>
#include "vm_util.h"
#include "kselftest.h"
+#include "thp_settings.h"
int backing_fd = -1;
int mmap_flags = MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE;
@@ -37,6 +38,9 @@ int main(int argc, char **argv)
ksft_print_header();
+ if (!thp_is_enabled())
+ ksft_exit_skip("Transparent Hugepages not available\n");
+
ram = sysconf(_SC_PHYS_PAGES);
if (ram > SIZE_MAX / psize() / 4)
ram = SIZE_MAX / 4;
--
2.53.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v7 0/7] selftests/mm: skip several tests when thp is not available
2026-03-30 15:14 [PATCH v7 0/7] selftests/mm: skip several tests when thp is not available Chunyu Hu
` (6 preceding siblings ...)
2026-03-30 15:15 ` [PATCH v7 7/7] selftests/mm: transhuge_stress: skip the test when thp " Chunyu Hu
@ 2026-03-30 19:25 ` Andrew Morton
7 siblings, 0 replies; 17+ messages in thread
From: Andrew Morton @ 2026-03-30 19:25 UTC (permalink / raw)
To: Chunyu Hu
Cc: david, shuah, linux-mm, ljs, linux-kselftest, linux-kernel,
lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, ziy,
baolin.wang, npache, ryan.roberts, dev.jain, baohua, lance.yang
On Mon, 30 Mar 2026 23:14:56 +0800 Chunyu Hu <chuhu@redhat.com> wrote:
> There are several tests requires transprarent hugepages, when run on thp
> disabled kernel such as realtime kernel, there will be false negative.
> Mark those tests as skip when thp is not available.
Thanks, I updated mm.git's mm-unstable branch to this version.
> Changes in v7:
> - patch 1 add reviewed-by from Lorenzo
> - patch 4 new patch to make ksft_exit_fail_perror variable length
> arguments
> - patch 5 change to use %.*s to print the buf when error happened
> Limit the buflen arg as 2 minimum. Check the error path (numwritten
> < 0).
> And use the ksft_exit_fail_perror to print the logs in error path
Here's how v7 altered mm.git.
tools/testing/selftests/kselftest.h | 21 ++++++++++++++++++---
tools/testing/selftests/mm/vm_util.c | 14 +++++++-------
2 files changed, 25 insertions(+), 10 deletions(-)
--- a/tools/testing/selftests/kselftest.h~b
+++ a/tools/testing/selftests/kselftest.h
@@ -43,7 +43,7 @@
* the program is aborting before finishing all tests):
*
* ksft_exit_fail_msg(fmt, ...);
- * ksft_exit_fail_perror(msg);
+ * ksft_exit_fail_perror(fmt, ...);
*
*/
#ifndef __KSELFTEST_H
@@ -417,9 +417,24 @@ static inline __noreturn __printf(1, 2)
exit(KSFT_FAIL);
}
-static inline __noreturn void ksft_exit_fail_perror(const char *msg)
+static inline __noreturn __printf(1, 2) void ksft_exit_fail_perror(const char *msg, ...)
{
- ksft_exit_fail_msg("%s: %s (%d)\n", msg, strerror(errno), errno);
+ va_list args;
+ char *buf = NULL;
+ int saved_errno = errno;
+
+ va_start(args, msg);
+ if (vasprintf(&buf, msg, args) == -1) {
+ va_end(args);
+ ksft_exit_fail_msg("vasprintf failed: %s (%d)\n", strerror(saved_errno),
+ saved_errno);
+ }
+ va_end(args);
+
+ errno = saved_errno;
+ ksft_exit_fail_msg("%s: %s (%d)\n", buf, strerror(errno), errno);
+
+ free(buf);
}
static inline __noreturn void ksft_exit_xfail(void)
--- a/tools/testing/selftests/mm/vm_util.c~b
+++ a/tools/testing/selftests/mm/vm_util.c
@@ -782,21 +782,21 @@ void write_file(const char *path, const
int fd, saved_errno;
ssize_t numwritten;
- if (buflen < 1)
+ if (buflen < 2)
ksft_exit_fail_msg("Incorrect buffer len: %zu\n", buflen);
fd = open(path, O_WRONLY);
if (fd == -1)
- ksft_exit_fail_msg("%s open failed: %s\n", path, strerror(errno));
+ ksft_exit_fail_perror("%s open failed", path);
numwritten = write(fd, buf, buflen - 1);
saved_errno = errno;
close(fd);
errno = saved_errno;
- if (numwritten < 1)
- ksft_exit_fail_msg("%s write(%s) failed: %s\n", path, buf,
- strerror(errno));
+ if (numwritten < 0)
+ ksft_exit_fail_perror("%s write(%.*s) failed", path, (int)(buflen - 1),
+ buf);
if (numwritten != buflen - 1)
- ksft_exit_fail_msg("%s write(%s) is truncated, expected %zu bytes, got %zd bytes\n",
- path, buf, buflen - 1, numwritten);
+ ksft_exit_fail_msg("%s write(%.*s) is truncated, expected %zu bytes, got %zd bytes\n",
+ path, (int)(buflen - 1), buf, buflen - 1, numwritten);
}
_
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments
2026-03-30 15:15 ` [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments Chunyu Hu
@ 2026-03-31 10:31 ` Chunyu Hu
2026-03-31 19:09 ` Andrew Morton
2026-04-01 11:03 ` Mark Brown
1 sibling, 1 reply; 17+ messages in thread
From: Chunyu Hu @ 2026-03-31 10:31 UTC (permalink / raw)
To: akpm, david, shuah, linux-mm, ljs
Cc: linux-kselftest, linux-kernel, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko, ziy, baolin.wang, npache,
ryan.roberts, dev.jain, baohua, lance.yang
On Mon, Mar 30, 2026 at 11:15:00PM +0800, Chunyu Hu wrote:
> The ksft_exit_fail_perror function previously only accepted a single string
> argument, which limited its flexibility for providing specific context to
> failure messages.
>
> This change updates ksft_exit_fail_perror to support variable arguments,
> similar to ksft_exit_fail_msg. Adding the __printf(1, 2) attribute enables
> compile-time checking for format string correctness.
>
> Signed-off-by: Chunyu Hu <chuhu@redhat.com>
> ---
> Changes in v7:
> - new patch to convert ksft_exit_fail_perror support variable arguments
> ---
> tools/testing/selftests/kselftest.h | 21 ++++++++++++++++++---
> 1 file changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/tools/testing/selftests/kselftest.h b/tools/testing/selftests/kselftest.h
> index afbcf8412ae5..11cabdabb3f6 100644
> --- a/tools/testing/selftests/kselftest.h
> +++ b/tools/testing/selftests/kselftest.h
> @@ -43,7 +43,7 @@
> * the program is aborting before finishing all tests):
> *
> * ksft_exit_fail_msg(fmt, ...);
> - * ksft_exit_fail_perror(msg);
> + * ksft_exit_fail_perror(fmt, ...);
> *
> */
> #ifndef __KSELFTEST_H
> @@ -417,9 +417,24 @@ static inline __noreturn __printf(1, 2) void ksft_exit_fail_msg(const char *msg,
> exit(KSFT_FAIL);
> }
>
> -static inline __noreturn void ksft_exit_fail_perror(const char *msg)
> +static inline __noreturn __printf(1, 2) void ksft_exit_fail_perror(const char *msg, ...)
> {
> - ksft_exit_fail_msg("%s: %s (%d)\n", msg, strerror(errno), errno);
> + va_list args;
> + char *buf = NULL;
> + int saved_errno = errno;
> +
> + va_start(args, msg);
> + if (vasprintf(&buf, msg, args) == -1) {
kernel test robot reported compile error on this, as the vasprintf
required _GNU_SOURCE. Looks like it's not appropriate to be used
in the common header. Looks like it can be replaced with a buf and
vsnprintf instead.
char buf[512];
va_start(args, msg);
vsnprintf(buf, sizeof(buf), msg, args);
```
In file included from za-fork.c:12:
../../kselftest.h: In function 'ksft_exit_fail_perror':
>> ../../kselftest.h:427:13: error: implicit declaration of function 'vasprintf'; did you mean 'vsprintf'? [-Wimplicit-function-declaration]
427 | if (vasprintf(&buf, msg, args) == -1) {
| ^~~~~~~~~
| vsprintf
--
In file included from basic-gcs.c:16:
tools/testing/selftests/kselftest.h: In function 'ksft_exit_fail_perror':
>> tools/testing/selftests/kselftest.h:427:13: error: implicit declaration of function 'vasprintf'; did you mean 'vsprintf'? [-Wimplicit-function-declaration]
427 | if (vasprintf(&buf, msg, args) == -1) {
| ^~~~~~~~~
| vsprintf
```
> + va_end(args);
> + ksft_exit_fail_msg("vasprintf failed: %s (%d)\n", strerror(saved_errno),
> + saved_errno);
> + }
> + va_end(args);
> +
> + errno = saved_errno;
> + ksft_exit_fail_msg("%s: %s (%d)\n", buf, strerror(errno), errno);
> +
> + free(buf);
> }
>
> static inline __noreturn void ksft_exit_xfail(void)
> --
> 2.53.0
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments
2026-03-31 10:31 ` Chunyu Hu
@ 2026-03-31 19:09 ` Andrew Morton
2026-04-01 13:32 ` Chunyu Hu
0 siblings, 1 reply; 17+ messages in thread
From: Andrew Morton @ 2026-03-31 19:09 UTC (permalink / raw)
To: Chunyu Hu
Cc: david, shuah, linux-mm, ljs, linux-kselftest, linux-kernel,
lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, ziy,
baolin.wang, npache, ryan.roberts, dev.jain, baohua, lance.yang
On Tue, 31 Mar 2026 18:31:42 +0800 Chunyu Hu <chuhu@redhat.com> wrote:
> > - ksft_exit_fail_msg("%s: %s (%d)\n", msg, strerror(errno), errno);
> > + va_list args;
> > + char *buf = NULL;
> > + int saved_errno = errno;
> > +
> > + va_start(args, msg);
> > + if (vasprintf(&buf, msg, args) == -1) {
>
> kernel test robot reported compile error on this, as the vasprintf
> required _GNU_SOURCE. Looks like it's not appropriate to be used
> in the common header. Looks like it can be replaced with a buf and
> vsnprintf instead.
I like vasprintf()!
"#define _GNU_SOURCE" occurs 402 times in selftests/, so perhaps we can
find a way to keep it?
(err, *why* 402 times? Can't it be just once?)
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments
2026-03-30 15:15 ` [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments Chunyu Hu
2026-03-31 10:31 ` Chunyu Hu
@ 2026-04-01 11:03 ` Mark Brown
2026-04-01 12:08 ` Thomas Weißschuh
2026-04-01 13:46 ` Chunyu Hu
1 sibling, 2 replies; 17+ messages in thread
From: Mark Brown @ 2026-04-01 11:03 UTC (permalink / raw)
To: Chunyu Hu
Cc: akpm, david, shuah, linux-mm, ljs, linux-kselftest, linux-kernel,
lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, ziy,
baolin.wang, npache, ryan.roberts, dev.jain, baohua, lance.yang,
Thomas Weißschuh, Willy Tarreau
[-- Attachment #1: Type: text/plain, Size: 1119 bytes --]
On Mon, Mar 30, 2026 at 11:15:00PM +0800, Chunyu Hu wrote:
> The ksft_exit_fail_perror function previously only accepted a single string
> argument, which limited its flexibility for providing specific context to
> failure messages.
> This change updates ksft_exit_fail_perror to support variable arguments,
> similar to ksft_exit_fail_msg. Adding the __printf(1, 2) attribute enables
> compile-time checking for format string correctness.
This is causing build regressions on the arm64 selftests:
/arm64/fp/za-fork-asm.o -o /build/stage/build-work/kselftest/arm64/fp/za-fork
In file included from za-fork.c:12:
../../kselftest.h: In function ‘ksft_exit_fail_perror’:
../../kselftest.h:427:13: error: implicit declaration of function ‘vasprintf’; d
id you mean ‘vsprintf’? [-Wimplicit-function-declaration]
427 | if (vasprintf(&buf, msg, args) == -1) {
| ^~~~~~~~~
| vsprintf
This is because za-fork uses nolibc which does not implement
vasprintf().
I need to look at why this managed to pass the build testing I do in
-next...
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments
2026-04-01 11:03 ` Mark Brown
@ 2026-04-01 12:08 ` Thomas Weißschuh
2026-04-02 1:16 ` Chunyu Hu
2026-04-01 13:46 ` Chunyu Hu
1 sibling, 1 reply; 17+ messages in thread
From: Thomas Weißschuh @ 2026-04-01 12:08 UTC (permalink / raw)
To: Mark Brown
Cc: Chunyu Hu, akpm, david, shuah, linux-mm, ljs, linux-kselftest,
linux-kernel, lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb,
mhocko, ziy, baolin.wang, npache, ryan.roberts, dev.jain, baohua,
lance.yang, Willy Tarreau
On 2026-04-01 12:03:09+0100, Mark Brown wrote:
> On Mon, Mar 30, 2026 at 11:15:00PM +0800, Chunyu Hu wrote:
>
> > The ksft_exit_fail_perror function previously only accepted a single string
> > argument, which limited its flexibility for providing specific context to
> > failure messages.
>
> > This change updates ksft_exit_fail_perror to support variable arguments,
> > similar to ksft_exit_fail_msg. Adding the __printf(1, 2) attribute enables
> > compile-time checking for format string correctness.
>
> This is causing build regressions on the arm64 selftests:
>
> /arm64/fp/za-fork-asm.o -o /build/stage/build-work/kselftest/arm64/fp/za-fork
> In file included from za-fork.c:12:
> ../../kselftest.h: In function ‘ksft_exit_fail_perror’:
> ../../kselftest.h:427:13: error: implicit declaration of function ‘vasprintf’; d
> id you mean ‘vsprintf’? [-Wimplicit-function-declaration]
> 427 | if (vasprintf(&buf, msg, args) == -1) {
> | ^~~~~~~~~
> | vsprintf
>
> This is because za-fork uses nolibc which does not implement
> vasprintf().
We can add vasprintf() to nolibc, I'll send a patch later today.
But it will be fairly inefficient, as our malloc() implementation
is *very* simple. Not that it would matter here.
That said, I am not a fan of the new ksft_exit_fail_perror().
What about this:
#define ksft_exit_fail_perror(msg, ...) \
ksft_exit_fail_msg(msg ": %s (%d)\n" __VA_OPT__(,) __VA_ARGS__, strerror(errno), errno);
A similar treatment might be done to ksft_exit_fail_msg().
> I need to look at why this managed to pass the build testing I do in
> -next...
Thomas
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments
2026-03-31 19:09 ` Andrew Morton
@ 2026-04-01 13:32 ` Chunyu Hu
0 siblings, 0 replies; 17+ messages in thread
From: Chunyu Hu @ 2026-04-01 13:32 UTC (permalink / raw)
To: Andrew Morton
Cc: david, shuah, linux-mm, ljs, linux-kselftest, linux-kernel,
lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, ziy,
baolin.wang, npache, ryan.roberts, dev.jain, baohua, lance.yang
On Tue, Mar 31, 2026 at 12:09:02PM -0700, Andrew Morton wrote:
> On Tue, 31 Mar 2026 18:31:42 +0800 Chunyu Hu <chuhu@redhat.com> wrote:
>
> > > - ksft_exit_fail_msg("%s: %s (%d)\n", msg, strerror(errno), errno);
> > > + va_list args;
> > > + char *buf = NULL;
> > > + int saved_errno = errno;
> > > +
> > > + va_start(args, msg);
> > > + if (vasprintf(&buf, msg, args) == -1) {
> >
> > kernel test robot reported compile error on this, as the vasprintf
> > required _GNU_SOURCE. Looks like it's not appropriate to be used
> > in the common header. Looks like it can be replaced with a buf and
> > vsnprintf instead.
>
> I like vasprintf()!
>
> "#define _GNU_SOURCE" occurs 402 times in selftests/, so perhaps we can
> find a way to keep it?
>
> (err, *why* 402 times? Can't it be just once?)
>
_GNU_SOURCE is a feature macro, may silently cause troubles if defined
globally and it's recommended to be used explicitly and maybe that's why
we have so many definitions in c files. It's usually requireed to be
defined on the top of the include file list of c file. So although we
can see kselftest_harness.h defined _GNU_SOURCE, but still can see some
many (80+) c files define _GNU_SOURCE on the top and include
"kselftest_harness.h" at same file in the bottom of the include files list.
So the side efffect of using the vasprintf in kselftest.h is user need
to take care of _GNU_SOURCE definition because a header requries that...
and the header may change something silently because of the _GNU_SOURCE.
And a weird thing is _GNU_SOURCE is not defined, but the compile of
the selftests calling the ksft_exit_fail_perror(vasprintf) succeed by
accident, maybe man page need update or something I missed.
As Mark and Thomas mentioned, the root cause is not this macro's lack
of definition, it's when '-nostdlib' is specified in the compile flag,
the nolibc lib don't have the fallback implement.
So it may be not appropriate to use it in the kselftest.h. And
considering if we use a buf[], the size is limited and the message
could be truncated, still not ideal.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments
2026-04-01 11:03 ` Mark Brown
2026-04-01 12:08 ` Thomas Weißschuh
@ 2026-04-01 13:46 ` Chunyu Hu
[not found] ` <20260401143831.31f40405758f78d7955ff6db@linux-foundation.org>
1 sibling, 1 reply; 17+ messages in thread
From: Chunyu Hu @ 2026-04-01 13:46 UTC (permalink / raw)
To: Mark Brown
Cc: akpm, david, shuah, linux-mm, ljs, linux-kselftest, linux-kernel,
lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, ziy,
baolin.wang, npache, ryan.roberts, dev.jain, baohua, lance.yang,
Thomas Weißschuh, Willy Tarreau
On Wed, Apr 01, 2026 at 12:03:09PM +0100, Mark Brown wrote:
> On Mon, Mar 30, 2026 at 11:15:00PM +0800, Chunyu Hu wrote:
>
> > The ksft_exit_fail_perror function previously only accepted a single string
> > argument, which limited its flexibility for providing specific context to
> > failure messages.
>
> > This change updates ksft_exit_fail_perror to support variable arguments,
> > similar to ksft_exit_fail_msg. Adding the __printf(1, 2) attribute enables
> > compile-time checking for format string correctness.
>
> This is causing build regressions on the arm64 selftests:
>
> /arm64/fp/za-fork-asm.o -o /build/stage/build-work/kselftest/arm64/fp/za-fork
> In file included from za-fork.c:12:
> ../../kselftest.h: In function ‘ksft_exit_fail_perror’:
> ../../kselftest.h:427:13: error: implicit declaration of function ‘vasprintf’; d
> id you mean ‘vsprintf’? [-Wimplicit-function-declaration]
> 427 | if (vasprintf(&buf, msg, args) == -1) {
> | ^~~~~~~~~
> | vsprintf
>
> This is because za-fork uses nolibc which does not implement
> vasprintf().
>
> I need to look at why this managed to pass the build testing I do in
> -next...
I can reproduce this issue with nolibc compile. Thanks for the
debugging. It's great if we have that definition in nolibc lib.
For thsi series, because according to man page, vasprintf()
requires _GNU_SOURCE, and implemeted it in kselftest.h will
add the burden to all c files, or fore a _GNU_SOURCE to
all c files included, I tend to go back to ksft_exit_fail_msg.
;)
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments
[not found] ` <20260401143831.31f40405758f78d7955ff6db@linux-foundation.org>
@ 2026-04-02 1:13 ` Chunyu Hu
0 siblings, 0 replies; 17+ messages in thread
From: Chunyu Hu @ 2026-04-02 1:13 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-kselftest, linux-kernel, linux-mm, akpm
On Wed, Apr 01, 2026 at 02:38:31PM -0700, Andrew Morton wrote:
> On Wed, 1 Apr 2026 21:46:32 +0800 Chunyu Hu <chuhu@redhat.com> wrote:
>
> > > I need to look at why this managed to pass the build testing I do in
> > > -next...
> >
> > I can reproduce this issue with nolibc compile. Thanks for the
> > debugging. It's great if we have that definition in nolibc lib.
> >
> > For thsi series, because according to man page, vasprintf()
> > requires _GNU_SOURCE, and implemeted it in kselftest.h will
> > add the burden to all c files, or fore a _GNU_SOURCE to
> > all c files included, I tend to go back to ksft_exit_fail_msg.
> > ;)
>
> Thanks.
>
> Can we please get this sorted out fairly soon? It's not good
> to be breaking -next for others.
Sure. Will post v8 soon. Added back two mail lists.
>
> I would prefer to retain the series - all those false negatives
> on no-THP kernels are undesirable!
>
Thanks!
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments
2026-04-01 12:08 ` Thomas Weißschuh
@ 2026-04-02 1:16 ` Chunyu Hu
0 siblings, 0 replies; 17+ messages in thread
From: Chunyu Hu @ 2026-04-02 1:16 UTC (permalink / raw)
To: Thomas Weißschuh
Cc: Mark Brown, akpm, david, shuah, linux-mm, ljs, linux-kselftest,
linux-kernel, lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb,
mhocko, ziy, baolin.wang, npache, ryan.roberts, dev.jain, baohua,
lance.yang, Willy Tarreau
On Wed, Apr 01, 2026 at 02:08:53PM +0200, Thomas Weißschuh wrote:
> On 2026-04-01 12:03:09+0100, Mark Brown wrote:
> > On Mon, Mar 30, 2026 at 11:15:00PM +0800, Chunyu Hu wrote:
> >
> > > The ksft_exit_fail_perror function previously only accepted a single string
> > > argument, which limited its flexibility for providing specific context to
> > > failure messages.
> >
> > > This change updates ksft_exit_fail_perror to support variable arguments,
> > > similar to ksft_exit_fail_msg. Adding the __printf(1, 2) attribute enables
> > > compile-time checking for format string correctness.
> >
> > This is causing build regressions on the arm64 selftests:
> >
> > /arm64/fp/za-fork-asm.o -o /build/stage/build-work/kselftest/arm64/fp/za-fork
> > In file included from za-fork.c:12:
> > ../../kselftest.h: In function ‘ksft_exit_fail_perror’:
> > ../../kselftest.h:427:13: error: implicit declaration of function ‘vasprintf’; d
> > id you mean ‘vsprintf’? [-Wimplicit-function-declaration]
> > 427 | if (vasprintf(&buf, msg, args) == -1) {
> > | ^~~~~~~~~
> > | vsprintf
> >
> > This is because za-fork uses nolibc which does not implement
> > vasprintf().
>
> We can add vasprintf() to nolibc, I'll send a patch later today.
> But it will be fairly inefficient, as our malloc() implementation
> is *very* simple. Not that it would matter here.
Thanks!
>
> That said, I am not a fan of the new ksft_exit_fail_perror().
> What about this:
>
> #define ksft_exit_fail_perror(msg, ...) \
> ksft_exit_fail_msg(msg ": %s (%d)\n" __VA_OPT__(,) __VA_ARGS__, strerror(errno), errno);
>
> A similar treatment might be done to ksft_exit_fail_msg().
Thanks for the suggestion! I would use ksft_exit_fail_msg directly for
now, and we don't bother to make it that complex just for saving two
parameters.
>
> > I need to look at why this managed to pass the build testing I do in
> > -next...
>
>
> Thomas
>
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2026-04-02 1:17 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-30 15:14 [PATCH v7 0/7] selftests/mm: skip several tests when thp is not available Chunyu Hu
2026-03-30 15:14 ` [PATCH v7 1/7] selftests/mm/guard-regions: skip collapse test when thp not enabled Chunyu Hu
2026-03-30 15:14 ` [PATCH v7 2/7] selftests/mm: soft-dirty: skip two tests when thp is not available Chunyu Hu
2026-03-30 15:14 ` [PATCH v7 3/7] selftests/mm: move write_file helper to vm_util Chunyu Hu
2026-03-30 15:15 ` [PATCH v7 4/7] selftests: ksft_exit_fail_perror: support printf style arguments Chunyu Hu
2026-03-31 10:31 ` Chunyu Hu
2026-03-31 19:09 ` Andrew Morton
2026-04-01 13:32 ` Chunyu Hu
2026-04-01 11:03 ` Mark Brown
2026-04-01 12:08 ` Thomas Weißschuh
2026-04-02 1:16 ` Chunyu Hu
2026-04-01 13:46 ` Chunyu Hu
[not found] ` <20260401143831.31f40405758f78d7955ff6db@linux-foundation.org>
2026-04-02 1:13 ` Chunyu Hu
2026-03-30 15:15 ` [PATCH v7 5/7] selftests/mm/vm_util: robust write_file() Chunyu Hu
2026-03-30 15:15 ` [PATCH v7 6/7] selftests/mm: split_huge_page_test: skip the test when thp is not available Chunyu Hu
2026-03-30 15:15 ` [PATCH v7 7/7] selftests/mm: transhuge_stress: skip the test when thp " Chunyu Hu
2026-03-30 19:25 ` [PATCH v7 0/7] selftests/mm: skip several tests when thp is " Andrew Morton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox