selftests/mm: fix charge_reserved_hugetlb.sh test
authorDavid Hildenbrand <david@redhat.com>
Wed, 21 Aug 2024 12:31:15 +0000 (14:31 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 4 Sep 2024 04:15:46 +0000 (21:15 -0700)
Currently, running the charge_reserved_hugetlb.sh selftest we can
sometimes observe something like:

  $ ./charge_reserved_hugetlb.sh -cgroup-v2
  ...
  write_result is 0
  After write:
  hugetlb_usage=0
  reserved_usage=10485760
  killing write_to_hugetlbfs
  Received 2.
  Deleting the memory
  Detach failure: Invalid argument
  umount: /mnt/huge: target is busy.

Both cases are issues in the test.

While the unmount error seems to be racy, it will make the test fail:
$ ./run_vmtests.sh -t hugetlb
...
# [FAIL]
not ok 10 charge_reserved_hugetlb.sh -cgroup-v2 # exit=32

The issue is that we are not waiting for the write_to_hugetlbfs process to
quit.  So it might still have a hugetlbfs file open, about which umount is
not happy.  Fix that by making "killall" wait for the process to quit.

The other error ("Detach failure: Invalid argument") does not seem to
result in a test error, but is misleading.  Turns out write_to_hugetlbfs.c
unconditionally tries to cleanup using shmdt(), even when we only
mmap()'ed a hugetlb file.  Even worse, shmaddr is never even set for the
SHM case.  Fix that as well.

With this change it seems to work as expected.

Link: https://lkml.kernel.org/r/20240821123115.2068812-1-david@redhat.com
Fixes: 29750f71a9b4 ("hugetlb_cgroup: add hugetlb_cgroup reservation tests")
Signed-off-by: David Hildenbrand <david@redhat.com>
Reported-by: Mario Casquero <mcasquer@redhat.com>
Reviewed-by: Mina Almasry <almasrymina@google.com>
Tested-by: Mario Casquero <mcasquer@redhat.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/charge_reserved_hugetlb.sh
tools/testing/selftests/mm/write_to_hugetlbfs.c

index d680c00d2853acf12cd7291ec356ed5c95917a8e..67df7b47087f03a015927852045ba9c4238bbdc6 100755 (executable)
@@ -254,7 +254,7 @@ function cleanup_hugetlb_memory() {
   local cgroup="$1"
   if [[ "$(pgrep -f write_to_hugetlbfs)" != "" ]]; then
     echo killing write_to_hugetlbfs
-    killall -2 write_to_hugetlbfs
+    killall -2 --wait write_to_hugetlbfs
     wait_for_hugetlb_memory_to_get_depleted $cgroup
   fi
   set -e
index 6a2caba19ee1d9d8924f3df1d2d5e112f36d3be4..1289d311efd7054bbf23db8c50ab0a485516d91b 100644 (file)
@@ -28,7 +28,7 @@ enum method {
 
 /* Global variables. */
 static const char *self;
-static char *shmaddr;
+static int *shmaddr;
 static int shmid;
 
 /*
@@ -47,15 +47,17 @@ void sig_handler(int signo)
 {
        printf("Received %d.\n", signo);
        if (signo == SIGINT) {
-               printf("Deleting the memory\n");
-               if (shmdt((const void *)shmaddr) != 0) {
-                       perror("Detach failure");
+               if (shmaddr) {
+                       printf("Deleting the memory\n");
+                       if (shmdt((const void *)shmaddr) != 0) {
+                               perror("Detach failure");
+                               shmctl(shmid, IPC_RMID, NULL);
+                               exit(4);
+                       }
+
                        shmctl(shmid, IPC_RMID, NULL);
-                       exit(4);
+                       printf("Done deleting the memory\n");
                }
-
-               shmctl(shmid, IPC_RMID, NULL);
-               printf("Done deleting the memory\n");
        }
        exit(2);
 }
@@ -211,7 +213,8 @@ int main(int argc, char **argv)
                        shmctl(shmid, IPC_RMID, NULL);
                        exit(2);
                }
-               printf("shmaddr: %p\n", ptr);
+               shmaddr = ptr;
+               printf("shmaddr: %p\n", shmaddr);
 
                break;
        default: