From 1810d57c2b26e27fc5e880e65fcc57f41345249e Mon Sep 17 00:00:00 2001 From: Matthieu Volat Date: Tue, 15 Nov 2016 20:27:14 +0100 Subject: [PATCH 1/1] Add alternative to remap() in PageStore when not available. Code is a bit simplistic, having way to expand mappings but not shrink them (so leaving them as they are), but it does the job. --- src/mc/PageStore.cpp | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/mc/PageStore.cpp b/src/mc/PageStore.cpp index f8bb9bff65..78f28e68fc 100644 --- a/src/mc/PageStore.cpp +++ b/src/mc/PageStore.cpp @@ -8,6 +8,9 @@ #include // memcpy, memcmp #include +#ifdef __FreeBSD__ +# define MAP_POPULATE MAP_PREFAULT_READ +#endif #include #include @@ -71,12 +74,46 @@ void PageStore::resize(std::size_t size) { size_t old_bytesize = this->capacity_ << xbt_pagebits; size_t new_bytesize = size << xbt_pagebits; + void *new_memory; // Expand the memory region by moving it into another // virtual memory address if necessary: - void* new_memory = mremap(this->memory_, old_bytesize, new_bytesize, MREMAP_MAYMOVE); +#if HAVE_MREMAP + new_memory = mremap(this->memory_, old_bytesize, new_bytesize, MREMAP_MAYMOVE); if (new_memory == MAP_FAILED) xbt_die("Could not mremap snapshot pages."); +#else + if (new_bytesize > old_bytesize) { + // Grow: first try to add new space after current map + new_memory = mmap((char *)this->memory_ + old_bytesize, + new_bytesize-old_bytesize, + PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE, + -1, 0); + if (new_memory == MAP_FAILED) + xbt_die("Could not mremap snapshot pages."); + // Check if expanding worked + if (new_memory != (char *)this->memory_ + old_bytesize) { + // New memory segment could not be put at the end of this->memory_, + // so cancel this one and try to rellocate everything and copy data + munmap(new_memory, new_bytesize-old_bytesize); + new_memory = mmap(nullptr, + new_bytesize, + PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE, + -1, 0); + if (new_memory == MAP_FAILED) + xbt_die("Could not mremap snapshot pages."); + memcpy(new_memory, this->memory_, old_bytesize); + munmap(this->memory_, old_bytesize); + } + } + else { + // We don't have functions to shrink a mapping, so leave memory as + // it is for now + new_memory = this->memory_; + } +#endif this->capacity_ = size; this->memory_ = new_memory; -- 2.20.1