selftests/vm: only some gup_test items are really benchmarks
authorJohn Hubbard <jhubbard@nvidia.com>
Tue, 15 Dec 2020 03:05:17 +0000 (19:05 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 15 Dec 2020 20:13:38 +0000 (12:13 -0800)
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/20201026064021.3545418-6-jhubbard@nvidia.com
Signed-off-by: John Hubbard <jhubbard@nvidia.com>
Cc: Jérôme Glisse <jglisse@redhat.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Ralph Campbell <rcampbell@nvidia.com>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Documentation/core-api/pin_user_pages.rst
mm/gup_test.c
mm/gup_test.h
tools/testing/selftests/vm/gup_test.c

index eae972b232243aeb354f9074d80f4ca41b24ae86..fcf605be43d0c02ff5b456eccfc986d550dc6d7f 100644 (file)
@@ -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: ::
index 4c2d70d88f24d0f3f918b0bb087084d1f7be5775..173bb38f368824e79273ccfa35f6ffe768f60ccf 100644 (file)
@@ -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;
@@ -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];
@@ -94,7 +94,7 @@ 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;
@@ -102,7 +102,7 @@ static int __gup_test_ioctl(unsigned int cmd,
                        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;
@@ -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;
index 931c2f3f477a22621e1d9d105234c7bb57c79ce7..921b4caad8ef4fbb1e9247fece74d29e0284f641 100644 (file)
@@ -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;
index 1a54771ad97eef9ea6b4d574c0a0e17f428d8cb7..f9163e1bb57a2502ad92d6bf51ac36e00216b4b7 100644 (file)
 /* 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;
 
@@ -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;
@@ -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;
@@ -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;