[v8,05/10] selftests/mm/kugepaged: Restore thp settings at exit

Message ID 20231204102027.57185-6-ryan.roberts@arm.com
State New
Headers
Series Multi-size THP for anonymous memory |

Commit Message

Ryan Roberts Dec. 4, 2023, 10:20 a.m. UTC
  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.

Reviewed-by: Alistair Popple <apopple@nvidia.com>
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
---
 tools/testing/selftests/mm/khugepaged.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)
  

Comments

David Hildenbrand Dec. 5, 2023, 5 p.m. UTC | #1
On 04.12.23 11:20, Ryan Roberts wrote:
> 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.
> 
> Reviewed-by: Alistair Popple <apopple@nvidia.com>
> Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
> ---
>   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);

Reviewed-by: David Hildenbrand <david@redhat.com>

Might similarly come in handy for the cow tests. Can be done later.
  

Patch

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);