selftests/mm/kugepaged: restore thp settings at exit
authorRyan Roberts <ryan.roberts@arm.com>
Thu, 7 Dec 2023 16:12:06 +0000 (16:12 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 20 Dec 2023 22:48:12 +0000 (14:48 -0800)
Previously, the saved thp settings would be restored upon a signal or at
the natural end of the test suite.  But there are some tests that directly
call exit() upon failure.  In this case, the thp settings were not being
restored, which could then influence other tests.

Fix this by installing an atexit() handler to do the actual restore.  The
signal handler can now just call exit() and the atexit handler is invoked.

Link: https://lkml.kernel.org/r/20231207161211.2374093-6-ryan.roberts@arm.com
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
Reviewed-by: Alistair Popple <apopple@nvidia.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Tested-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Tested-by: John Hubbard <jhubbard@nvidia.com>
Cc: Anshuman Khandual <anshuman.khandual@arm.com>
Cc: Barry Song <v-songbaohua@oppo.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: David Rientjes <rientjes@google.com>
Cc: "Huang, Ying" <ying.huang@intel.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Itaru Kitayama <itaru.kitayama@gmail.com>
Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Luis Chamberlain <mcgrof@kernel.org>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Yang Shi <shy828301@gmail.com>
Cc: Yin Fengwei <fengwei.yin@intel.com>
Cc: Yu Zhao <yuzhao@google.com>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/khugepaged.c

index 030667cb55337735355bb0bb833f4a5a56cfbdee..fc47a1c4944c4fe114aa76465f494319932d6eab 100644 (file)
@@ -374,18 +374,22 @@ static void pop_settings(void)
        write_settings(current_settings());
 }
 
-static void restore_settings(int sig)
+static void restore_settings_atexit(void)
 {
        if (skip_settings_restore)
-               goto out;
+               return;
 
        printf("Restore THP and khugepaged settings...");
        write_settings(&saved_settings);
        success("OK");
-       if (sig)
-               exit(EXIT_FAILURE);
-out:
-       exit(exit_status);
+
+       skip_settings_restore = true;
+}
+
+static void restore_settings(int sig)
+{
+       /* exit() will invoke the restore_settings_atexit handler. */
+       exit(sig ? EXIT_FAILURE : exit_status);
 }
 
 static void save_settings(void)
@@ -415,6 +419,7 @@ static void save_settings(void)
 
        success("OK");
 
+       atexit(restore_settings_atexit);
        signal(SIGTERM, restore_settings);
        signal(SIGINT, restore_settings);
        signal(SIGHUP, restore_settings);