Skip to content

Commit

Permalink
selftests/vm: only some gup_test items are really benchmarks
Browse files Browse the repository at this point in the history
Therefore, some minor cleanup and improvements are in order:

1. Rename the other items appropriately.

2. Stop reporting timing information on the non-benchmark items. It's
   still being recorded and is available, but there's no point in
   cluttering up the report with data that no one reasonably needs to
   check.

3. Don't do iterations, for non-benchmark items.

4. Print out a shorter, more appropriate report for the non-benchmark
   tests.

5. Add the command that was run, to the report. This really helps, as
   there are quite a lot of options now.

6. Use a larger integer type for cmd, now that it's being compared
   Otherwise it doesn't work, because in this case cmd is about 3 billion,
   which is the perfect size for problems with signed vs unsigned int.

Link: https://lkml.kernel.org/r/[email protected]
Signed-off-by: John Hubbard <[email protected]>
Cc: Jérôme Glisse <[email protected]>
Cc: Jonathan Corbet <[email protected]>
Cc: Ralph Campbell <[email protected]>
Cc: Shuah Khan <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
johnhubbard authored and torvalds committed Dec 15, 2020
1 parent f545605 commit a9bed1e
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 20 deletions.
2 changes: 1 addition & 1 deletion Documentation/core-api/pin_user_pages.rst
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ This file::
has the following new calls to exercise the new pin*() wrapper functions:

* PIN_FAST_BENCHMARK (./gup_test -a)
* PIN_BENCHMARK (./gup_test -b)
* PIN_BASIC_TEST (./gup_test -b)

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: ::
Expand Down
14 changes: 7 additions & 7 deletions mm/gup_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ static void put_back_pages(unsigned int cmd, struct page **pages,

switch (cmd) {
case GUP_FAST_BENCHMARK:
case GUP_BENCHMARK:
case GUP_BASIC_TEST:
for (i = 0; i < nr_pages; i++)
put_page(pages[i]);
break;

case PIN_FAST_BENCHMARK:
case PIN_BENCHMARK:
case PIN_BASIC_TEST:
case PIN_LONGTERM_BENCHMARK:
unpin_user_pages(pages, nr_pages);
break;
Expand All @@ -34,7 +34,7 @@ static void verify_dma_pinned(unsigned int cmd, struct page **pages,

switch (cmd) {
case PIN_FAST_BENCHMARK:
case PIN_BENCHMARK:
case PIN_BASIC_TEST:
case PIN_LONGTERM_BENCHMARK:
for (i = 0; i < nr_pages; i++) {
page = pages[i];
Expand Down Expand Up @@ -94,15 +94,15 @@ static int __gup_test_ioctl(unsigned int cmd,
nr = get_user_pages_fast(addr, nr, gup->flags,
pages + i);
break;
case GUP_BENCHMARK:
case GUP_BASIC_TEST:
nr = get_user_pages(addr, nr, gup->flags, pages + i,
NULL);
break;
case PIN_FAST_BENCHMARK:
nr = pin_user_pages_fast(addr, nr, gup->flags,
pages + i);
break;
case PIN_BENCHMARK:
case PIN_BASIC_TEST:
nr = pin_user_pages(addr, nr, gup->flags, pages + i,
NULL);
break;
Expand Down Expand Up @@ -157,10 +157,10 @@ static long gup_test_ioctl(struct file *filep, unsigned int cmd,

switch (cmd) {
case GUP_FAST_BENCHMARK:
case GUP_BENCHMARK:
case PIN_FAST_BENCHMARK:
case PIN_BENCHMARK:
case PIN_LONGTERM_BENCHMARK:
case GUP_BASIC_TEST:
case PIN_BASIC_TEST:
break;
default:
return -EINVAL;
Expand Down
8 changes: 4 additions & 4 deletions mm/gup_test.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
#include <linux/types.h>

#define GUP_FAST_BENCHMARK _IOWR('g', 1, struct gup_test)
#define GUP_BENCHMARK _IOWR('g', 2, struct gup_test)
#define PIN_FAST_BENCHMARK _IOWR('g', 3, struct gup_test)
#define PIN_BENCHMARK _IOWR('g', 4, struct gup_test)
#define PIN_LONGTERM_BENCHMARK _IOWR('g', 5, struct gup_test)
#define PIN_FAST_BENCHMARK _IOWR('g', 2, struct gup_test)
#define PIN_LONGTERM_BENCHMARK _IOWR('g', 3, struct gup_test)
#define GUP_BASIC_TEST _IOWR('g', 4, struct gup_test)
#define PIN_BASIC_TEST _IOWR('g', 5, struct gup_test)

struct gup_test {
__u64 get_delta_usec;
Expand Down
47 changes: 39 additions & 8 deletions tools/testing/selftests/vm/gup_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,30 @@
/* Just the flags we need, copied from mm.h: */
#define FOLL_WRITE 0x01 /* check pte is writable */

static char *cmd_to_str(unsigned long cmd)
{
switch (cmd) {
case GUP_FAST_BENCHMARK:
return "GUP_FAST_BENCHMARK";
case PIN_FAST_BENCHMARK:
return "PIN_FAST_BENCHMARK";
case PIN_LONGTERM_BENCHMARK:
return "PIN_LONGTERM_BENCHMARK";
case GUP_BASIC_TEST:
return "GUP_BASIC_TEST";
case PIN_BASIC_TEST:
return "PIN_BASIC_TEST";
}
return "Unknown command";
}

int main(int argc, char **argv)
{
struct gup_test gup;
unsigned long size = 128 * MB;
int i, fd, filed, opt, nr_pages = 1, thp = -1, repeats = 1, write = 0;
int cmd = GUP_FAST_BENCHMARK, flags = MAP_PRIVATE;
unsigned long cmd = GUP_FAST_BENCHMARK;
int flags = MAP_PRIVATE;
char *file = "/dev/zero";
char *p;

Expand All @@ -29,7 +47,7 @@ int main(int argc, char **argv)
cmd = PIN_FAST_BENCHMARK;
break;
case 'b':
cmd = PIN_BENCHMARK;
cmd = PIN_BASIC_TEST;
break;
case 'L':
cmd = PIN_LONGTERM_BENCHMARK;
Expand All @@ -50,7 +68,7 @@ int main(int argc, char **argv)
thp = 0;
break;
case 'U':
cmd = GUP_BENCHMARK;
cmd = GUP_BASIC_TEST;
break;
case 'u':
cmd = GUP_FAST_BENCHMARK;
Expand Down Expand Up @@ -104,18 +122,31 @@ int main(int argc, char **argv)
for (; (unsigned long)p < gup.addr + size; p += PAGE_SIZE)
p[0] = 0;

for (i = 0; i < repeats; i++) {
/* Only report timing information on the *_BENCHMARK commands: */
if ((cmd == PIN_FAST_BENCHMARK) || (cmd == GUP_FAST_BENCHMARK) ||
(cmd == PIN_LONGTERM_BENCHMARK)) {
for (i = 0; i < repeats; i++) {
gup.size = size;
if (ioctl(fd, cmd, &gup))
perror("ioctl"), exit(1);

printf("%s: Time: get:%lld put:%lld us",
cmd_to_str(cmd), gup.get_delta_usec,
gup.put_delta_usec);
if (gup.size != size)
printf(", truncated (size: %lld)", gup.size);
printf("\n");
}
} else {
gup.size = size;
if (ioctl(fd, cmd, &gup)) {
perror("ioctl");
exit(1);
}

printf("Time: get:%lld put:%lld us", gup.get_delta_usec,
gup.put_delta_usec);
printf("%s: done\n", cmd_to_str(cmd));
if (gup.size != size)
printf(", truncated (size: %lld)", gup.size);
printf("\n");
printf("Truncated (size: %lld)\n", gup.size);
}

return 0;
Expand Down

0 comments on commit a9bed1e

Please sign in to comment.