X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/269363f1bc63093972eb06e0537ca5f22ab8a53d..9575359fcebd3a393b65891c293990d1a882eb34:/src/mc/PageStore.cpp diff --git a/src/mc/PageStore.cpp b/src/mc/PageStore.cpp index 3289157eb9..a8e149aeb4 100644 --- a/src/mc/PageStore.cpp +++ b/src/mc/PageStore.cpp @@ -5,25 +5,30 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include -#include // memcpy, memcp +#include // memcpy, memcmp #include +#ifdef __FreeBSD__ +# define MAP_POPULATE MAP_PREFAULT_READ +#endif -#include +#include +#include +#include + +#include "src/internal_config.h" #include "src/mc/PageStore.hpp" #include "src/mc/mc_mmu.h" -extern "C" { - XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_page_snapshot, mc, "Logging specific to mc_page_snapshot"); namespace simgrid { namespace mc { -/** @brief Compte a hash for the given memory page +/** @brief Compute a hash for the given memory page * * The page is used before inserting the page in the page store * in order to find duplicate of this page in the page store. @@ -31,8 +36,7 @@ namespace mc { * @param data Memory page * @return hash off the page */ -static inline __attribute__ ((always_inline)) -PageStore::hash_type mc_hash_page(const void* data) +static XBT_ALWAYS_INLINE PageStore::hash_type mc_hash_page(const void* data) { const std::uint64_t* values = (const uint64_t*) data; std::size_t n = xbt_pagesize / sizeof(uint64_t); @@ -71,12 +75,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; @@ -230,5 +268,3 @@ XBT_TEST_UNIT("base", test_mc_page_store, "Test adding/removing pages in the sto } #endif /* SIMGRID_TEST */ - -}