selftests/mm: migration: properly cleanup fork()ed processes

Several migration test use fork() to create worker processes.  These
processes are later killed, but nothing collects their exit status and
they remain as zombies in the system.

Add a helper function that kills the worker processes, waitpid()s for them
and verifies the exit status.

Replace the loops that call kill() for each process with a call to that
helper.

Link: https://lore.kernel.org/20260511162840.375890-5-rppt@kernel.org
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reported-by: Luiz Capitulino <luizcap@redhat.com>
Tested-by: Luiz Capitulino <luizcap@redhat.com>
Reviewed-by: Luiz Capitulino <luizcap@redhat.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Barry Song <baohua@kernel.org>
Cc: David Hildenbrand <david@kernel.org>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Donet Tom <donettom@linux.ibm.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Lance Yang <lance.yang@linux.dev>
Cc: Leon Romanovsky <leon@kernel.org>
Cc: Liam Howlett <liam@infradead.org>
Cc: Li Wang <li.wang@linux.dev>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Nico Pache <npache@redhat.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Sarthak Sharma <sarthak.sharma@arm.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Mike Rapoport (Microsoft) 2026-05-11 19:27:48 +03:00 committed by Andrew Morton
parent 3e600b2564
commit 5ea01affb6

View File

@ -67,6 +67,29 @@ FIXTURE_TEARDOWN(migration)
free(self->pids);
}
static bool kill_children(FIXTURE_DATA(migration) * self)
{
bool err = false;
pid_t pid;
int i;
for (i = 0; i < self->nthreads; i++) {
int status = 0;
pid = self->pids[i];
if (pid < 0)
continue;
if (kill(pid, SIGTERM))
err = true;
if (pid != waitpid(pid, &status, 0))
err = true;
if (!WIFSIGNALED(status) || WTERMSIG(status) != SIGTERM)
err = true;
}
return !err;
}
int migrate(uint64_t *ptr, int n1, int n2)
{
int ret, tmp;
@ -151,7 +174,7 @@ TEST_F_TIMEOUT(migration, shared_anon, 2*RUNTIME)
{
pid_t pid;
uint64_t *ptr;
int i;
int i, err;
ptr = mmap(NULL, TWOMEG, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
@ -171,9 +194,9 @@ TEST_F_TIMEOUT(migration, shared_anon, 2*RUNTIME)
}
}
ASSERT_EQ(migrate(ptr, self->n1, self->n2), 0);
for (i = 0; i < self->nthreads; i++)
ASSERT_EQ(kill(self->pids[i], SIGTERM), 0);
err = migrate(ptr, self->n1, self->n2);
ASSERT_EQ(kill_children(self), true);
ASSERT_EQ(err, 0);
}
/*
@ -217,7 +240,7 @@ TEST_F_TIMEOUT(migration, shared_anon_thp, 2*RUNTIME)
uint64_t pmdsize;
pid_t pid;
uint64_t *ptr;
int i;
int i, err;
if (!thp_is_enabled())
SKIP(return, "Transparent Hugepages not available");
@ -247,9 +270,9 @@ TEST_F_TIMEOUT(migration, shared_anon_thp, 2*RUNTIME)
}
}
ASSERT_EQ(migrate(ptr, self->n1, self->n2), 0);
for (i = 0; i < self->nthreads; i++)
ASSERT_EQ(kill(self->pids[i], SIGTERM), 0);
err = migrate(ptr, self->n1, self->n2);
ASSERT_EQ(kill_children(self), true);
ASSERT_EQ(err, 0);
}
/*
@ -287,7 +310,7 @@ TEST_F_TIMEOUT(migration, shared_anon_htlb, 2*RUNTIME)
unsigned long hugepage_size;
pid_t pid;
uint64_t *ptr;
int i;
int i, err;
hugepage_size = default_huge_page_size();
if (!hugepage_size)
@ -311,9 +334,9 @@ TEST_F_TIMEOUT(migration, shared_anon_htlb, 2*RUNTIME)
}
}
ASSERT_EQ(migrate(ptr, self->n1, self->n2), 0);
for (i = 0; i < self->nthreads; i++)
ASSERT_EQ(kill(self->pids[i], SIGTERM), 0);
err = migrate(ptr, self->n1, self->n2);
ASSERT_EQ(kill_children(self), true);
ASSERT_EQ(err, 0);
}
TEST_HARNESS_MAIN