Skip to content

Instantly share code, notes, and snippets.

@alk
Created December 5, 2016 07:49
Show Gist options
  • Save alk/c8577b0f2d47d27370ccf566005afa98 to your computer and use it in GitHub Desktop.
Save alk/c8577b0f2d47d27370ccf566005afa98 to your computer and use it in GitHub Desktop.
#include <sys/mman.h>
#include <sys/types.h>
#include <time.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main(void)
{
void *addr = mmap(0, (4 << 20) - 4096, PROT_NONE,
MAP_ANONYMOUS|MAP_PRIVATE, 0, 0);
void *rva;
int rv;
if (addr == MAP_FAILED) {
perror("mmap");
abort();
}
addr = (void *)(((uintptr_t)addr + (2 << 20) - 1) & ~((2 << 20) - 1));
printf("addr = %p\n", addr);
rva = mmap(addr, 2 << 20, PROT_READ|PROT_WRITE,
MAP_ANONYMOUS|MAP_PRIVATE|MAP_FIXED, 0, 0);
if (rva == MAP_FAILED) {
perror("mmap");
abort();
}
rv = madvise(addr, 2 << 20, MADV_HUGEPAGE);
if (rv) {
perror("madvise");
abort();
}
*(volatile char *)(addr) = 0;
/*
* printf("getchar1\n");
* char ch = getchar();
*
* {
* rv = madvise(addr, 2 << 20, MADV_DONTNEED);
* if (rv) {
* perror("madvise");
* abort();
* }
* printf("getchar2\n");
* ch = getchar();
* *(volatile char *)(addr) = 0;
* }
*/
clock_t before, after;
uintptr_t iters = (1ULL << 18);
before = clock();
for (uintptr_t i = 0; i < iters; i++) {
rv = madvise(addr, 2 << 20, MADV_DONTNEED);
if (rv) {
perror("madvise");
abort();
}
if (*(volatile char *)(addr)) {
abort();
}
*(volatile char *)(addr) = 1;
}
after = clock();
printf("iteration took %f us\n",
((double)after - before)/CLOCKS_PER_SEC*1E6/iters);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment