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@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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
fbd3c8aee7
commit
ad18f8f867
2 changed files with 14 additions and 11 deletions
|
@ -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
|
||||
|
|
|
@ -28,7 +28,7 @@ enum method {
|
|||
|
||||
/* Global variables. */
|
||||
static const char *self;
|
||||
static char *shmaddr;
|
||||
static int *shmaddr;
|
||||
static int shmid;
|
||||
|
||||
/*
|
||||
|
@ -47,6 +47,7 @@ void sig_handler(int signo)
|
|||
{
|
||||
printf("Received %d.\n", signo);
|
||||
if (signo == SIGINT) {
|
||||
if (shmaddr) {
|
||||
printf("Deleting the memory\n");
|
||||
if (shmdt((const void *)shmaddr) != 0) {
|
||||
perror("Detach failure");
|
||||
|
@ -57,6 +58,7 @@ void sig_handler(int signo)
|
|||
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:
|
||||
|
|
Loading…
Reference in a new issue