X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b8df87e176f27b25534f27d7e240defa32ca35bc..1ffd336de7f3917df1d0cbbacc0e077b4b5c1363:/src/mc/sosp/RegionSnapshot.cpp diff --git a/src/mc/sosp/RegionSnapshot.cpp b/src/mc/sosp/RegionSnapshot.cpp index ea2445ffe2..13d6c5b25f 100644 --- a/src/mc/sosp/RegionSnapshot.cpp +++ b/src/mc/sosp/RegionSnapshot.cpp @@ -14,6 +14,7 @@ #include "src/mc/mc_config.hpp" #include "src/mc/sosp/mc_snapshot.hpp" +#include "src/mc/mc_smx.hpp" #include "src/mc/sosp/ChunkedData.hpp" #include "src/mc/sosp/RegionSnapshot.hpp" @@ -22,84 +23,21 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_RegionSnaphot, mc, "Logging specific to regio namespace simgrid { namespace mc { -static inline const char* to_cstr(RegionType region) +RegionDense::RegionDense(RegionType region_type, void* start_addr, void* permanent_addr, size_t size) + : RegionSnapshot(region_type, start_addr, permanent_addr, size) { - switch (region) { - case RegionType::Unknown: - return "unknown"; - case RegionType::Heap: - return "Heap"; - case RegionType::Data: - return "Data"; - default: - return "?"; - } -} - -Buffer::Buffer(std::size_t size, Type type) : size_(size), type_(type) -{ - switch (type_) { - case Type::Malloc: - data_ = ::operator new(size_); - break; - case Type::Mmap: - data_ = ::mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0); - if (data_ == MAP_FAILED) { - data_ = nullptr; - size_ = 0; - type_ = Type::Malloc; - throw std::bad_alloc(); - } - break; - default: - abort(); - } -} - -void Buffer::clear() noexcept -{ - switch (type_) { - case Type::Malloc: - ::operator delete(data_); - break; - case Type::Mmap: - if (munmap(data_, size_) != 0) - abort(); - break; - default: - abort(); - } - data_ = nullptr; - size_ = 0; - type_ = Type::Malloc; -} - -RegionSnapshot dense_region(RegionType region_type, void* start_addr, void* permanent_addr, size_t size) -{ - // When KSM support is enables, we allocate memory using mmap: - // * we don't want to advise bits of the heap as mergable - // * mmap gives data aligned on page boundaries which is merge friendly - simgrid::mc::Buffer data; - if (_sg_mc_ksm) - data = Buffer::mmap(size); - else - data = Buffer::malloc(size); + flat_data_ = Buffer::malloc(size); - mc_model_checker->process().read_bytes(data.get(), size, remote(permanent_addr), simgrid::mc::ProcessIndexDisabled); + mc_model_checker->process().read_bytes(flat_data_.get(), size, remote(permanent_addr), + simgrid::mc::ProcessIndexDisabled); -#ifdef __linux__ - if (_sg_mc_ksm) - // Mark the region as mergeable *after* we have written into it. - // Trying to merge them before is useless/counterproductive. - madvise(data.get(), size, MADV_MERGEABLE); -#endif - - simgrid::mc::RegionSnapshot region(region_type, start_addr, permanent_addr, size); - region.flat_data(std::move(data)); + storage_type_ = StorageType::Flat; + page_numbers_.clear(); + privatized_regions_.clear(); - XBT_DEBUG("New region : type : %s, data : %p (real addr %p), size : %zu", to_cstr(region_type), - region.flat_data().get(), permanent_addr, size); - return region; + XBT_DEBUG("New region : type : %s, data : %p (real addr %p), size : %zu", + (region_type == RegionType::Heap ? "Heap" : (region_type == RegionType::Data ? "Data" : "?")), + flat_data().get(), permanent_addr, size); } /** @brief Take a snapshot of a given region @@ -110,30 +48,57 @@ RegionSnapshot dense_region(RegionType region_type, void* start_addr, void* perm * privatized mapping) * @param size Size of the data* */ -RegionSnapshot region(RegionType type, void* start_addr, void* permanent_addr, size_t size) +RegionSnapshot* region(RegionType type, void* start_addr, void* permanent_addr, size_t size) { if (_sg_mc_sparse_checkpoint) - return sparse_region(type, start_addr, permanent_addr, size); + return new RegionSparse(type, start_addr, permanent_addr, size); else - return dense_region(type, start_addr, permanent_addr, size); + return new RegionDense(type, start_addr, permanent_addr, size); } -RegionSnapshot sparse_region(RegionType region_type, void* start_addr, void* permanent_addr, size_t size) +RegionSparse::RegionSparse(RegionType region_type, void* start_addr, void* permanent_addr, size_t size) + : RegionSnapshot(region_type, start_addr, permanent_addr, size) { simgrid::mc::RemoteClient* process = &mc_model_checker->process(); assert(process != nullptr); - xbt_assert((((uintptr_t)start_addr) & (xbt_pagesize - 1)) == 0, "Not at the beginning of a page"); - xbt_assert((((uintptr_t)permanent_addr) & (xbt_pagesize - 1)) == 0, "Not at the beginning of a page"); - size_t page_count = simgrid::mc::mmu::chunkCount(size); + xbt_assert((((uintptr_t)start_addr) & (xbt_pagesize - 1)) == 0, "Start address not at the beginning of a page"); + xbt_assert((((uintptr_t)permanent_addr) & (xbt_pagesize - 1)) == 0, + "Permanent address not at the beginning of a page"); + + storage_type_ = StorageType::Chunked; + flat_data_.clear(); + privatized_regions_.clear(); + + page_numbers_ = + ChunkedData(mc_model_checker->page_store(), *process, RemotePtr(permanent_addr), mmu::chunk_count(size)); +} + +#if HAVE_SMPI +RegionPrivatized::RegionPrivatized(RegionType region_type, void* start_addr, void* permanent_addr, std::size_t size) + : RegionSnapshot(region_type, start_addr, permanent_addr, size) +{ + storage_type_ = StorageType::Privatized; + + size_t process_count = MC_smpi_process_count(); - simgrid::mc::ChunkedData page_data(mc_model_checker->page_store(), *process, RemotePtr(permanent_addr), - page_count); + // Read smpi_privatization_regions from MCed: + smpi_privatization_region_t remote_smpi_privatization_regions; + mc_model_checker->process().read_variable("smpi_privatization_regions", &remote_smpi_privatization_regions, + sizeof(remote_smpi_privatization_regions)); + s_smpi_privatization_region_t privatization_regions[process_count]; + mc_model_checker->process().read_bytes(&privatization_regions, sizeof(privatization_regions), + remote(remote_smpi_privatization_regions)); - simgrid::mc::RegionSnapshot region(region_type, start_addr, permanent_addr, size); - region.page_data(std::move(page_data)); - return region; + privatized_regions_.reserve(process_count); + for (size_t i = 0; i < process_count; i++) + privatized_regions_.push_back(std::unique_ptr( + region(region_type, start_addr, privatization_regions[i].address, size))); + + flat_data_.clear(); + page_numbers_.clear(); } +#endif } // namespace mc } // namespace simgrid