From: Chunyu Hu <chuhu@redhat.com>
To: Mike Rapoport <rppt@kernel.org>
Cc: akpm@linux-foundation.org, david@kernel.org, shuah@kernel.org,
linux-mm@kvack.org, ljs@kernel.org,
linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org,
lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com,
vbabka@suse.cz, surenb@google.com, mhocko@suse.com,
ziy@nvidia.com, baolin.wang@linux.alibaba.com, npache@redhat.com,
ryan.roberts@arm.com, dev.jain@arm.com, baohua@kernel.org,
lance.yang@linux.dev
Subject: Re: [PATCH v2 3/5] selftests/mm: move write_file helper to vm_util
Date: Tue, 17 Mar 2026 17:00:03 +0800 [thread overview]
Message-ID: <abkYE-tUzy6cz_kH@gmail.com> (raw)
In-Reply-To: <abekn9aBMw1e1Rw1@kernel.org>
On Mon, Mar 16, 2026 at 08:35:11AM +0200, Mike Rapoport wrote:
> On Mon, Mar 16, 2026 at 12:43:33PM +0800, Chunyu Hu wrote:
> > 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 just leave one version of write_file, and move it into the vm_util.
> > This make it easy to maitain and user could just include one vm_util.h when
> > then don't need thp setting helpers. Keep the prototype of returning the
> > written bytes num.
> >
> > Suggested-by: Mike Rapoport <rppt@kernel.org>
> > Signed-off-by: Chunyu Hu <chuhu@redhat.com>
> > ---
> > Changes in v2:
> > new patch from v2
> > ---
> > .../selftests/mm/split_huge_page_test.c | 15 ------------
> > tools/testing/selftests/mm/thp_settings.c | 24 +------------------
> > tools/testing/selftests/mm/thp_settings.h | 1 -
> > tools/testing/selftests/mm/vm_util.c | 16 +++++++++++++
> > tools/testing/selftests/mm/vm_util.h | 2 ++
> > 5 files changed, 19 insertions(+), 39 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..02de28ecf31a 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];
> > 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..b4b3b48f8dc9 100644
> > --- a/tools/testing/selftests/mm/vm_util.c
> > +++ b/tools/testing/selftests/mm/vm_util.c
> > @@ -764,3 +764,19 @@ int unpoison_memory(unsigned long pfn)
> >
> > return ret > 0 ? 0 : -errno;
> > }
> > +
> > +unsigned 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)
> > + 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");
> > + return (unsigned int) numwritten;
>
> If we exit on any failure, the function can be void just like in
> split_huge_page_test.c. This will also simplify write_num() and read_num()
> in thp_settigns.c
Good point. I will change it to void. I wont touch read_file() here.
>
> > +}
> > diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h
> > index e9c4e24769c1..22c8805e0d7a 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))
> > +
> > +unsigned int write_file(const char *path, const char *buf, size_t buflen);
> > --
> > 2.53.0
> >
>
> --
> Sincerely yours,
> Mike.
>
next prev parent reply other threads:[~2026-03-17 9:00 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-16 4:43 [PATCH v2 0/5] selftests/mm: skip several tests when thp is not available Chunyu Hu
2026-03-16 4:43 ` [PATCH v2 1/5] selftests/mm/guard-regions: skip collapse test when thp not enabled Chunyu Hu
2026-03-16 6:18 ` Mike Rapoport
2026-03-17 6:51 ` Chunyu Hu
2026-03-16 4:43 ` [PATCH v2 2/5] selftests/mm: soft-dirty: skip two tests when thp is not available Chunyu Hu
2026-03-16 6:25 ` Mike Rapoport
2026-03-16 4:43 ` [PATCH v2 3/5] selftests/mm: move write_file helper to vm_util Chunyu Hu
2026-03-16 6:35 ` Mike Rapoport
2026-03-17 9:00 ` Chunyu Hu [this message]
2026-03-16 4:43 ` [PATCH v2 4/5] selftests/mm: split_huge_page_test: skip the test when thp is not available Chunyu Hu
2026-03-16 6:29 ` Mike Rapoport
2026-03-16 14:10 ` David Hildenbrand (Arm)
2026-03-16 4:43 ` [PATCH v2 5/5] selftests/mm: transhuge_stress: skip the test when thp " Chunyu Hu
2026-03-16 6:30 ` Mike Rapoport
2026-03-16 14:11 ` David Hildenbrand (Arm)
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=abkYE-tUzy6cz_kH@gmail.com \
--to=chuhu@redhat.com \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=lance.yang@linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=mhocko@suse.com \
--cc=npache@redhat.com \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=shuah@kernel.org \
--cc=surenb@google.com \
--cc=vbabka@suse.cz \
--cc=ziy@nvidia.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.