#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #include <sys/time.h> #include "pagingtest.h" int mmap_test(int test_runs, unsigned long long alloc_size) { void *buf; int ret = -1; int i; struct timeval begin_time, end_time, elapsed_time; struct timeval total_time_mmap, total_time_munmap, total_time_in, total_time_out; timerclear(&total_time_mmap); timerclear(&total_time_munmap); timerclear(&total_time_in); timerclear(&total_time_out); for (i = 0; i < test_runs; i++) { gettimeofday(&begin_time, NULL); buf = mmap(NULL, alloc_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); gettimeofday(&end_time, NULL); if (buf == ((void *)-1)) { fprintf(stderr, "Failed to mmap anonymous memory: %s\n", strerror(errno)); goto err_map; } timersub(&end_time, &begin_time, &elapsed_time); timeradd(&total_time_mmap, &elapsed_time, &total_time_mmap); gettimeofday(&begin_time, NULL); munmap(buf, alloc_size); gettimeofday(&end_time, NULL); timersub(&end_time, &begin_time, &elapsed_time); timeradd(&total_time_mmap, &elapsed_time, &total_time_mmap); } printf("mmap: %llu us\n", total_time_mmap.tv_sec * USEC_PER_SEC + total_time_mmap.tv_usec); printf("munmap: %llu us\n", total_time_munmap.tv_sec * USEC_PER_SEC + total_time_munmap.tv_usec); ret = 0; goto end; // err: munmap(buf, alloc_size); // unreached? end: err_map: return ret; }