From b434e2b7fecd3d485dac99668bb00cc4d33a6f4f Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 4 Sep 2015 11:38:16 -0500 Subject: [PATCH] add map_anonymoys support --- libs/libks/src/include/mpool.h | 5 +++++ libs/libks/src/include/mpool_loc.h | 1 + libs/libks/src/mpool.c | 19 +++++++++++++------ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/libs/libks/src/include/mpool.h b/libs/libks/src/include/mpool.h index 16ccb3c1b9..063cf5063a 100644 --- a/libs/libks/src/include/mpool.h +++ b/libs/libks/src/include/mpool.h @@ -66,6 +66,11 @@ */ #define MPOOL_FLAG_USE_SBRK (1<<3) +/* + * Use MMAP_ANONYMOUS instead of /dev/zero + */ +#define MPOOL_FLAG_ANONYMOUS (1<<4) + /* * Mpool error codes */ diff --git a/libs/libks/src/include/mpool_loc.h b/libs/libks/src/include/mpool_loc.h index aa39e9dde6..a3fdbda3db 100644 --- a/libs/libks/src/include/mpool_loc.h +++ b/libs/libks/src/include/mpool_loc.h @@ -73,6 +73,7 @@ typedef struct { unsigned int mp_magic; /* magic number for struct */ unsigned int mp_flags; /* flags for the struct */ + unsigned int mp_mmflags; /* flags for mmap */ unsigned long mp_alloc_c; /* number of allocations */ unsigned long mp_user_alloc; /* user bytes allocated */ unsigned long mp_max_alloc; /* maximum user bytes allocated */ diff --git a/libs/libks/src/mpool.c b/libs/libks/src/mpool.c index c285621a82..1c2d032067 100644 --- a/libs/libks/src/mpool.c +++ b/libs/libks/src/mpool.c @@ -273,7 +273,7 @@ static void *alloc_pages(mpool_t *mp_p, const unsigned int page_n, #endif /* mmap from /dev/zero */ - mem = mmap((caddr_t)mp_p->mp_addr, size, PROT_READ | PROT_WRITE, state, + mem = mmap((caddr_t)mp_p->mp_addr, size, mp_p->mp_mmflags, state, mp_p->mp_fd, mp_p->mp_top); if (mem == (void *)MAP_FAILED) { if (errno == ENOMEM) { @@ -937,17 +937,24 @@ mpool_t *mpool_open(const unsigned int flags, const unsigned int page_size, } } + mp.mp_mmflags = PROT_READ | PROT_WRITE; + if (BIT_IS_SET(flags, MPOOL_FLAG_USE_SBRK)) { mp.mp_fd = -1; mp.mp_addr = NULL; mp.mp_top = 0; } else { - /* open dev-zero for our mmaping */ - mp.mp_fd = open("/dev/zero", O_RDWR, 0); - if (mp.mp_fd < 0) { - SET_POINTER(error_p, MPOOL_ERROR_OPEN_ZERO); - return NULL; + if (BIT_IS_SET(flags, MPOOL_FLAG_ANONYMOUS)) { + mp.mp_fd = -1; + mp.mp_mmflags |= MAP_ANONYMOUS; + } else { + /* open dev-zero for our mmaping */ + mp.mp_fd = open("/dev/zero", O_RDWR, 0); + if (mp.mp_fd < 0) { + SET_POINTER(error_p, MPOOL_ERROR_OPEN_ZERO); + return NULL; + } } mp.mp_addr = start_addr; /* we start at the front of the file */