From 0e1f5e3e796ae383daeb8f1aa394ce5f030e7bb9 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 20 Jun 2016 13:27:17 +0100 Subject: benchmarks: Add vgem mmap speed test Primarily to check that we have the WC read/write disparity. Signed-off-by: Chris Wilson --- benchmarks/.gitignore | 1 + benchmarks/Makefile.sources | 1 + benchmarks/ezbench.d/vgem_mmap.test | 10 +++ benchmarks/vgem_mmap.c | 143 ++++++++++++++++++++++++++++++++++++ tests/prime_vgem.c | 11 ++- 5 files changed, 160 insertions(+), 6 deletions(-) create mode 100644 benchmarks/ezbench.d/vgem_mmap.test create mode 100644 benchmarks/vgem_mmap.c diff --git a/benchmarks/.gitignore b/benchmarks/.gitignore index 25d2f3c0..5ce28744 100644 --- a/benchmarks/.gitignore +++ b/benchmarks/.gitignore @@ -15,4 +15,5 @@ intel_upload_blit_large_gtt intel_upload_blit_large_map intel_upload_blit_small kms_vblank +vgem_mmap # Please keep sorted alphabetically diff --git a/benchmarks/Makefile.sources b/benchmarks/Makefile.sources index bc4f2b52..6865e737 100644 --- a/benchmarks/Makefile.sources +++ b/benchmarks/Makefile.sources @@ -19,4 +19,5 @@ benchmarks_PROGRAMS = \ gem_syslatency \ gem_userptr_benchmark \ kms_vblank \ + vgem_mmap \ $(NULL) diff --git a/benchmarks/ezbench.d/vgem_mmap.test b/benchmarks/ezbench.d/vgem_mmap.test new file mode 100644 index 00000000..0e71ecd1 --- /dev/null +++ b/benchmarks/ezbench.d/vgem_mmap.test @@ -0,0 +1,10 @@ +[ -e $IGT_BENCHMARKS/vgem_mmap ] || return 1 +sudo -n true || return 1 + +for i in fault clear write read; do + name="vgem:mmap::$i" + test_name="$test_name $name" + eval "${name}_run() { sudo $IGT_BENCHMARKS/vgem_mmap -d $i -r \$1 ; } " +done + +test_exec_time=2 diff --git a/benchmarks/vgem_mmap.c b/benchmarks/vgem_mmap.c new file mode 100644 index 00000000..7e4e459e --- /dev/null +++ b/benchmarks/vgem_mmap.c @@ -0,0 +1,143 @@ +/* + * Copyright ©2016 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "igt.h" +#include "igt_vgem.h" + +static double elapsed(const struct timespec *start, + const struct timespec *end) +{ + return (end->tv_sec - start->tv_sec) + 1e-9*(end->tv_nsec - start->tv_nsec); +} + +int main(int argc, char **argv) +{ + enum dir {READ, WRITE, CLEAR, FAULT} dir = READ; + struct timespec start, end; + struct vgem_bo bo; + void *buf; + void *ptr, *src, *dst; + int reps = 1; + int loops; + int vgem; + int c; + + while ((c = getopt (argc, argv, "d:r:")) != -1) { + switch (c) { + case 'd': + if (strcmp(optarg, "read") == 0) + dir = READ; + else if (strcmp(optarg, "write") == 0) + dir = WRITE; + else if (strcmp(optarg, "clear") == 0) + dir = CLEAR; + else if (strcmp(optarg, "fault") == 0) + dir = FAULT; + else + abort(); + break; + + case 'r': + reps = atoi(optarg); + if (reps < 1) + reps = 1; + break; + + default: + break; + } + } + + vgem = drm_open_driver(DRIVER_VGEM); + + bo.width = 2024; + bo.height = 2024; + bo.bpp = 4; + vgem_create(vgem, &bo); + ptr = vgem_mmap(vgem, &bo, PROT_WRITE); + buf = malloc(bo.size); + + if (dir == READ) { + src = ptr; + dst = buf; + } else { + src = buf; + dst = ptr; + } + + clock_gettime(CLOCK_MONOTONIC, &start); + switch (dir) { + case CLEAR: + case FAULT: + memset(dst, 0, bo.size); + break; + default: + memcpy(dst, src, bo.size); + break; + } + clock_gettime(CLOCK_MONOTONIC, &end); + + loops = 2 / elapsed(&start, &end); + while (reps--) { + clock_gettime(CLOCK_MONOTONIC, &start); + for (c = 0; c < loops; c++) { + int page; + + switch (dir) { + case CLEAR: + memset(dst, 0, bo.size); + break; + case FAULT: + munmap(ptr, bo.size); + ptr = vgem_mmap(vgem, &bo, PROT_WRITE); + for (page = 0; page < bo.size; page += 4096) { + uint32_t *x = (uint32_t *)ptr + page/4; + __asm__ __volatile__("": : :"memory"); + page += *x; /* should be zero! */ + } + break; + default: + memcpy(dst, src, bo.size); + break; + } + } + clock_gettime(CLOCK_MONOTONIC, &end); + printf("%7.3f\n", bo.size / elapsed(&start, &end) * loops / (1024*1024)); + } + + return 0; +} diff --git a/tests/prime_vgem.c b/tests/prime_vgem.c index d45cba84..2753fce9 100644 --- a/tests/prime_vgem.c +++ b/tests/prime_vgem.c @@ -48,15 +48,14 @@ static void test_read(int vgem, int i915) for (i = 0; i < 1024; i++) ptr[1024*i] = i; munmap(ptr, scratch.size); + gem_close(vgem, scratch.handle); for (i = 0; i < 1024; i++) { uint32_t tmp; gem_read(i915, handle, 4096*i, &tmp, sizeof(tmp)); igt_assert_eq(tmp, i); } - gem_close(i915, handle); - gem_close(vgem, scratch.handle); } static void test_write(int vgem, int i915) @@ -75,16 +74,16 @@ static void test_write(int vgem, int i915) handle = prime_fd_to_handle(i915, dmabuf); close(dmabuf); + ptr = vgem_mmap(vgem, &scratch, PROT_READ); + gem_close(vgem, scratch.handle); + for (i = 0; i < 1024; i++) gem_write(i915, handle, 4096*i, &i, sizeof(i)); + gem_close(i915, handle); - ptr = vgem_mmap(vgem, &scratch, PROT_READ); for (i = 0; i < 1024; i++) igt_assert_eq(ptr[1024*i], i); munmap(ptr, scratch.size); - - gem_close(i915, handle); - gem_close(vgem, scratch.handle); } static void test_gtt(int vgem, int i915) -- cgit v1.2.3