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.  Read the original value before the test and restore it before
ksft_finished().

Signed-off-by: Song Hu <[email protected]>
---
 .../selftests/mm/hugetlb-soft-offline.c       | 24 +++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/tools/testing/selftests/mm/hugetlb-soft-offline.c 
b/tools/testing/selftests/mm/hugetlb-soft-offline.c
index bc202e4ed2bd..35dcf661b091 100644
--- a/tools/testing/selftests/mm/hugetlb-soft-offline.c
+++ b/tools/testing/selftests/mm/hugetlb-soft-offline.c
@@ -99,6 +99,23 @@ static int set_enable_soft_offline(int value)
        return 0;
 }
 
+static int get_enable_soft_offline(void)
+{
+       FILE *fp = fopen("/proc/sys/vm/enable_soft_offline", "r");
+       int value = -1;
+
+       if (!fp) {
+               ksft_perror(EPREFIX "failed to read enable_soft_offline");
+               return -1;
+       }
+       if (fscanf(fp, "%d", &value) != 1) {
+               ksft_perror(EPREFIX "failed to parse enable_soft_offline");
+               value = -1;
+       }
+       fclose(fp);
+       return value;
+}
+
 static int create_hugetlbfs_file(struct statfs *file_stat)
 {
        int fd;
@@ -185,6 +202,8 @@ static void test_soft_offline_common(int 
enable_soft_offline)
 
 int main(int argc, char **argv)
 {
+       int orig;
+
        ksft_print_header();
 
        if (!hugetlb_setup_default(8))
@@ -192,8 +211,13 @@ int main(int argc, char **argv)
 
        ksft_set_plan(2);
 
+       orig = get_enable_soft_offline();
+
        test_soft_offline_common(1);
        test_soft_offline_common(0);
 
+       if (orig >= 0)
+               set_enable_soft_offline(orig);
+
        ksft_finished();
 }
-- 
2.43.0


Reply via email to