testprogram: #include #include #include #include #include #include #define SIZE (512*1024*1024) int main(int argc, char ** argv) { int fd = -1, level, max_level; char * start, * end, * tmp; max_level = atoi(argv[1]); if ((start = mmap(0, SIZE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, fd, 0)) == MAP_FAILED) perror("mmap"), exit(1); end = start + SIZE; for (tmp = start; tmp < end; tmp += 4096) { *tmp = 0; } for (level = 0; level < max_level; level++) { int pid = fork(); if (pid < 0) perror("fork"), exit(1); for (tmp = start; tmp < end; tmp += 4096) { *(volatile char *)tmp; } } for (;;) if (wait(NULL) < 0) break; return 0; } 2.4.21 based kernel: 6: real 0m6.548s user 0m11.340s sys 0m10.730s real 0m6.684s user 0m11.120s sys 0m11.090s 7: real 0m12.145s user 0m22.180s sys 0m21.330s real 0m11.862s user 0m21.680s sys 0m21.100s 2.6.5-rc2-aa1 (== 2.6 + objrmap + anon_vma): 6: real 0m6.520s user 0m9.926s sys 0m11.791s real 0m6.527s user 0m9.823s sys 0m11.975s 7: real 0m12.072s user 0m21.913s sys 0m22.034s real 0m12.062s user 0m21.331s sys 0m22.161s 2.6.2 (the last non-objrmap kernel I had installed on the test box) 6: real 0m8.359s user 0m10.490s sys 0m17.840s real 0m8.185s user 0m9.684s sys 0m18.078s 7: real 0m16.150s user 0m21.184s sys 0m38.473s real 0m16.082s user 0m21.441s sys 0m38.025s from number 8 2.6.2 runs out of memory in fork, 2.6.5-rc1-aa1 reaches 9 without problems filling around 400m with pagetables.