From patchwork Thu Jan 5 10:18:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Houghton X-Patchwork-Id: 13089677 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 7C1ECC3DA7A for ; Thu, 5 Jan 2023 10:20:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1C956940023; Thu, 5 Jan 2023 05:20:02 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 178F6940008; Thu, 5 Jan 2023 05:20:02 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F3577940023; Thu, 5 Jan 2023 05:20:01 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id D8352940008 for ; Thu, 5 Jan 2023 05:20:01 -0500 (EST) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 8DB031A0CF4 for ; Thu, 5 Jan 2023 10:20:01 +0000 (UTC) X-FDA: 80320349802.14.1C18BA0 Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf22.hostedemail.com (Postfix) with ESMTP id 04F94C0007 for ; Thu, 5 Jan 2023 10:19:59 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=kI4ZTRQe; spf=pass (imf22.hostedemail.com: domain of 3T6S2YwoKCJY9J7EK67JED6EE6B4.2ECB8DKN-CCAL02A.EH6@flex--jthoughton.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3T6S2YwoKCJY9J7EK67JED6EE6B4.2ECB8DKN-CCAL02A.EH6@flex--jthoughton.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1672914000; 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-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=rPcVmryUH+86L7TuxpN8GfuTRNIB++IYGz7ii/fh+60=; b=xawIUj2JhQBhRYXDSh6gs0hGrua2qk5chCnwqa1WLjX1c1LJw8//wshyFzAtiaduEp/ysS u9fsAIhR2ym7wWmeXeKUFJM3KgD9nifnra6PJHanJmYecxrC4RaKzreF/OPevzHYdqVZK0 +9KhcPZjNYoUG36EsNxpmNFxPDzzFVM= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=kI4ZTRQe; spf=pass (imf22.hostedemail.com: domain of 3T6S2YwoKCJY9J7EK67JED6EE6B4.2ECB8DKN-CCAL02A.EH6@flex--jthoughton.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3T6S2YwoKCJY9J7EK67JED6EE6B4.2ECB8DKN-CCAL02A.EH6@flex--jthoughton.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1672914000; a=rsa-sha256; cv=none; b=asL/6YwuQJlCfBH72p7Sl6qbK+XtGa0ebaCQq7u7nQkKBLJ8qjW6siNRl3OyUHVoblOob5 32g59w+gWM5T4D2n0QoKsoS2dSCAGtBMCBOJaCvgY0M1OuFE0B53aeE3kguHkjIJ4M5zOS KdHd7PksWPtPGF5k7X/Tgl/qGDyV8MY= Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-460ab8a327eso378506727b3.23 for ; Thu, 05 Jan 2023 02:19:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=rPcVmryUH+86L7TuxpN8GfuTRNIB++IYGz7ii/fh+60=; b=kI4ZTRQe7Q0DNwU8Nd2EZKZhgCILp8F6DoLJQBQIeMmVpBPgy2nY9fRh+7WBj3mKcv b3mHhtPqHKj27maMD9zcK0xNFg7ZH3P+7Zrl4zxFnCf7G/kUV7ygs9iJH6H3DPnwY+7v pEVpy5jqUM6S9+jlWu94uWgwsLLyquWN42I/U3Mye5rfAyPIaLO+CcmOU47oPaODXHBZ g6tTWmWkSREPHJl4j7JvfcfZmIeSW+FeLQ5bKfcMOb/+OzwicxRoFD6mPiFPk365Ae1D C7W9a4QJVUB1YYOH+GqrZqYY061aZQSPOGcDY51qN61zXe8gTbgIaiQswond5R+j607U +9Iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=rPcVmryUH+86L7TuxpN8GfuTRNIB++IYGz7ii/fh+60=; b=adr7C3hIw4lz3/mmZKwhIAtKhGALJr/Y3+R0/2Lv7bOihqtAIN/vnksJi0MZagv2WM vT2hZv53Wh3NmjN896cedoJl2+z/8Fs+K79nHLfvKuWkxGgkXudUOfMwitfHJItVnQMj Bw217rFEd45S/Ep0G3+75jr9ClEtWRJwcMl8jWVdctIX+Wh8ARsnrC2/wT5snn1KDSqb UgE0YhoBg1jGToENdQFB8IowgkH4S4gKT+A07vLZahKty332TtThF4D4QIAaX6/nVIJR 70y3AHWUBZS5CybjZqDlV85yW1ziHyqc5I8NqklPOhGIyask/8txX7dF700/CjSPdk6g 1jbw== X-Gm-Message-State: AFqh2kqmkUWLQqeYeS+rAfL2JxnK+cKl+J3YKzt0pTZ0+d5rOr5NC8R0 k7qwVmeMuotdoyKicYkKYm48lA5qO+dgWBSo X-Google-Smtp-Source: AMrXdXtTdSV2u8sC9W2WJTx+X9U5bRZRCXSHwwKpc/aZe4u4qkoBDtjjb5Moax2r1vBZGfpJQ/5EU4hKV8ZnomEr X-Received: from jthoughton.c.googlers.com ([fda3:e722:ac3:cc00:14:4d90:c0a8:2a4f]) (user=jthoughton job=sendgmr) by 2002:a25:7c81:0:b0:727:e539:452f with SMTP id x123-20020a257c81000000b00727e539452fmr5333597ybc.552.1672913999168; Thu, 05 Jan 2023 02:19:59 -0800 (PST) Date: Thu, 5 Jan 2023 10:18:42 +0000 In-Reply-To: <20230105101844.1893104-1-jthoughton@google.com> Mime-Version: 1.0 References: <20230105101844.1893104-1-jthoughton@google.com> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog Message-ID: <20230105101844.1893104-45-jthoughton@google.com> Subject: [PATCH 44/46] selftests/vm: add anon and shared hugetlb to migration test From: James Houghton To: Mike Kravetz , Muchun Song , Peter Xu Cc: David Hildenbrand , David Rientjes , Axel Rasmussen , Mina Almasry , "Zach O'Keefe" , Manish Mishra , Naoya Horiguchi , "Dr . David Alan Gilbert" , "Matthew Wilcox (Oracle)" , Vlastimil Babka , Baolin Wang , Miaohe Lin , Yang Shi , Andrew Morton , linux-mm@kvack.org, linux-kernel@vger.kernel.org, James Houghton X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 04F94C0007 X-Stat-Signature: xpphzw4s51xu86m56dn4oshfzfhu1xbh X-Rspam-User: X-HE-Tag: 1672913999-442941 X-HE-Meta: U2FsdGVkX1+LtKloDek9INPKPm37lXV/guBbfNk1QcEsHCSYgXL6fPBThWFAKsaC2RG/5ZDW4LAQ8L3B9sEQKCFKHboMTK4mxpy9TJRl4p/EbYPP2SgEf+oYIf6VTl4QLa18X6LHKA/byvp5+XrEkUWJwjrH3kbCxmFxx+kfnFLEvGrG1CmvSVuyWBTXVmElDh89zi+2glUhBG+Yne3tM+DBvldNIsZxJ2+gxZVLYivglk3XLZpHSfuhm2rLK8QNZU5aj1mec2Th14KGoQKGG6rCG/KFtqtKQrpSumNTl03Q/eorXmPhx82ltqG9yu+zs2vJsEax0yeihdvayQ6/Pd9aXquqXlrGny8C+hKqfpx2kOcj8Kj9j9U296b+NwW3GDYXYsg/1ObqQkJmB6CEME++hBoNESMKb7bpnxDM2cAfpvRh/NkYKL9y8yIXKQDgfWSR38Xh5fenqQ4f4+hAPk4PU5LxF/h8GEyr/H9g7nzu+FKNgXt0IMaAwQzY99KknosLYY2UVZSHfeSVQ0UhuGvQRXkV28WB0RQhvShoRD/BexmT38DMxmSWb7/6twFIiTiTFIUK1dN4NtkFZyonmPqMxCRG2yc0Zr2zt0hGAvd+tmjPrdXg3bBx5zcq6LW7ZAh5DKMXbm4teu1q6d/mV0uZUI/pRgwKUAnIGTz0k37VGt5sT5EvgXi3HLu/XIva7PROatk8rUASjcP6+sIkfyBSusl6A9otFIv4/n4rFVZ3uxsxoYxtpjB45zZDKtWBvall5+UalfKpc8/L480Ys6ZtwZlpC2pbpOFBgDTe86QSyYRrHBDp2jh+DBzxv8u90iV2ktSzUET6bhyIHWjM9z9SJjjhIP8oT77NbRV5jnk9JwGno6IxYpiMPZKOxImzzEeifb1ubZxKPUKM09MU3M0SQmY3Y+qLVrJvsuLWttXy0zv2CjnhjgAXGsEm8HNfhsKbx36aoQ5WZhE5//l 3wz7+6Rr RQNXImBszGLHYxvEi+5q6xIaCsCJoJjQ2x8k1/7s8ZfMeq6FoHQB63g3Fqb2yLarHxsLK6Z+jiFEpATYNqM6DPbH8+lShoQEE3ZH4cjAq+ojXS39roYVBNuK8Qwm4mdQ2ZGR1J/WR9NNIRcasdHmmdPT/IGHqj7Sdi85awdQn+Xcl5M4OrI4YdVWzkPRDyPp2isv3DYzHKuqyn3RBtrPDjUN6CfuHjuw4lKZtypuNEdPHjIyGDjP41hLm82NB4jLNb67l2FHwSQyf+gXLvJmFt8489n8f9l+omUbfFH85+ZeEj5xxf4kmFRB71HZr3KXRJAlY7aic6VNcHCnMCMVGUQKU/N+w3TE5WD6TwvwrQE1RuvUiNgqfSLzDjXOWV4vH0HNRAYfnXQX/5PY= 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: Shared HugeTLB mappings are migrated best-effort. Sometimes, due to being unable to grab the VMA lock for writing, migration may just randomly fail. To allow for that, we allow retries. Signed-off-by: James Houghton --- tools/testing/selftests/vm/migration.c | 83 ++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/vm/migration.c b/tools/testing/selftests/vm/migration.c index 1cec8425e3ca..21577a84d7e4 100644 --- a/tools/testing/selftests/vm/migration.c +++ b/tools/testing/selftests/vm/migration.c @@ -13,6 +13,7 @@ #include #include #include +#include #define TWOMEG (2<<20) #define RUNTIME (60) @@ -59,11 +60,12 @@ FIXTURE_TEARDOWN(migration) free(self->pids); } -int migrate(uint64_t *ptr, int n1, int n2) +int migrate(uint64_t *ptr, int n1, int n2, int retries) { int ret, tmp; int status = 0; struct timespec ts1, ts2; + int failed = 0; if (clock_gettime(CLOCK_MONOTONIC, &ts1)) return -1; @@ -78,6 +80,9 @@ int migrate(uint64_t *ptr, int n1, int n2) ret = move_pages(0, 1, (void **) &ptr, &n2, &status, MPOL_MF_MOVE_ALL); if (ret) { + if (++failed < retries) + continue; + if (ret > 0) printf("Didn't migrate %d pages\n", ret); else @@ -88,6 +93,7 @@ int migrate(uint64_t *ptr, int n1, int n2) tmp = n2; n2 = n1; n1 = tmp; + failed = 0; } return 0; @@ -128,7 +134,7 @@ 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); + ASSERT_EQ(migrate(ptr, self->n1, self->n2, 1), 0); for (i = 0; i < self->nthreads - 1; i++) ASSERT_EQ(pthread_cancel(self->threads[i]), 0); } @@ -158,7 +164,7 @@ TEST_F_TIMEOUT(migration, shared_anon, 2*RUNTIME) self->pids[i] = pid; } - ASSERT_EQ(migrate(ptr, self->n1, self->n2), 0); + ASSERT_EQ(migrate(ptr, self->n1, self->n2, 1), 0); for (i = 0; i < self->nthreads - 1; i++) ASSERT_EQ(kill(self->pids[i], SIGTERM), 0); } @@ -185,9 +191,78 @@ 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); + ASSERT_EQ(migrate(ptr, self->n1, self->n2, 1), 0); + for (i = 0; i < self->nthreads - 1; i++) + ASSERT_EQ(pthread_cancel(self->threads[i]), 0); +} + +/* + * Tests the anon hugetlb migration entry paths. + */ +TEST_F_TIMEOUT(migration, private_anon_hugetlb, 2*RUNTIME) +{ + uint64_t *ptr; + int i; + + if (self->nthreads < 2 || self->n1 < 0 || self->n2 < 0) + SKIP(return, "Not enough threads or NUMA nodes available"); + + ptr = mmap(NULL, TWOMEG, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0); + if (ptr == MAP_FAILED) + SKIP(return, "Could not allocate hugetlb pages"); + + memset(ptr, 0xde, TWOMEG); + for (i = 0; i < self->nthreads - 1; i++) + if (pthread_create(&self->threads[i], NULL, access_mem, ptr)) + perror("Couldn't create thread"); + + ASSERT_EQ(migrate(ptr, self->n1, self->n2, 1), 0); for (i = 0; i < self->nthreads - 1; i++) ASSERT_EQ(pthread_cancel(self->threads[i]), 0); } +/* + * Tests the shared hugetlb migration entry paths. + */ +TEST_F_TIMEOUT(migration, shared_hugetlb, 2*RUNTIME) +{ + uint64_t *ptr; + int i; + int fd; + unsigned long sz; + struct statfs filestat; + + if (self->nthreads < 2 || self->n1 < 0 || self->n2 < 0) + SKIP(return, "Not enough threads or NUMA nodes available"); + + fd = memfd_create("tmp_hugetlb", MFD_HUGETLB); + if (fd < 0) + SKIP(return, "Couldn't create hugetlb memfd"); + + if (fstatfs(fd, &filestat) < 0) + SKIP(return, "Couldn't fstatfs hugetlb file"); + + sz = filestat.f_bsize; + + if (ftruncate(fd, sz)) + SKIP(return, "Couldn't allocate hugetlb pages"); + ptr = mmap(NULL, sz, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (ptr == MAP_FAILED) + SKIP(return, "Could not map hugetlb pages"); + + memset(ptr, 0xde, sz); + for (i = 0; i < self->nthreads - 1; i++) + if (pthread_create(&self->threads[i], NULL, access_mem, ptr)) + perror("Couldn't create thread"); + + ASSERT_EQ(migrate(ptr, self->n1, self->n2, 10), 0); + for (i = 0; i < self->nthreads - 1; i++) { + ASSERT_EQ(pthread_cancel(self->threads[i]), 0); + pthread_join(self->threads[i], NULL); + } + ftruncate(fd, 0); + close(fd); +} + TEST_HARNESS_MAIN