Ryan Roberts <ryan.roberts@xxxxxxx> writes: > 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. > > Signed-off-by: Ryan Roberts <ryan.roberts@xxxxxxx> Reviewed-by: Alistair Popple <apopple@xxxxxxxxxx> > --- > tools/testing/selftests/mm/khugepaged.c | 17 +++++++++++------ > 1 file changed, 11 insertions(+), 6 deletions(-) > > diff --git a/tools/testing/selftests/mm/khugepaged.c b/tools/testing/selftests/mm/khugepaged.c > index 030667cb5533..fc47a1c4944c 100644 > --- a/tools/testing/selftests/mm/khugepaged.c > +++ b/tools/testing/selftests/mm/khugepaged.c > @@ -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);