On 2025/4/1 20:54, David Hildenbrand wrote:
On 26.03.25 04:38, Baolin Wang wrote:
When running mincore test cases, I encountered the following failures:
"
mincore_selftest.c:359:check_tmpfs_mmap:Expected ra_pages (511) == 0 (0)
mincore_selftest.c:360:check_tmpfs_mmap:Read-ahead pages found in memory
check_tmpfs_mmap: Test terminated by assertion
FAIL global.check_tmpfs_mmap
not ok 5 global.check_tmpfs_mmap
FAILED: 4 / 5 tests passed
"
The reason for the test case failure is that my system automatically
enabled
tmpfs large folio allocation by adding the
'transparent_hugepage_tmpfs=always'
cmdline. However, the test case still expects the tmpfs mounted on
/dev/shm to
allocate small folios, which leads to assertion failures when
verifying readahead
pages.
To fix this issue, remount tmpfs to a new test directory and set the
'huge=never'
parameter to avoid allocating large folios, which can pass the test.
Signed-off-by: Baolin Wang <baolin.wang@xxxxxxxxxxxxxxxxx>
---
.../selftests/mincore/mincore_selftest.c | 25 +++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/mincore/mincore_selftest.c
b/tools/testing/selftests/mincore/mincore_selftest.c
index e949a43a6145..e8d7a3a4739f 100644
--- a/tools/testing/selftests/mincore/mincore_selftest.c
+++ b/tools/testing/selftests/mincore/mincore_selftest.c
@@ -12,6 +12,7 @@
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
+#include <sys/mount.h>
#include <string.h>
#include <fcntl.h>
@@ -283,7 +284,7 @@ TEST(check_file_mmap)
free(vec);
}
-
+#define INPUT_MAX 80
/*
* Test mincore() behavior on a page backed by a tmpfs file. This test
* performs the same steps as the previous one. However, we don't
expect
@@ -291,6 +292,9 @@ TEST(check_file_mmap)
*/
TEST(check_tmpfs_mmap)
{
+ char tmpfs_template[] = "/tmp/check_tmpfs_XXXXXX";
+ const char *tmpfs_loc = mkdtemp(tmpfs_template);
+ char testfile[INPUT_MAX];
unsigned char *vec;
int vec_size;
char *addr;
@@ -300,6 +304,10 @@ TEST(check_tmpfs_mmap)
int i;
int ra_pages = 0;
+ ASSERT_NE(NULL, tmpfs_loc) {
+ TH_LOG("Can't mkdir tmpfs dentry\n");
+ }
+
page_size = sysconf(_SC_PAGESIZE);
vec_size = FILE_SIZE / page_size;
if (FILE_SIZE % page_size)
@@ -311,7 +319,18 @@ TEST(check_tmpfs_mmap)
}
errno = 0;
- fd = open("/dev/shm", O_TMPFILE | O_RDWR, 0600);
+ /* Do not use large folios for tmpfs mincore testing */
+ retval = mount("tmpfs", tmpfs_loc, "tmpfs", 0,
"huge=never,size=4M");
+ ASSERT_EQ(0, retval) {
+ TH_LOG("Unable to mount tmpfs for testing\n");
+ }
+
+ retval = snprintf(testfile, INPUT_MAX, "%s/test_file", tmpfs_loc);
+ ASSERT_GE(INPUT_MAX, retval) {
+ TH_LOG("Unable to create a tmpfs for testing\n");
+ }
+
+ fd = open(testfile, O_CREAT|O_RDWR, 0664);
ASSERT_NE(-1, fd) {
TH_LOG("Can't create temporary file: %s",
strerror(errno));
@@ -363,6 +382,8 @@ TEST(check_tmpfs_mmap)
munmap(addr, FILE_SIZE);
close(fd);
free(vec);
+ umount(tmpfs_loc);
+ rmdir(tmpfs_loc);
}
TEST_HARNESS_MAIN
Is there anything that cleans up the mount in case something goes wrong
(we run into an assertion), or will the directory+mount stick around
forever?
Good point, will cleanup the mount in the next version.
But I also wonder whether check_tmpfs_mmap() should be changed to live
with the fact that readahead ("faultaround") could now happen. What's
the reason for not doing that?
From this test case's description, it doesn't expect any readahead.