Commit 9c84f229 authored by John Hubbard's avatar John Hubbard Committed by Linus Torvalds

mm/gup_benchmark: rename to mm/gup_test

Patch series "selftests/vm: gup_test, hmm-tests, assorted improvements", v3.

Summary: This series provides two main things, and a number of smaller
supporting goodies.  The two main points are:

1) Add a new sub-test to gup_test, which in turn is a renamed version
   of gup_benchmark.  This sub-test allows nicer testing of dump_pages(),
   at least on user-space pages.

   For quite a while, I was doing a quick hack to gup_test.c whenever I
   wanted to try out changes to dump_page().  Then Matthew Wilcox asked me
   what I meant when I said "I used my dump_page() unit test", and I
   realized that it might be nice to check in a polished up version of
   that.

   Details about how it works and how to use it are in the commit
   description for patch #6 ("selftests/vm: gup_test: introduce the
   dump_pages() sub-test").

2) Fixes a limitation of hmm-tests: these tests are incredibly useful,
   but only if people actually build and run them.  And it turns out that
   libhugetlbfs is a little too effective at throwing a wrench in the
   works, there.  So I've added a little configuration check that removes
   just two of the 21 hmm-tests, if libhugetlbfs is not available.

   Further details in the commit description of patch #8
   ("selftests/vm: hmm-tests: remove the libhugetlbfs dependency").

Other smaller things that this series does:

a) Remove code duplication by creating gup_test.h.

b) Clear up the sub-test organization, and their invocation within
   run_vmtests.sh.

c) Other minor assorted improvements.

[1] v2 is here:
https://lore.kernel.org/linux-doc/20200929212747.251804-1-jhubbard@nvidia.com/

[2] https://lore.kernel.org/r/CAHk-=wgh-TMPHLY3jueHX7Y2fWh3D+nMBqVS__AZm6-oorquWA@mail.gmail.com

This patch (of 9):

Rename nearly every "gup_benchmark" reference and file name to "gup_test".
The one exception is for the actual gup benchmark test itself.

The current code already does a *little* bit more than benchmarking, and
definitely covers more than get_user_pages_fast().  More importantly,
however, subsequent patches are about to add some functionality that is
non-benchmark related.

Closely related changes:

* Kconfig: in addition to renaming the options from GUP_BENCHMARK to
  GUP_TEST, update the help text to reflect that it's no longer a
  benchmark-only test.

Link: https://lkml.kernel.org/r/20201026064021.3545418-1-jhubbard@nvidia.com
Link: https://lkml.kernel.org/r/20201026064021.3545418-2-jhubbard@nvidia.comSigned-off-by: default avatarJohn Hubbard <jhubbard@nvidia.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Jérôme Glisse <jglisse@redhat.com>
Cc: Ralph Campbell <rcampbell@nvidia.com>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 800bca7c
...@@ -221,12 +221,12 @@ Unit testing ...@@ -221,12 +221,12 @@ Unit testing
============ ============
This file:: This file::
tools/testing/selftests/vm/gup_benchmark.c tools/testing/selftests/vm/gup_test.c
has the following new calls to exercise the new pin*() wrapper functions: has the following new calls to exercise the new pin*() wrapper functions:
* PIN_FAST_BENCHMARK (./gup_benchmark -a) * PIN_FAST_BENCHMARK (./gup_test -a)
* PIN_BENCHMARK (./gup_benchmark -b) * PIN_BENCHMARK (./gup_test -b)
You can monitor how many total dma-pinned pages have been acquired and released You can monitor how many total dma-pinned pages have been acquired and released
since the system was booted, via two new /proc/vmstat entries: :: since the system was booted, via two new /proc/vmstat entries: ::
......
...@@ -102,7 +102,7 @@ CONFIG_ZSMALLOC_STAT=y ...@@ -102,7 +102,7 @@ CONFIG_ZSMALLOC_STAT=y
CONFIG_DEFERRED_STRUCT_PAGE_INIT=y CONFIG_DEFERRED_STRUCT_PAGE_INIT=y
CONFIG_IDLE_PAGE_TRACKING=y CONFIG_IDLE_PAGE_TRACKING=y
CONFIG_PERCPU_STATS=y CONFIG_PERCPU_STATS=y
CONFIG_GUP_BENCHMARK=y CONFIG_GUP_TEST=y
CONFIG_NET=y CONFIG_NET=y
CONFIG_PACKET=y CONFIG_PACKET=y
CONFIG_PACKET_DIAG=m CONFIG_PACKET_DIAG=m
......
...@@ -95,7 +95,7 @@ CONFIG_ZSMALLOC_STAT=y ...@@ -95,7 +95,7 @@ CONFIG_ZSMALLOC_STAT=y
CONFIG_DEFERRED_STRUCT_PAGE_INIT=y CONFIG_DEFERRED_STRUCT_PAGE_INIT=y
CONFIG_IDLE_PAGE_TRACKING=y CONFIG_IDLE_PAGE_TRACKING=y
CONFIG_PERCPU_STATS=y CONFIG_PERCPU_STATS=y
CONFIG_GUP_BENCHMARK=y CONFIG_GUP_TEST=y
CONFIG_NET=y CONFIG_NET=y
CONFIG_PACKET=y CONFIG_PACKET=y
CONFIG_PACKET_DIAG=m CONFIG_PACKET_DIAG=m
......
...@@ -821,13 +821,18 @@ config PERCPU_STATS ...@@ -821,13 +821,18 @@ config PERCPU_STATS
information includes global and per chunk statistics, which can information includes global and per chunk statistics, which can
be used to help understand percpu memory usage. be used to help understand percpu memory usage.
config GUP_BENCHMARK config GUP_TEST
bool "Enable infrastructure for get_user_pages() and related calls benchmarking" bool "Enable infrastructure for get_user_pages()-related unit tests"
help help
Provides /sys/kernel/debug/gup_benchmark that helps with testing Provides /sys/kernel/debug/gup_test, which in turn provides a way
performance of get_user_pages() and related calls. to make ioctl calls that can launch kernel-based unit tests for
the get_user_pages*() and pin_user_pages*() family of API calls.
See tools/testing/selftests/vm/gup_benchmark.c These tests include benchmark testing of the _fast variants of
get_user_pages*() and pin_user_pages*(), as well as smoke tests of
the non-_fast variants.
See tools/testing/selftests/vm/gup_test.c
config GUP_GET_PTE_LOW_HIGH config GUP_GET_PTE_LOW_HIGH
bool bool
......
...@@ -90,7 +90,7 @@ obj-$(CONFIG_PAGE_COUNTER) += page_counter.o ...@@ -90,7 +90,7 @@ obj-$(CONFIG_PAGE_COUNTER) += page_counter.o
obj-$(CONFIG_MEMCG) += memcontrol.o vmpressure.o obj-$(CONFIG_MEMCG) += memcontrol.o vmpressure.o
obj-$(CONFIG_MEMCG_SWAP) += swap_cgroup.o obj-$(CONFIG_MEMCG_SWAP) += swap_cgroup.o
obj-$(CONFIG_CGROUP_HUGETLB) += hugetlb_cgroup.o obj-$(CONFIG_CGROUP_HUGETLB) += hugetlb_cgroup.o
obj-$(CONFIG_GUP_BENCHMARK) += gup_benchmark.o obj-$(CONFIG_GUP_TEST) += gup_test.o
obj-$(CONFIG_MEMORY_FAILURE) += memory-failure.o obj-$(CONFIG_MEMORY_FAILURE) += memory-failure.o
obj-$(CONFIG_HWPOISON_INJECT) += hwpoison-inject.o obj-$(CONFIG_HWPOISON_INJECT) += hwpoison-inject.o
obj-$(CONFIG_DEBUG_KMEMLEAK) += kmemleak.o obj-$(CONFIG_DEBUG_KMEMLEAK) += kmemleak.o
......
...@@ -5,13 +5,13 @@ ...@@ -5,13 +5,13 @@
#include <linux/ktime.h> #include <linux/ktime.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#define GUP_FAST_BENCHMARK _IOWR('g', 1, struct gup_benchmark) #define GUP_FAST_BENCHMARK _IOWR('g', 1, struct gup_test)
#define GUP_BENCHMARK _IOWR('g', 2, struct gup_benchmark) #define GUP_BENCHMARK _IOWR('g', 2, struct gup_test)
#define PIN_FAST_BENCHMARK _IOWR('g', 3, struct gup_benchmark) #define PIN_FAST_BENCHMARK _IOWR('g', 3, struct gup_test)
#define PIN_BENCHMARK _IOWR('g', 4, struct gup_benchmark) #define PIN_BENCHMARK _IOWR('g', 4, struct gup_test)
#define PIN_LONGTERM_BENCHMARK _IOWR('g', 5, struct gup_benchmark) #define PIN_LONGTERM_BENCHMARK _IOWR('g', 5, struct gup_test)
struct gup_benchmark { struct gup_test {
__u64 get_delta_usec; __u64 get_delta_usec;
__u64 put_delta_usec; __u64 put_delta_usec;
__u64 addr; __u64 addr;
...@@ -56,7 +56,7 @@ static void verify_dma_pinned(unsigned int cmd, struct page **pages, ...@@ -56,7 +56,7 @@ static void verify_dma_pinned(unsigned int cmd, struct page **pages,
if (WARN(!page_maybe_dma_pinned(page), if (WARN(!page_maybe_dma_pinned(page),
"pages[%lu] is NOT dma-pinned\n", i)) { "pages[%lu] is NOT dma-pinned\n", i)) {
dump_page(page, "gup_benchmark failure"); dump_page(page, "gup_test failure");
break; break;
} }
} }
...@@ -64,8 +64,8 @@ static void verify_dma_pinned(unsigned int cmd, struct page **pages, ...@@ -64,8 +64,8 @@ static void verify_dma_pinned(unsigned int cmd, struct page **pages,
} }
} }
static int __gup_benchmark_ioctl(unsigned int cmd, static int __gup_test_ioctl(unsigned int cmd,
struct gup_benchmark *gup) struct gup_test *gup)
{ {
ktime_t start_time, end_time; ktime_t start_time, end_time;
unsigned long i, nr_pages, addr, next; unsigned long i, nr_pages, addr, next;
...@@ -164,10 +164,10 @@ static int __gup_benchmark_ioctl(unsigned int cmd, ...@@ -164,10 +164,10 @@ static int __gup_benchmark_ioctl(unsigned int cmd,
return ret; return ret;
} }
static long gup_benchmark_ioctl(struct file *filep, unsigned int cmd, static long gup_test_ioctl(struct file *filep, unsigned int cmd,
unsigned long arg) unsigned long arg)
{ {
struct gup_benchmark gup; struct gup_test gup;
int ret; int ret;
switch (cmd) { switch (cmd) {
...@@ -184,7 +184,7 @@ static long gup_benchmark_ioctl(struct file *filep, unsigned int cmd, ...@@ -184,7 +184,7 @@ static long gup_benchmark_ioctl(struct file *filep, unsigned int cmd,
if (copy_from_user(&gup, (void __user *)arg, sizeof(gup))) if (copy_from_user(&gup, (void __user *)arg, sizeof(gup)))
return -EFAULT; return -EFAULT;
ret = __gup_benchmark_ioctl(cmd, &gup); ret = __gup_test_ioctl(cmd, &gup);
if (ret) if (ret)
return ret; return ret;
...@@ -194,17 +194,17 @@ static long gup_benchmark_ioctl(struct file *filep, unsigned int cmd, ...@@ -194,17 +194,17 @@ static long gup_benchmark_ioctl(struct file *filep, unsigned int cmd,
return 0; return 0;
} }
static const struct file_operations gup_benchmark_fops = { static const struct file_operations gup_test_fops = {
.open = nonseekable_open, .open = nonseekable_open,
.unlocked_ioctl = gup_benchmark_ioctl, .unlocked_ioctl = gup_test_ioctl,
}; };
static int gup_benchmark_init(void) static int gup_test_init(void)
{ {
debugfs_create_file_unsafe("gup_benchmark", 0600, NULL, NULL, debugfs_create_file_unsafe("gup_test", 0600, NULL, NULL,
&gup_benchmark_fops); &gup_test_fops);
return 0; return 0;
} }
late_initcall(gup_benchmark_init); late_initcall(gup_test_init);
...@@ -15,7 +15,7 @@ userfaultfd ...@@ -15,7 +15,7 @@ userfaultfd
mlock-intersect-test mlock-intersect-test
mlock-random-test mlock-random-test
virtual_address_range virtual_address_range
gup_benchmark gup_test
va_128TBswitch va_128TBswitch
map_fixed_noreplace map_fixed_noreplace
write_to_hugetlbfs write_to_hugetlbfs
......
...@@ -23,7 +23,7 @@ MAKEFLAGS += --no-builtin-rules ...@@ -23,7 +23,7 @@ MAKEFLAGS += --no-builtin-rules
CFLAGS = -Wall -I ../../../../usr/include $(EXTRA_CFLAGS) CFLAGS = -Wall -I ../../../../usr/include $(EXTRA_CFLAGS)
LDLIBS = -lrt LDLIBS = -lrt
TEST_GEN_FILES = compaction_test TEST_GEN_FILES = compaction_test
TEST_GEN_FILES += gup_benchmark TEST_GEN_FILES += gup_test
TEST_GEN_FILES += hmm-tests TEST_GEN_FILES += hmm-tests
TEST_GEN_FILES += hugepage-mmap TEST_GEN_FILES += hugepage-mmap
TEST_GEN_FILES += hugepage-shm TEST_GEN_FILES += hugepage-shm
......
...@@ -3,4 +3,4 @@ CONFIG_USERFAULTFD=y ...@@ -3,4 +3,4 @@ CONFIG_USERFAULTFD=y
CONFIG_TEST_VMALLOC=m CONFIG_TEST_VMALLOC=m
CONFIG_DEVICE_PRIVATE=y CONFIG_DEVICE_PRIVATE=y
CONFIG_TEST_HMM=m CONFIG_TEST_HMM=m
CONFIG_GUP_BENCHMARK=y CONFIG_GUP_TEST=y
...@@ -14,18 +14,18 @@ ...@@ -14,18 +14,18 @@
#define MB (1UL << 20) #define MB (1UL << 20)
#define PAGE_SIZE sysconf(_SC_PAGESIZE) #define PAGE_SIZE sysconf(_SC_PAGESIZE)
#define GUP_FAST_BENCHMARK _IOWR('g', 1, struct gup_benchmark) #define GUP_FAST_BENCHMARK _IOWR('g', 1, struct gup_test)
#define GUP_BENCHMARK _IOWR('g', 2, struct gup_benchmark) #define GUP_BENCHMARK _IOWR('g', 2, struct gup_test)
/* Similar to above, but use FOLL_PIN instead of FOLL_GET. */ /* Similar to above, but use FOLL_PIN instead of FOLL_GET. */
#define PIN_FAST_BENCHMARK _IOWR('g', 3, struct gup_benchmark) #define PIN_FAST_BENCHMARK _IOWR('g', 3, struct gup_test)
#define PIN_BENCHMARK _IOWR('g', 4, struct gup_benchmark) #define PIN_BENCHMARK _IOWR('g', 4, struct gup_test)
#define PIN_LONGTERM_BENCHMARK _IOWR('g', 5, struct gup_benchmark) #define PIN_LONGTERM_BENCHMARK _IOWR('g', 5, struct gup_test)
/* Just the flags we need, copied from mm.h: */ /* Just the flags we need, copied from mm.h: */
#define FOLL_WRITE 0x01 /* check pte is writable */ #define FOLL_WRITE 0x01 /* check pte is writable */
struct gup_benchmark { struct gup_test {
__u64 get_delta_usec; __u64 get_delta_usec;
__u64 put_delta_usec; __u64 put_delta_usec;
__u64 addr; __u64 addr;
...@@ -37,7 +37,7 @@ struct gup_benchmark { ...@@ -37,7 +37,7 @@ struct gup_benchmark {
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
struct gup_benchmark gup; struct gup_test gup;
unsigned long size = 128 * MB; unsigned long size = 128 * MB;
int i, fd, filed, opt, nr_pages = 1, thp = -1, repeats = 1, write = 0; int i, fd, filed, opt, nr_pages = 1, thp = -1, repeats = 1, write = 0;
int cmd = GUP_FAST_BENCHMARK, flags = MAP_PRIVATE; int cmd = GUP_FAST_BENCHMARK, flags = MAP_PRIVATE;
...@@ -104,7 +104,7 @@ int main(int argc, char **argv) ...@@ -104,7 +104,7 @@ int main(int argc, char **argv)
if (write) if (write)
gup.flags |= FOLL_WRITE; gup.flags |= FOLL_WRITE;
fd = open("/sys/kernel/debug/gup_benchmark", O_RDWR); fd = open("/sys/kernel/debug/gup_test", O_RDWR);
if (fd == -1) { if (fd == -1) {
perror("open"); perror("open");
exit(1); exit(1);
......
...@@ -124,9 +124,9 @@ else ...@@ -124,9 +124,9 @@ else
fi fi
echo "--------------------------------------------" echo "--------------------------------------------"
echo "running 'gup_benchmark -U' (normal/slow gup)" echo "running 'gup_test -U' (normal/slow gup)"
echo "--------------------------------------------" echo "--------------------------------------------"
./gup_benchmark -U ./gup_test -U
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "[FAIL]" echo "[FAIL]"
exitcode=1 exitcode=1
...@@ -135,9 +135,9 @@ else ...@@ -135,9 +135,9 @@ else
fi fi
echo "------------------------------------------" echo "------------------------------------------"
echo "running gup_benchmark -b (pin_user_pages)" echo "running gup_test -b (pin_user_pages)"
echo "------------------------------------------" echo "------------------------------------------"
./gup_benchmark -b ./gup_test -b
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "[FAIL]" echo "[FAIL]"
exitcode=1 exitcode=1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment