From patchwork Mon Jul 17 10:31:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ryan Roberts X-Patchwork-Id: 13315417 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4865EEB64DC for ; Mon, 17 Jul 2023 10:32:22 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 0EF026B007E; Mon, 17 Jul 2023 06:32:21 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 079F76B0080; Mon, 17 Jul 2023 06:32:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E5B5C6B0081; Mon, 17 Jul 2023 06:32:20 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id D92AB6B007E for ; Mon, 17 Jul 2023 06:32:20 -0400 (EDT) Received: from smtpin04.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id BADF61604D6 for ; Mon, 17 Jul 2023 10:32:20 +0000 (UTC) X-FDA: 81020739240.04.5814E73 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf16.hostedemail.com (Postfix) with ESMTP id E8EB9180017 for ; Mon, 17 Jul 2023 10:32:18 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf16.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689589939; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rHtD/pnAHEzhlHxmKN5MIBCps4aYfm1NZFwHzfIO8rs=; b=6rx0x73IN0Xp0mQtP+dJ5d8nsI3FbsIxr71VSnSB4F2fJXqjLjnijMg1XfDwRliHV95GYk PEVeVamapEqKcVHvXq7eLgfMEJGGUxDCS8SHXlpdvrrr1SmpM0aeMwzpv6qUU3o20tTRsD 82ypkl6pCkOtEZgIP6HvH33W1vUfwfw= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf16.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689589939; a=rsa-sha256; cv=none; b=hiphogUacsEIJR5ggwk2ZcS5z+lfs4gyhJAl30s/10s5kFF5LxuoPpIOL1r0ukgneWbi32 fLPdj1ZQRLHxVrjgJ2HblzOrskZSBNnKtbman2kNwr+5xEat+7Sn3n1Mrw4sIHnfMb9rT4 6Qr4CPNu/gKIo2NUzDq2cnAChYZrDFw= Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5DE7F11FB; Mon, 17 Jul 2023 03:33:01 -0700 (PDT) Received: from e125769.cambridge.arm.com (e125769.cambridge.arm.com [10.1.196.26]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 639333F67D; Mon, 17 Jul 2023 03:32:16 -0700 (PDT) From: Ryan Roberts To: "Andrew Morton" , "Shuah Khan" , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , "David Hildenbrand" , "Mark Brown" , "John Hubbard" , "Florent Revest" , Peter Xu Cc: Ryan Roberts , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-kselftest@vger.kernel.org Subject: [PATCH v2 6/8] selftests/mm: Make migration test robust to failure Date: Mon, 17 Jul 2023 11:31:50 +0100 Message-Id: <20230717103152.202078-7-ryan.roberts@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230717103152.202078-1-ryan.roberts@arm.com> References: <20230717103152.202078-1-ryan.roberts@arm.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: E8EB9180017 X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: omt4scc9o71esrhe3e5m6spn8dyjm8e5 X-HE-Tag: 1689589938-320969 X-HE-Meta: U2FsdGVkX1+vGFMf36HWHdLVVA2NtcuV6fbBFRerpYXzN1qxPwtQ+tiX1RoBuhCSAxfSXX2rXIDGcr6YBE3O+e7pc3sOtFXXlHsxLWSBY8I3EghymfIRu6UAz9jSKQ67csgw8jAaELriMdRAEBga2tHPK9QVOmSerKp/8IStG61jhAvSf+ahy5jFhIy90btv2BUe8aNZP7/zLnjygBQbP4dw4TnjM0OsbB7S+z11Sd2gGGz9i8+gODbl7rS01TWFAIRtet1UF6o6WD5KDIDO7ouQwMWCW1kdWbNN7PdFetdQxpzr16laoM8rqtjQQMp4e0usqubTNoP98fpJ2lCe2HXw21KfVpVLVfZAQsW+oITNzAUuHKI3cqgkLAT13yqkF3Xe5eK2EcUZ2vb/ixr5zaEAbDL+p7HaXWwP+A/Z+Wj5d3LME8EtW7ltoUAAGutO4NlwLDOKKgWdJ+pRUOgA1nLpYb3EItFe3DrEhTOu09Gp7ecaoxbRnrVvRW/WgEiwTqcLvRZPQK+95rYx5xkolyOjrCBMCWEQUKycYY+CkmpBa8qLCNTwFkJx8KesC/Xzrd7Wr3yt225kbTjnQARlXdMZjSLmdDmd7C0VBJeMDebXVbu2T1svjfPGynWCDnvoeGIT1i/6T0sxoZVvrmy8GSbHHmt8XBCfqiUi+Bl3m56GXprjn3e4fQXaSNUNIrVgeRG7WbYkRB5ER/62owmPnYq+m3BmMeRm/6wHoITfkkeVYz5TpCOUknh3TGeU5dVcj43V+SZrxalbjvC5gU+mAkvOlYKwXZVUnTdH1/TDmTmFVSzaq6CaYj6G37CH69QJ076PmTlUri6xxj0YuWE7Od/d1MHlIC7m8GzLCRpjPxt6swBUkMyJf9/uhHhRKDLG8nocrBTfP/ZRDq54WWzd6EXOKJX46ccM571eL0UmHY3XeDSDom10FBbIom+6X6GSqEcwA6VM7SRr5YVLs6b FS3h7g+Q GzgKFxdi5foOGMaKtuJnQPsmxz5G4dIkBnMtfQDFcjiMZM0CAeM8fed2cI2hHUZ7cMNSm8IW+OSUEUMh6hZ+ZuvgAg30+Z8/haXtfGtnklnKZsKmlGLM/lBnDPM/KDWIhL0+mjy5eu8vClhJVHQ4mTYbkG0G8CpPDmvgO X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: The `migration` test currently has a number of robustness problems that cause it to hang and leak resources. Timeout: There are 3 tests, which each previously ran for 60 seconds. However, the timeout in mm/settings for a single test binary was set to 45 seconds. So when run using run_kselftest.sh, the top level timeout would trigger before the test binary was finished. Solve this by meeting in the middle; each of the 3 tests now runs for 20 seconds (for a total of 60), and the top level timeout is set to 90 seconds. Leaking child processes: the `shared_anon` test fork()s some children but then an ASSERT() fires before the test kills those children. The assert causes immediate exit of the parent and leaking of the children. Furthermore, if run using the run_kselftest.sh wrapper, the wrapper would get stuck waiting for those children to exit, which never happens. Solve this by deferring any asserts until after the children are killed. The same pattern is used for the threaded tests for uniformity. With these changes, the test binary now runs to completion on arm64, with 2 tests passing and the `shared_anon` test failing. Signed-off-by: Ryan Roberts --- tools/testing/selftests/mm/migration.c | 14 ++++++++++---- tools/testing/selftests/mm/settings | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/mm/migration.c b/tools/testing/selftests/mm/migration.c index 379581567f27..189d7d9070e8 100644 --- a/tools/testing/selftests/mm/migration.c +++ b/tools/testing/selftests/mm/migration.c @@ -15,7 +15,7 @@ #include #define TWOMEG (2<<20) -#define RUNTIME (60) +#define RUNTIME (20) #define ALIGN(x, a) (((x) + (a - 1)) & (~((a) - 1))) @@ -118,6 +118,7 @@ TEST_F_TIMEOUT(migration, private_anon, 2*RUNTIME) { uint64_t *ptr; int i; + int ret; if (self->nthreads < 2 || self->n1 < 0 || self->n2 < 0) SKIP(return, "Not enough threads or NUMA nodes available"); @@ -131,9 +132,10 @@ TEST_F_TIMEOUT(migration, private_anon, 2*RUNTIME) if (pthread_create(&self->threads[i], NULL, access_mem, ptr)) perror("Couldn't create thread"); - ASSERT_EQ(migrate(ptr, self->n1, self->n2), 0); + ret = migrate(ptr, self->n1, self->n2); for (i = 0; i < self->nthreads - 1; i++) ASSERT_EQ(pthread_cancel(self->threads[i]), 0); + ASSERT_EQ(ret, 0); } /* @@ -144,6 +146,7 @@ TEST_F_TIMEOUT(migration, shared_anon, 2*RUNTIME) pid_t pid; uint64_t *ptr; int i; + int ret; if (self->nthreads < 2 || self->n1 < 0 || self->n2 < 0) SKIP(return, "Not enough threads or NUMA nodes available"); @@ -161,9 +164,10 @@ TEST_F_TIMEOUT(migration, shared_anon, 2*RUNTIME) self->pids[i] = pid; } - ASSERT_EQ(migrate(ptr, self->n1, self->n2), 0); + ret = migrate(ptr, self->n1, self->n2); for (i = 0; i < self->nthreads - 1; i++) ASSERT_EQ(kill(self->pids[i], SIGTERM), 0); + ASSERT_EQ(ret, 0); } /* @@ -173,6 +177,7 @@ TEST_F_TIMEOUT(migration, private_anon_thp, 2*RUNTIME) { uint64_t *ptr; int i; + int ret; if (self->nthreads < 2 || self->n1 < 0 || self->n2 < 0) SKIP(return, "Not enough threads or NUMA nodes available"); @@ -188,9 +193,10 @@ TEST_F_TIMEOUT(migration, private_anon_thp, 2*RUNTIME) if (pthread_create(&self->threads[i], NULL, access_mem, ptr)) perror("Couldn't create thread"); - ASSERT_EQ(migrate(ptr, self->n1, self->n2), 0); + ret = migrate(ptr, self->n1, self->n2); for (i = 0; i < self->nthreads - 1; i++) ASSERT_EQ(pthread_cancel(self->threads[i]), 0); + ASSERT_EQ(ret, 0); } TEST_HARNESS_MAIN diff --git a/tools/testing/selftests/mm/settings b/tools/testing/selftests/mm/settings index 9abfc60e9e6f..ba4d85f74cd6 100644 --- a/tools/testing/selftests/mm/settings +++ b/tools/testing/selftests/mm/settings @@ -1 +1 @@ -timeout=45 +timeout=90