#include #include #include #include #include #include #include #define NR_TASKS 450UL #define MMAP_SIZE (256UL << 30) #define PMD_SIZE (1UL << 21) #define NR_PMDS (MMAP_SIZE / PMD_SIZE) #define NR_LOOPS (NR_PMDS * 200) int main(void) { unsigned long i; void *start; pid_t pid; start = mmap(NULL, MMAP_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED | MAP_NORESERVE, -1, 0); if (start == MAP_FAILED) { perror("mmap"); return -1; } if (madvise(start, MMAP_SIZE, MADV_NOHUGEPAGE)) { perror("madvise"); return -1; } for (i = 0; i < NR_TASKS; i++) { pid = fork(); if (pid < 0) { perror("fork"); return -1; } if (!pid) break; } pid = getpid(); srand48(pid); for (i = 0; i < NR_LOOPS; i++) { unsigned long offset = (lrand48() % NR_PMDS) * PMD_SIZE; unsigned long *addr = start + offset; *addr = i; } return 0; }