mm/gup_benchmark.c: time put_page()
authorKeith Busch <keith.busch@intel.com>
Fri, 26 Oct 2018 22:09:52 +0000 (15:09 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 26 Oct 2018 23:38:15 +0000 (16:38 -0700)
We'd like to measure time to unpin user pages, so this adds a second
benchmark timer on put_page, separate from get_page.

Adding the field breaks this ioctl ABI, but should be okay since this an
in-tree kernel selftest.

[akpm@linux-foundation.org: add expansion to struct gup_benchmark for future use]
Link: http://lkml.kernel.org/r/20181010195605.10689-1-keith.busch@intel.com
Signed-off-by: Keith Busch <keith.busch@intel.com>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/gup_benchmark.c
tools/testing/selftests/vm/gup_benchmark.c

index 7405c9d89d65134c003a2d3984e1a993fd9c9907..e6aff102373bec1c7f817f26edf90ba41d8ebbfc 100644 (file)
@@ -8,11 +8,13 @@
 #define GUP_FAST_BENCHMARK     _IOWR('g', 1, struct gup_benchmark)
 
 struct gup_benchmark {
-       __u64 delta_usec;
+       __u64 get_delta_usec;
+       __u64 put_delta_usec;
        __u64 addr;
        __u64 size;
        __u32 nr_pages_per_call;
        __u32 flags;
+       __u64 expansion[10];    /* For future use */
 };
 
 static int __gup_benchmark_ioctl(unsigned int cmd,
@@ -48,14 +50,17 @@ static int __gup_benchmark_ioctl(unsigned int cmd,
        }
        end_time = ktime_get();
 
-       gup->delta_usec = ktime_us_delta(end_time, start_time);
+       gup->get_delta_usec = ktime_us_delta(end_time, start_time);
        gup->size = addr - gup->addr;
 
+       start_time = ktime_get();
        for (i = 0; i < nr_pages; i++) {
                if (!pages[i])
                        break;
                put_page(pages[i]);
        }
+       end_time = ktime_get();
+       gup->put_delta_usec = ktime_us_delta(end_time, start_time);
 
        kvfree(pages);
        return 0;
index 36df55132036fb38b3d18245c8ce59eea21fb9e8..bdcb97acd0ac63e5ae34451deee1fa4cfee604ee 100644 (file)
@@ -17,7 +17,8 @@
 #define GUP_FAST_BENCHMARK     _IOWR('g', 1, struct gup_benchmark)
 
 struct gup_benchmark {
-       __u64 delta_usec;
+       __u64 get_delta_usec;
+       __u64 put_delta_usec;
        __u64 addr;
        __u64 size;
        __u32 nr_pages_per_call;
@@ -81,7 +82,8 @@ int main(int argc, char **argv)
                if (ioctl(fd, GUP_FAST_BENCHMARK, &gup))
                        perror("ioctl"), exit(1);
 
-               printf("Time: %lld us", gup.delta_usec);
+               printf("Time: get:%lld put:%lld us", gup.get_delta_usec,
+                       gup.put_delta_usec);
                if (gup.size != size)
                        printf(", truncated (size: %lld)", gup.size);
                printf("\n");