10c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman/* 20c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman * Copyright 2016, Anton Blanchard, Michael Ellerman, IBM Corp. 30c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman * Licensed under GPLv2. 40c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman */ 50c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman 60c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman#include <stdio.h> 70c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman#include <stdlib.h> 80c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman#include <sys/mman.h> 90c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman#include <time.h> 100c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman 110c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman#include "utils.h" 120c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman 130c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman#define ITERATIONS 5000000 140c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman 150c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman#define MEMSIZE (128 * 1024 * 1024) 160c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman 170c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellermanint test_mmap(void) 180c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman{ 190c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman struct timespec ts_start, ts_end; 200c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman unsigned long i = ITERATIONS; 210c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman 220c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman clock_gettime(CLOCK_MONOTONIC, &ts_start); 230c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman 240c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman while (i--) { 250c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman char *c = mmap(NULL, MEMSIZE, PROT_READ|PROT_WRITE, 260c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 270c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman FAIL_IF(c == MAP_FAILED); 280c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman munmap(c, MEMSIZE); 290c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman } 300c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman 310c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman clock_gettime(CLOCK_MONOTONIC, &ts_end); 320c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman 330c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman printf("time = %.6f\n", ts_end.tv_sec - ts_start.tv_sec + (ts_end.tv_nsec - ts_start.tv_nsec) / 1e9); 340c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman 350c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman return 0; 360c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman} 370c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman 380c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellermanint main(void) 390c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman{ 400c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman return test_harness(test_mmap, "mmap_bench"); 410c63e8b7b97fb72ef38c8edbfbe751d3602e03a1Michael Ellerman} 42