summaryrefslogtreecommitdiff
path: root/benchmarks/gem_mmap.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2015-07-24 16:34:26 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2015-07-24 18:55:49 +0100
commit42a386b83bf6693826432111fc7564254c14df95 (patch)
treeab2d77dc724a3d69ca791b595b8335f5d16c823c /benchmarks/gem_mmap.c
parente984d4965fa98b3071893143c65e6232ff4053ec (diff)
benchmarks: Measure mmap fault latency
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'benchmarks/gem_mmap.c')
-rw-r--r--benchmarks/gem_mmap.c19
1 files changed, 16 insertions, 3 deletions
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));