Patch "selftests/mm: fix charge_reserved_hugetlb.sh test" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    selftests/mm: fix charge_reserved_hugetlb.sh test

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     selftests-mm-fix-charge_reserved_hugetlb.sh-test.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 18cd30f3b18841cdf4dc8b6e4fa64ddc586a4fda
Author: David Hildenbrand <david@xxxxxxxxxx>
Date:   Wed Aug 21 14:31:15 2024 +0200

    selftests/mm: fix charge_reserved_hugetlb.sh test
    
    [ Upstream commit c41a701d18efe6b8aa402efab16edbaba50c9548 ]
    
    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@xxxxxxxxxx
    Fixes: 29750f71a9b4 ("hugetlb_cgroup: add hugetlb_cgroup reservation tests")
    Signed-off-by: David Hildenbrand <david@xxxxxxxxxx>
    Reported-by: Mario Casquero <mcasquer@xxxxxxxxxx>
    Reviewed-by: Mina Almasry <almasrymina@xxxxxxxxxx>
    Tested-by: Mario Casquero <mcasquer@xxxxxxxxxx>
    Cc: Shuah Khan <shuah@xxxxxxxxxx>
    Cc: Muchun Song <muchun.song@xxxxxxxxx>
    Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/tools/testing/selftests/vm/charge_reserved_hugetlb.sh b/tools/testing/selftests/vm/charge_reserved_hugetlb.sh
index d0107f8ae6213..28192ec98498f 100644
--- a/tools/testing/selftests/vm/charge_reserved_hugetlb.sh
+++ b/tools/testing/selftests/vm/charge_reserved_hugetlb.sh
@@ -249,7 +249,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
diff --git a/tools/testing/selftests/vm/write_to_hugetlbfs.c b/tools/testing/selftests/vm/write_to_hugetlbfs.c
index 6a2caba19ee1d..1289d311efd70 100644
--- a/tools/testing/selftests/vm/write_to_hugetlbfs.c
+++ b/tools/testing/selftests/vm/write_to_hugetlbfs.c
@@ -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:




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux