From 42a386b83bf6693826432111fc7564254c14df95 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 24 Jul 2015 16:34:26 +0100 Subject: benchmarks: Measure mmap fault latency Signed-off-by: Chris Wilson --- benchmarks/gem_mmap.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'benchmarks/gem_mmap.c') diff --git a/benchmarks/gem_mmap.c b/benchmarks/gem_mmap.c index 7593e12a..da712749 100644 --- a/benchmarks/gem_mmap.c +++ b/benchmarks/gem_mmap.c @@ -56,7 +56,7 @@ int main(int argc, char **argv) { int fd = drm_open_any(); enum map {CPU, GTT, WC} map = CPU; - enum dir {READ, WRITE, CLEAR} dir = READ; + enum dir {READ, WRITE, CLEAR, FAULT} dir = READ; int tiling = I915_TILING_NONE; void *buf = malloc(OBJECT_SIZE); uint32_t handle; @@ -84,6 +84,8 @@ int main(int argc, char **argv) dir = WRITE; else if (strcmp(optarg, "clear") == 0) dir = CLEAR; + else if (strcmp(optarg, "fault") == 0) + dir = FAULT; else abort(); break; @@ -146,12 +148,23 @@ int main(int argc, char **argv) for (n = 0; n < reps; n++) { struct timespec start, end; + int page; clock_gettime(CLOCK_MONOTONIC, &start); - if (dir == CLEAR) + switch (dir) { + case CLEAR: memset(dst, 0, size); - else + break; + case FAULT: + for (page = 0; page < OBJECT_SIZE; page += 4096) { + uint32_t *x = (uint32_t *)ptr + page/4; + page += *x; /* should be zero! */ + } + break; + default: memcpy(dst, src, size); + break; + } clock_gettime(CLOCK_MONOTONIC, &end); igt_stats_push(&stats, elapsed(&start, &end)); -- cgit v1.2.3