On 15/08/2026 9:07 am, Song Hu wrote: > hugetlb-soft-offline toggles /proc/sys/vm/enable_soft_offline between 1 > and 0 (test_soft_offline_common(1) then (0)) and leaves it at 0 when it > finishes, silently disabling soft offlining for the whole system after > the run. > > Save the original value before the test and restore it from an atexit() > handler, so the sysctl is also restored when the test exits early via > ksft_exit_fail_msg(), as hugepage_restore_settings_atexit() in > hugepage_settings.c already does. Use read_num()/write_num() from > vm_util instead of the hand-rolled popen()/fopen() helpers. > > Signed-off-by: Song Hu <[email protected]> > --- > .../selftests/mm/hugetlb-soft-offline.c | 35 +++++++------------ > 1 file changed, 12 insertions(+), 23 deletions(-) > > diff --git a/tools/testing/selftests/mm/hugetlb-soft-offline.c > b/tools/testing/selftests/mm/hugetlb-soft-offline.c > index bc202e4ed2bd..86259921d54c 100644 > --- a/tools/testing/selftests/mm/hugetlb-soft-offline.c > +++ b/tools/testing/selftests/mm/hugetlb-soft-offline.c > @@ -23,6 +23,7 @@ > #include <sys/types.h> > > #include "kselftest.h" > +#include "vm_util.h" > #include "hugepage_settings.h" > > #ifndef MADV_SOFT_OFFLINE > @@ -31,6 +32,8 @@ > > #define EPREFIX " !!! " > > +#define ENABLE_SOFT_OFFLINE_PATH "/proc/sys/vm/enable_soft_offline" > + > static int do_soft_offline(int fd, size_t len, int expect_errno) > { > char *filemap = NULL; > @@ -77,26 +80,12 @@ static int do_soft_offline(int fd, size_t len, int > expect_errno) > return ret; > } > > -static int set_enable_soft_offline(int value) > -{ > - char cmd[256] = {0}; > - FILE *cmdfile = NULL; > - > - if (value != 0 && value != 1) > - return -EINVAL; > - > - sprintf(cmd, "echo %d > /proc/sys/vm/enable_soft_offline", value); > - cmdfile = popen(cmd, "r"); > - > - if (cmdfile) > - ksft_print_msg("enable_soft_offline => %d\n", value); > - else { > - ksft_perror(EPREFIX "failed to set enable_soft_offline"); > - return errno; > - } > +static unsigned long orig_enable_soft_offline = -1UL; > > - pclose(cmdfile); > - return 0; > +static void restore_enable_soft_offline(void) > +{ > + if (orig_enable_soft_offline != -1UL) > + write_num(ENABLE_SOFT_OFFLINE_PATH, orig_enable_soft_offline); > } > > static int create_hugetlbfs_file(struct statfs *file_stat) > @@ -145,10 +134,7 @@ static void test_soft_offline_common(int > enable_soft_offline) > hugepagesize_kb = file_stat.f_bsize / 1024; > ksft_print_msg("Hugepagesize is %ldkB\n", hugepagesize_kb); > > - if (set_enable_soft_offline(enable_soft_offline) != 0) { > - close(fd); > - ksft_exit_fail_msg("Failed to set enable_soft_offline\n"); > - } > + write_num(ENABLE_SOFT_OFFLINE_PATH, enable_soft_offline); > > nr_hugepages_before = hugetlb_nr_default_pages(); > > @@ -192,6 +178,9 @@ int main(int argc, char **argv) > > ksft_set_plan(2); > > + orig_enable_soft_offline = read_num(ENABLE_SOFT_OFFLINE_PATH); > + atexit(restore_enable_soft_offline); > +
Seems good. Thanks for fixing. Reviewed-by: Muhammad Usama Anjum <[email protected]> Tested-by: Muhammad Usama Anjum <[email protected]> Thanks, Usama

