From: Gabriel Corona Date: Thu, 1 Oct 2015 08:45:19 +0000 (+0200) Subject: [mc] Support for mmap-able snapthots X-Git-Tag: v3_12~62^2~6 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/64a1599658f6c313f789471fc829a574fa32bd70 [mc] Support for mmap-able snapthots This will be used for KSM-friendly snapshots. --- diff --git a/src/mc/RegionSnapshot.cpp b/src/mc/RegionSnapshot.cpp index 0bcdd392d9..634aadc85b 100644 --- a/src/mc/RegionSnapshot.cpp +++ b/src/mc/RegionSnapshot.cpp @@ -4,6 +4,8 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include + #include "mc/mc.h" #include "mc_snapshot.h" #include "RegionSnapshot.hpp" @@ -33,12 +35,24 @@ const char* to_cstr(RegionType region) } } +void data_deleter::operator()(void* p) const +{ + switch(type_) { + case Free: + free(p); + break; + case Munmap: + munmap(p, size_); + break; + } +} + RegionSnapshot dense_region( RegionType region_type, void *start_addr, void* permanent_addr, size_t size) { - std::vector data(size); - mc_model_checker->process().read_bytes(data.data(), size, + simgrid::mc::RegionSnapshot::flat_data_ptr data((char*) malloc(size)); + mc_model_checker->process().read_bytes(data.get(), size, remote(permanent_addr), simgrid::mc::ProcessIndexDisabled); @@ -47,7 +61,7 @@ RegionSnapshot dense_region( region.flat_data(std::move(data)); XBT_DEBUG("New region : type : %s, data : %p (real addr %p), size : %zu", - to_cstr(region_type), region.flat_data().data(), permanent_addr, size); + to_cstr(region_type), region.flat_data(), permanent_addr, size); return std::move(region); } diff --git a/src/mc/RegionSnapshot.hpp b/src/mc/RegionSnapshot.hpp index e427a299f6..975bd266f4 100644 --- a/src/mc/RegionSnapshot.hpp +++ b/src/mc/RegionSnapshot.hpp @@ -99,6 +99,21 @@ enum class StorageType { Privatized = 3 }; +class data_deleter { +public: + enum Type { + Free, + Munmap + }; +private: + Type type_; + std::size_t size_; +public: + data_deleter() : type_(Free) {} + data_deleter(Type type, std::size_t size) : type_(type), size_(size) {} + void operator()(void* p) const; +}; + /** @brief Copy/snapshot of a given memory region * * Different types of region snapshot storage types exist: @@ -123,6 +138,8 @@ class RegionSnapshot { static const StorageType FlatData = StorageType::Flat; static const StorageType ChunkedData = StorageType::Chunked; static const StorageType PrivatizedData = StorageType::Privatized; +public: + typedef std::unique_ptr flat_data_ptr; private: RegionType region_type_; StorageType storage_type_; @@ -145,7 +162,7 @@ private: * */ void *permanent_addr_; - std::vector flat_data_; + flat_data_ptr flat_data_; PerPageCopy page_numbers_; std::vector privatized_regions_; public: @@ -204,7 +221,7 @@ public: storage_type_ = NoData; privatized_regions_.clear(); page_numbers_.clear(); - flat_data_.clear(); + flat_data_.reset(); object_info_ = nullptr; start_addr_ = nullptr; size_ = 0; @@ -214,24 +231,24 @@ public: void clear_data() { storage_type_ = NoData; - flat_data_.clear(); + flat_data_.reset(); page_numbers_.clear(); privatized_regions_.clear(); } - void flat_data(std::vector data) + void flat_data(flat_data_ptr data) { storage_type_ = FlatData; flat_data_ = std::move(data); page_numbers_.clear(); privatized_regions_.clear(); } - std::vector const& flat_data() const { return flat_data_; } + const char* flat_data() const { return flat_data_.get(); } void page_data(PerPageCopy page_data) { storage_type_ = ChunkedData; - flat_data_.clear(); + flat_data_.reset(); page_numbers_ = std::move(page_data); privatized_regions_.clear(); } @@ -240,7 +257,7 @@ public: void privatized_data(std::vector data) { storage_type_ = PrivatizedData; - flat_data_.clear(); + flat_data_.reset(); page_numbers_.clear(); privatized_regions_ = std::move(data); } diff --git a/src/mc/mc_checkpoint.cpp b/src/mc/mc_checkpoint.cpp index b5aba8c368..a06d5f5ece 100644 --- a/src/mc/mc_checkpoint.cpp +++ b/src/mc/mc_checkpoint.cpp @@ -63,7 +63,7 @@ static void MC_region_restore(mc_mem_region_t region) break; case simgrid::mc::StorageType::Flat: - mc_model_checker->process().write_bytes(region->flat_data().data(), + mc_model_checker->process().write_bytes(region->flat_data(), region->size(), region->permanent_address()); break; diff --git a/src/mc/mc_snapshot.h b/src/mc/mc_snapshot.h index 7ef18707e4..72965f4c67 100644 --- a/src/mc/mc_snapshot.h +++ b/src/mc/mc_snapshot.h @@ -54,7 +54,7 @@ void* mc_translate_address_region(uintptr_t addr, mc_mem_region_t region, int pr case simgrid::mc::StorageType::Flat: { uintptr_t offset = (uintptr_t) addr - (uintptr_t) region->start().address(); - return (void *) ((uintptr_t) region->flat_data().data() + offset); + return (void *) ((uintptr_t) region->flat_data() + offset); } case simgrid::mc::StorageType::Chunked: @@ -227,7 +227,7 @@ const void* MC_region_read(mc_mem_region_t region, void* target, const void* add xbt_die("Storage type not supported"); case simgrid::mc::StorageType::Flat: - return (char*) region->flat_data().data() + offset; + return (char*) region->flat_data() + offset; case simgrid::mc::StorageType::Chunked: {