Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp731270pxb; Thu, 21 Jan 2021 19:45:13 -0800 (PST) X-Google-Smtp-Source: ABdhPJzmheAI7KE9IKwD1QJld0WyrNxnqEVdUbSycC+oJMFqjUNVjQUIfZvd7iDCEu+tfyHc3okT X-Received: by 2002:a17:906:90c3:: with SMTP id v3mr1674690ejw.461.1611287112932; Thu, 21 Jan 2021 19:45:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611287112; cv=none; d=google.com; s=arc-20160816; b=oyB3G8/r+um7c6Yp4aNtZya45DsWwjZ6US6JeX3cKlKnE1TwgpMIu/5sY+mc3Ig3iQ 0aNzwqNWD++npJeoL3AEB3KGWfw+9IbjTGt/VrbqYm5xGO3krQE9W6lEPHPxbkzUI/gm VyqrcKE+Mnz+17oldVTmS982tAh7ZgLkE4WaHiIsRPjN8icwUaIklMiAoge4//8VZ1hp 0OL8z5jouxzVM43lpViaHEsNYeonYzraMzF4CS2nBWFh/jKwaLYBLk9dsUEzJ+2bVudj 00XGgRR0u33rOJWWxwsyaOeLaV5OO1NOJlIMbcW4AbHvINhYj9+I496Ne6B7qQ0PQq01 cCHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=SWC85EvrfhDWN9GAMNSCIdaWub1yJYYIkxTKcYQyLVs=; b=XYWJdgzS4LBofjbfCqxCPdFEgJoOHpkIbfHGFEJ3eN/d60Kd3O9CCdw/BkLbI0BkFj ENpj4K8rnEf3R/tR9zOmi9a/Cvy3R1Ja+nhW8P4D7/89HsTIrn73jRkWv9yOO1GwUXmz L1jQZ5EZ/rTMTNwuwvFPNev8Nua8/1QwBBOKuYrgrkaHtkJkOG2SIfiTQgj4lhRhgM8q /R780V+Pkc1xaa5aJG5SbSE7LaRvU86aCekjz9eppdEM9dS5I1nAHvDWsXP6FMRqq0jR jQjQf3BBrAePHMxYfwTDhVw1ICYOxe2S4VaNEfDqHSkxvoqJkAo2N2Wk5rVz/B9ntVEc m5cQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@soleen.com header.s=google header.b=XV84d5iN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q16si3041878edc.229.2021.01.21.19.44.48; Thu, 21 Jan 2021 19:45:12 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@soleen.com header.s=google header.b=XV84d5iN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726737AbhAVDlL (ORCPT + 99 others); Thu, 21 Jan 2021 22:41:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53478 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726861AbhAVDkF (ORCPT ); Thu, 21 Jan 2021 22:40:05 -0500 Received: from mail-qv1-xf2c.google.com (mail-qv1-xf2c.google.com [IPv6:2607:f8b0:4864:20::f2c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7CF18C061A28 for ; Thu, 21 Jan 2021 19:38:14 -0800 (PST) Received: by mail-qv1-xf2c.google.com with SMTP id 2so2076372qvd.0 for ; Thu, 21 Jan 2021 19:38:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=soleen.com; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=SWC85EvrfhDWN9GAMNSCIdaWub1yJYYIkxTKcYQyLVs=; b=XV84d5iNeCffgwUXK7jLHWvQKmdPhRnYIah3mBzgpaq/6gA4Vl7Lk9wZIzCuF8ih2g PWvqccSNfHuCiD1PKD3bK8qSfkMKtIDBJb/x7jsDuZVjLjYua0K4bnEYUUxYYi6KthVP bcI4GRQHutuSBcfCSI1pcnM4lyBVrrSLEEp4bjANMsW+QvvUFInuKs418PTBclVfUd+2 wf4/o1/X9ty/5p13I50790JzLUEIN2MKfJuk86OLQRnb4G0l7olif+ZN3g8PxhJ2sVB9 9Cc7cLfe9EngjrP+KFikCfWkIyPwXaV33oGx+I1xHQ/OfkpQ5TYB4KfQziCRx4g2L+Qb gVcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SWC85EvrfhDWN9GAMNSCIdaWub1yJYYIkxTKcYQyLVs=; b=Hud2p/08UujcJ8zghOd9yjsLRT1TTridw1ycf047LLeCumLVYgT+hYcmiQw0sEonPK sSnJXx1GUzGs0NQGzWkFuVWPjMO/q5bILazl1h6O/UdLcQZjnzEmbo8j9mZXK2XjAoF5 beqXcaPFjsttgLahn8E9C4Qgx9eRDgLX5vstVif20q2fvNY7gl1L1scvwyhYC+pj7SEs qmtn3iXI3d2sT+3oyknc8qOOWWz2RVwsHcyoOduRy2phtqshAFoULm3m0am9ABY7vtki euIBH9uDYS7hsAZJDLnyCY6BDKZyRul7/4PJW4yetHVVfanwhnSFCszGczkfHUEXAkme gpYA== X-Gm-Message-State: AOAM533w4pquNPkKpLY/dWUn+sU6ANnOf9eQhapuuzAtASzZxIYh2cAv ROqLuSKD30KftXmcpZWheuOPZA== X-Received: by 2002:a0c:ac43:: with SMTP id m3mr2607496qvb.37.1611286693751; Thu, 21 Jan 2021 19:38:13 -0800 (PST) Received: from localhost.localdomain (c-73-69-118-222.hsd1.nh.comcast.net. [73.69.118.222]) by smtp.gmail.com with ESMTPSA id m85sm5426529qke.33.2021.01.21.19.38.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Jan 2021 19:38:13 -0800 (PST) From: Pavel Tatashin To: pasha.tatashin@soleen.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, akpm@linux-foundation.org, vbabka@suse.cz, mhocko@suse.com, david@redhat.com, osalvador@suse.de, dan.j.williams@intel.com, sashal@kernel.org, tyhicks@linux.microsoft.com, iamjoonsoo.kim@lge.com, mike.kravetz@oracle.com, rostedt@goodmis.org, mingo@redhat.com, jgg@ziepe.ca, peterz@infradead.org, mgorman@suse.de, willy@infradead.org, rientjes@google.com, jhubbard@nvidia.com, linux-doc@vger.kernel.org, ira.weiny@intel.com, linux-kselftest@vger.kernel.org Subject: [PATCH v7 14/14] selftests/vm: test faulting in kernel, and verify pinnable pages Date: Thu, 21 Jan 2021 22:37:48 -0500 Message-Id: <20210122033748.924330-15-pasha.tatashin@soleen.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210122033748.924330-1-pasha.tatashin@soleen.com> References: <20210122033748.924330-1-pasha.tatashin@soleen.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When pages are pinned they can be faulted in userland and migrated, and they can be faulted right in kernel without migration. In either case, the pinned pages must end-up being pinnable (not movable). Add a new test to gup_test, to help verify that the gup/pup (get_user_pages() / pin_user_pages()) behavior with respect to pinnable and movable pages is reasonable and correct. Specifically, provide a way to: 1) Verify that only "pinnable" pages are pinned. This is checked automatically for you. 2) Verify that gup/pup performance is reasonable. This requires comparing benchmarks between doing gup/pup on pages that have been pre-faulted in from user space, vs. doing gup/pup on pages that are not faulted in until gup/pup time (via FOLL_TOUCH). This decision is controlled with the new -z command line option. Signed-off-by: Pavel Tatashin --- mm/gup_test.c | 6 ++++++ tools/testing/selftests/vm/gup_test.c | 23 +++++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/mm/gup_test.c b/mm/gup_test.c index a6ed1c877679..d974dec19e1c 100644 --- a/mm/gup_test.c +++ b/mm/gup_test.c @@ -52,6 +52,12 @@ static void verify_dma_pinned(unsigned int cmd, struct page **pages, dump_page(page, "gup_test failure"); break; + } else if (cmd == PIN_LONGTERM_BENCHMARK && + WARN(!is_pinnable_page(page), + "pages[%lu] is NOT pinnable but pinned\n", + i)) { + dump_page(page, "gup_test failure"); + break; } } break; diff --git a/tools/testing/selftests/vm/gup_test.c b/tools/testing/selftests/vm/gup_test.c index 943cc2608dc2..1e662d59c502 100644 --- a/tools/testing/selftests/vm/gup_test.c +++ b/tools/testing/selftests/vm/gup_test.c @@ -13,6 +13,7 @@ /* Just the flags we need, copied from mm.h: */ #define FOLL_WRITE 0x01 /* check pte is writable */ +#define FOLL_TOUCH 0x02 /* mark page accessed */ static char *cmd_to_str(unsigned long cmd) { @@ -39,11 +40,11 @@ int main(int argc, char **argv) unsigned long size = 128 * MB; int i, fd, filed, opt, nr_pages = 1, thp = -1, repeats = 1, write = 1; unsigned long cmd = GUP_FAST_BENCHMARK; - int flags = MAP_PRIVATE; + int flags = MAP_PRIVATE, touch = 0; char *file = "/dev/zero"; char *p; - while ((opt = getopt(argc, argv, "m:r:n:F:f:abctTLUuwWSHp")) != -1) { + while ((opt = getopt(argc, argv, "m:r:n:F:f:abctTLUuwWSHpz")) != -1) { switch (opt) { case 'a': cmd = PIN_FAST_BENCHMARK; @@ -110,6 +111,10 @@ int main(int argc, char **argv) case 'H': flags |= (MAP_HUGETLB | MAP_ANONYMOUS); break; + case 'z': + /* fault pages in gup, do not fault in userland */ + touch = 1; + break; default: return -1; } @@ -167,8 +172,18 @@ int main(int argc, char **argv) else if (thp == 0) madvise(p, size, MADV_NOHUGEPAGE); - for (; (unsigned long)p < gup.addr + size; p += PAGE_SIZE) - p[0] = 0; + /* + * FOLL_TOUCH, in gup_test, is used as an either/or case: either + * fault pages in from the kernel via FOLL_TOUCH, or fault them + * in here, from user space. This allows comparison of performance + * between those two cases. + */ + if (touch) { + gup.gup_flags |= FOLL_TOUCH; + } else { + for (; (unsigned long)p < gup.addr + size; p += PAGE_SIZE) + p[0] = 0; + } /* Only report timing information on the *_BENCHMARK commands: */ if ((cmd == PIN_FAST_BENCHMARK) || (cmd == GUP_FAST_BENCHMARK) || -- 2.25.1