Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp339101imm; Fri, 21 Sep 2018 15:41:11 -0700 (PDT) X-Google-Smtp-Source: ANB0Vda6zxxDQIEpDPnBMFc71uY5Aiv9iTmAoSu/46o6NhjkYkB/Uo7f+aV0Y8Yns862LdDniPqT X-Received: by 2002:a17:902:6e17:: with SMTP id u23-v6mr8149905plk.28.1537569671929; Fri, 21 Sep 2018 15:41:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537569671; cv=none; d=google.com; s=arc-20160816; b=ekbNoillZeoyCLc0eh6kZX65xduLjphfqZL3ogy20IvZgIVdR7AODobYqQlM3xWG/f Uejym2XvWHuNq2wQ1SeOlO563uxbJwzriAlTu3WcaP39dZh0toXk1rzG1sZBw1iEdUut QtwYYnGXGngisqIjfHVnST8yBrXG7dL/VKuhaBDqhmaNaOLAJgSdZUsUtLn7x++VqQCd b1DVXOB+/yyGph0t1trJwLJBbBAdTJ7RfetUEyxyHIr3hSRrYVNCt5HRYd2vXqIjkR23 9HS6SmhcC3k/bsxG1njGzCNchFDmj84j6zk6yooUa4TA0adkb+Co1DqHG+DcZdq8KY3C U0Bg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=DpgovmJtPf18e2k2Wv7qoB41Fu1L4MevUAL6TIs9Zvo=; b=JT+W0fnhzmdsKnTCzhvYc2nq62wpEl4dpdS1hbg+iW/382CjS3joSjtkDzpWTKyvYX zLp1SptdhUpcmxq0E8nG67nhpzeWFf/6sFUMD9Z4ClSq//7ioYRNd/C93bZRHSAVyaRi At7xXNOoTCKMOH2Hy1/y52XyhedNsAUgIb7iNt1+xw4SCyvlXhc+43r/gQty6EHzdSzU Y2kBpsGp7QlXRMVe+6MwSKwMCa/iIG2hTAoMKcrTCbbhWKvzJto/J+VwvhvpME0Q1hA8 fZixrNMvEXnBI4mnCLZvrtuTOYpbinCqgfTt6+KB07ZSIuQVx5OZxW7Nd8MzIk3rHn7V i/uQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n28-v6si30034736pfg.127.2018.09.21.15.40.56; Fri, 21 Sep 2018 15:41:11 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727431AbeIVEbD (ORCPT + 99 others); Sat, 22 Sep 2018 00:31:03 -0400 Received: from mga18.intel.com ([134.134.136.126]:61603 "EHLO mga18.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725814AbeIVEbD (ORCPT ); Sat, 22 Sep 2018 00:31:03 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Sep 2018 15:40:06 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,286,1534834800"; d="scan'208";a="234946780" Received: from unknown (HELO localhost.lm.intel.com) ([10.232.112.44]) by orsmga004.jf.intel.com with ESMTP; 21 Sep 2018 15:37:58 -0700 From: Keith Busch To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Kirill Shutemov , Dave Hansen , Dan Williams , Keith Busch Subject: [PATCHv3 2/6] mm/gup_benchmark: Add additional pinning methods Date: Fri, 21 Sep 2018 16:39:52 -0600 Message-Id: <20180921223956.3485-3-keith.busch@intel.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180921223956.3485-1-keith.busch@intel.com> References: <20180921223956.3485-1-keith.busch@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch provides new gup benchmark ioctl commands to run different user page pinning methods, get_user_pages_longterm and get_user_pages, in addition to the existing get_user_pages_fast. Cc: Kirill Shutemov Cc: Dave Hansen Cc: Dan Williams Signed-off-by: Keith Busch --- mm/gup_benchmark.c | 28 ++++++++++++++++++++++++++-- tools/testing/selftests/vm/gup_benchmark.c | 13 +++++++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/mm/gup_benchmark.c b/mm/gup_benchmark.c index 76cd35e477af..e6d9ce001ffa 100644 --- a/mm/gup_benchmark.c +++ b/mm/gup_benchmark.c @@ -6,6 +6,8 @@ #include #define GUP_FAST_BENCHMARK _IOWR('g', 1, struct gup_benchmark) +#define GUP_LONGTERM_BENCHMARK _IOWR('g', 2, struct gup_benchmark) +#define GUP_BENCHMARK _IOWR('g', 3, struct gup_benchmark) struct gup_benchmark { __u64 get_delta_usec; @@ -41,7 +43,23 @@ static int __gup_benchmark_ioctl(unsigned int cmd, nr = (next - addr) / PAGE_SIZE; } - nr = get_user_pages_fast(addr, nr, gup->flags & 1, pages + i); + switch (cmd) { + case GUP_FAST_BENCHMARK: + nr = get_user_pages_fast(addr, nr, gup->flags & 1, + pages + i); + break; + case GUP_LONGTERM_BENCHMARK: + nr = get_user_pages_longterm(addr, nr, gup->flags & 1, + pages + i, NULL); + break; + case GUP_BENCHMARK: + nr = get_user_pages(addr, nr, gup->flags & 1, pages + i, + NULL); + break; + default: + return -1; + } + if (nr <= 0) break; i += nr; @@ -70,8 +88,14 @@ static long gup_benchmark_ioctl(struct file *filep, unsigned int cmd, struct gup_benchmark gup; int ret; - if (cmd != GUP_FAST_BENCHMARK) + switch (cmd) { + case GUP_FAST_BENCHMARK: + case GUP_LONGTERM_BENCHMARK: + case GUP_BENCHMARK: + break; + default: return -EINVAL; + } if (copy_from_user(&gup, (void __user *)arg, sizeof(gup))) return -EFAULT; diff --git a/tools/testing/selftests/vm/gup_benchmark.c b/tools/testing/selftests/vm/gup_benchmark.c index bdcb97acd0ac..c2f785ded9b9 100644 --- a/tools/testing/selftests/vm/gup_benchmark.c +++ b/tools/testing/selftests/vm/gup_benchmark.c @@ -15,6 +15,8 @@ #define PAGE_SIZE sysconf(_SC_PAGESIZE) #define GUP_FAST_BENCHMARK _IOWR('g', 1, struct gup_benchmark) +#define GUP_LONGTERM_BENCHMARK _IOWR('g', 2, struct gup_benchmark) +#define GUP_BENCHMARK _IOWR('g', 3, struct gup_benchmark) struct gup_benchmark { __u64 get_delta_usec; @@ -30,9 +32,10 @@ int main(int argc, char **argv) struct gup_benchmark gup; unsigned long size = 128 * MB; int i, fd, opt, nr_pages = 1, thp = -1, repeats = 1, write = 0; + int cmd = GUP_FAST_BENCHMARK; char *p; - while ((opt = getopt(argc, argv, "m:r:n:tT")) != -1) { + while ((opt = getopt(argc, argv, "m:r:n:tTLU")) != -1) { switch (opt) { case 'm': size = atoi(optarg) * MB; @@ -49,6 +52,12 @@ int main(int argc, char **argv) case 'T': thp = 0; break; + case 'L': + cmd = GUP_LONGTERM_BENCHMARK; + break; + case 'U': + cmd = GUP_BENCHMARK; + break; case 'w': write = 1; default: @@ -79,7 +88,7 @@ int main(int argc, char **argv) for (i = 0; i < repeats; i++) { gup.size = size; - if (ioctl(fd, GUP_FAST_BENCHMARK, &gup)) + if (ioctl(fd, cmd, &gup)) perror("ioctl"), exit(1); printf("Time: get:%lld put:%lld us", gup.get_delta_usec, -- 2.14.4