X-Git-Url: http://nsz.repo.hu/git/?p=libc-test;a=blobdiff_plain;f=src%2Fcommon%2Fvmfill.c;fp=src%2Fcommon%2Fvmfill.c;h=86a218d15d9884799ea92655424f36fe1b86a463;hp=0000000000000000000000000000000000000000;hb=cfa23cc1bd01f5c44d7746b8b1839f84d5e1b6eb;hpb=b775d19f7ff58da3fe009d48742068cc92a274f2 diff --git a/src/common/vmfill.c b/src/common/vmfill.c new file mode 100644 index 0000000..86a218d --- /dev/null +++ b/src/common/vmfill.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include "test.h" +#ifndef PAGE_SIZE + #define PAGE_SIZE sysconf(_SC_PAGE_SIZE) +#endif + +/* max mmap size, *start is the largest power-of-2 size considered */ +static size_t mmax(int fd, size_t *start) +{ + size_t i, n; + void *p; + + for (i=n=*start; i>=PAGE_SIZE; i/=2) { + if ((p=mmap(0, n, PROT_NONE, MAP_PRIVATE, fd, 0)) == MAP_FAILED) { + n -= i/2; + } else { + munmap(p, n); + if (n == i) + *start = n; + n += i/2; + } + } + return n & -PAGE_SIZE; +} + +/* +fills the virtual memory with anonymous PROT_NONE mmaps, +returns the mappings in *p and *n in decreasing size order, +the return value is the number of mappings or -1 on failure. +*/ +int t_vmfill(void **p, size_t *n, int len) +{ + int fd = open("/dev/zero", O_RDWR); + size_t start = SIZE_MAX/2 + 1; + size_t m; + void *q; + int i; + + for (i=0;;i++) { + m = mmax(fd, &start); + if (!m) + break; + q = mmap(0, m, PROT_NONE, MAP_PRIVATE, fd, 0); + if (q == MAP_FAILED) + return -1; + if (i < len) { + p[i] = q; + n[i] = m; + } + } + return i; +}