]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/mm: move write_file helper to vm_util
authorChunyu Hu <chuhu@redhat.com>
Thu, 2 Apr 2026 01:45:40 +0000 (09:45 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 18 Apr 2026 07:10:54 +0000 (00:10 -0700)
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().

Link: https://lore.kernel.org/20260402014543.1671131-4-chuhu@redhat.com
Signed-off-by: Chunyu Hu <chuhu@redhat.com>
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>
Cc: Nico Pache <npache@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/split_huge_page_test.c
tools/testing/selftests/mm/thp_settings.c
tools/testing/selftests/mm/thp_settings.h
tools/testing/selftests/mm/vm_util.c
tools/testing/selftests/mm/vm_util.h

index e0167111bdd153bc2cd6e6f066e2a50ad1be5491..93f205327b849ffe702b31466bace634690a92aa 100644 (file)
@@ -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];
index 574bd0f8ae48000103b5fa4691ee081d41f799a4..e748ebfb3d4e21e7fcf255a4750a517019124884 100644 (file)
@@ -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)
index 76eeb712e5f10f1de4017efe16401074a2725bd3..7748a9009191524bc821839b8637e620fec6749c 100644 (file)
@@ -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);
 
index a6d4ff7dfdc0f4d9d10c194b96f02a4c2f8d9f6e..ad96d19d1b850adc535f1e30051a382720cddd40 100644 (file)
@@ -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");
+}
index e9c4e24769c170dc24c57fad7397c28ef79d269b..1a07305ceff4d657ea77b0fe1c33da801b3d8174 100644 (file)
@@ -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);