From 646748e03f0997e891f569963d0113e16bb63890 Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Wed, 14 Oct 2015 10:43:49 +0200 Subject: [PATCH] [mc] Rename PerPageCopy to ChunkedData (and move in its own files) --- src/mc/ChunkedData.cpp | 54 ++++++++++++++++++ src/mc/ChunkedData.hpp | 83 +++++++++++++++++++++++++++ src/mc/RegionSnapshot.cpp | 6 +- src/mc/RegionSnapshot.hpp | 96 ++++---------------------------- src/mc/mc_forward.hpp | 1 + src/mc/mc_page_snapshot.cpp | 56 +------------------ src/mc/mc_snapshot.h | 2 +- tools/cmake/DefinePackages.cmake | 2 + 8 files changed, 158 insertions(+), 142 deletions(-) create mode 100644 src/mc/ChunkedData.cpp create mode 100644 src/mc/ChunkedData.hpp diff --git a/src/mc/ChunkedData.cpp b/src/mc/ChunkedData.cpp new file mode 100644 index 0000000000..c1f3e2d4c0 --- /dev/null +++ b/src/mc/ChunkedData.cpp @@ -0,0 +1,54 @@ +#include + +#define SOFT_DIRTY_BIT_NUMBER 55 +#define SOFT_DIRTY (((uint64_t)1) << SOFT_DIRTY_BIT_NUMBER) + +namespace simgrid { +namespace mc { + +/** Take a per-page snapshot of a region + * + * @param data The start of the region (must be at the beginning of a page) + * @param pag_count Number of pages of the region + * @return Snapshot page numbers of this new snapshot + */ +ChunkedData::ChunkedData(PageStore& store, AddressSpace& as, + remote_ptr addr, std::size_t page_count, + const std::size_t* ref_page_numbers, const std::uint64_t* pagemap) +{ + store_ = &store; + this->pagenos_.resize(page_count); + std::vector buffer(xbt_pagesize); + + for (size_t i = 0; i != page_count; ++i) { + + // We don't have to compare soft-clean pages: + if (ref_page_numbers && pagemap && !(pagemap[i] & SOFT_DIRTY)) { + pagenos_[i] = ref_page_numbers[i]; + store_->ref_page(ref_page_numbers[i]); + continue; + } + + remote_ptr page = remote(addr.address() + (i << xbt_pagebits)); + xbt_assert(mc_page_offset((void*)page.address())==0, + "Not at the beginning of a page"); + + /* Adding another copy (and a syscall) will probably slow things a lot. + TODO, optimize this somehow (at least by grouping the syscalls) + if needed. Either: + - reduce the number of syscalls; + - let the application snapshot itself; + - move the segments in shared memory (this will break `fork` however). + */ + + as.read_bytes( + buffer.data(), xbt_pagesize, page, + simgrid::mc::ProcessIndexDisabled); + + pagenos_[i] = store_->store_page(buffer.data()); + + } +} + +} +} diff --git a/src/mc/ChunkedData.hpp b/src/mc/ChunkedData.hpp new file mode 100644 index 0000000000..0ec1cb2404 --- /dev/null +++ b/src/mc/ChunkedData.hpp @@ -0,0 +1,83 @@ +#ifndef SIMGRID_MC_CHUNKED_DATA_HPP +#define SIMGRID_MC_CHUNKED_DATA_HPP + +#include +#include + +#include + +#include +#include +#include + +namespace simgrid { +namespace mc { + +class ChunkedData { + PageStore* store_; + std::vector pagenos_; +public: + ChunkedData() : store_(nullptr) {} + ChunkedData(ChunkedData const& that) + { + store_ = that.store_; + pagenos_ = that.pagenos_; + for (std::size_t pageno : pagenos_) + store_->ref_page(pageno); + } + void clear() + { + for (std::size_t pageno : pagenos_) + store_->unref_page(pageno); + pagenos_.clear(); + } + ~ChunkedData() + { + clear(); + } + + ChunkedData(ChunkedData&& that) + { + store_ = that.store_; + that.store_ = nullptr; + pagenos_ = std::move(that.pagenos_); + that.pagenos_.clear(); + } + ChunkedData& operator=(ChunkedData const& that) + { + this->clear(); + store_ = that.store_; + pagenos_ = that.pagenos_; + for (std::size_t pageno : pagenos_) + store_->ref_page(pageno); + return *this; + } + ChunkedData& operator=(ChunkedData && that) + { + this->clear(); + store_ = that.store_; + that.store_ = nullptr; + pagenos_ = std::move(that.pagenos_); + that.pagenos_.clear(); + return *this; + } + + std::size_t page_count() const { return pagenos_.size(); } + std::size_t pageno(std::size_t i) const { return pagenos_[i]; } + const std::size_t* pagenos() const { return pagenos_.data(); } + std::size_t* pagenos() { return pagenos_.data(); } + + const void* page(std::size_t i) const + { + return store_->get_page(pagenos_[i]); + } + + ChunkedData(PageStore& store, AddressSpace& as, + remote_ptr addr, std::size_t page_count, + const std::size_t* ref_page_numbers, const std::uint64_t* pagemap); +}; + +} +} + +#endif diff --git a/src/mc/RegionSnapshot.cpp b/src/mc/RegionSnapshot.cpp index 6d50ef1873..74986e135a 100644 --- a/src/mc/RegionSnapshot.cpp +++ b/src/mc/RegionSnapshot.cpp @@ -8,7 +8,9 @@ #include "mc/mc.h" #include "mc_snapshot.h" -#include "RegionSnapshot.hpp" + +#include +#include extern "C" { @@ -122,7 +124,7 @@ RegionSnapshot sparse_region(RegionType region_type, ref_page_numbers = ref_region->page_data().pagenos(); } - simgrid::mc::PerPageCopy page_data( + simgrid::mc::ChunkedData page_data( mc_model_checker->page_store(), *process, permanent_addr, page_count, ref_page_numbers, use_soft_dirty ? pagemap.data() : nullptr); diff --git a/src/mc/RegionSnapshot.hpp b/src/mc/RegionSnapshot.hpp index 9b741303ad..11ba6f8ea5 100644 --- a/src/mc/RegionSnapshot.hpp +++ b/src/mc/RegionSnapshot.hpp @@ -14,81 +14,11 @@ #include #include +#include namespace simgrid { namespace mc { -class PerPageCopy { - PageStore* store_; - std::vector pagenos_; -public: - PerPageCopy() : store_(nullptr) {} - PerPageCopy(PerPageCopy const& that) - { - store_ = that.store_; - pagenos_ = that.pagenos_; - for (std::size_t pageno : pagenos_) - store_->ref_page(pageno); - } - void clear() - { - for (std::size_t pageno : pagenos_) - store_->unref_page(pageno); - pagenos_.clear(); - } - ~PerPageCopy() { - clear(); - } - - PerPageCopy(PerPageCopy&& that) - { - store_ = that.store_; - that.store_ = nullptr; - pagenos_ = std::move(that.pagenos_); - that.pagenos_.clear(); - } - PerPageCopy& operator=(PerPageCopy const& that) - { - this->clear(); - store_ = that.store_; - pagenos_ = that.pagenos_; - for (std::size_t pageno : pagenos_) - store_->ref_page(pageno); - return *this; - } - PerPageCopy& operator=(PerPageCopy && that) - { - this->clear(); - store_ = that.store_; - that.store_ = nullptr; - pagenos_ = std::move(that.pagenos_); - that.pagenos_.clear(); - return *this; - } - - std::size_t page_count() const - { - return pagenos_.size(); - } - - std::size_t pageno(std::size_t i) const - { - return pagenos_[i]; - } - - const std::size_t* pagenos() const { return pagenos_.data(); } - std::size_t* pagenos() { return pagenos_.data(); } - - const void* page(std::size_t i) const - { - return store_->get_page(pagenos_[i]); - } - - PerPageCopy(PageStore& store, AddressSpace& as, - remote_ptr addr, std::size_t page_count, - const size_t* ref_page_numbers, const std::uint64_t* pagemap); -}; - enum class RegionType { Unknown = 0, Heap = 1, @@ -143,10 +73,6 @@ public: static const RegionType UnknownRegion = RegionType::Unknown; static const RegionType HeapRegion = RegionType::Heap; static const RegionType DataRegion = RegionType::Data; - static const StorageType NoData = StorageType::NoData; - static const StorageType FlatData = StorageType::Flat; - static const StorageType ChunkedData = StorageType::Chunked; - static const StorageType PrivatizedData = StorageType::Privatized; public: typedef unique_data_ptr flat_data_ptr; private: @@ -172,12 +98,12 @@ private: void *permanent_addr_; flat_data_ptr flat_data_; - PerPageCopy page_numbers_; + ChunkedData page_numbers_; std::vector privatized_regions_; public: RegionSnapshot() : region_type_(UnknownRegion), - storage_type_(NoData), + storage_type_(StorageType::NoData), object_info_(nullptr), start_addr_(nullptr), size_(0), @@ -185,7 +111,7 @@ public: {} RegionSnapshot(RegionType type, void *start_addr, void* permanent_addr, size_t size) : region_type_(type), - storage_type_(NoData), + storage_type_(StorageType::NoData), object_info_(nullptr), start_addr_(start_addr), size_(size), @@ -227,7 +153,7 @@ public: void clear() { region_type_ = UnknownRegion; - storage_type_ = NoData; + storage_type_ = StorageType::NoData; privatized_regions_.clear(); page_numbers_.clear(); flat_data_.reset(); @@ -239,7 +165,7 @@ public: void clear_data() { - storage_type_ = NoData; + storage_type_ = StorageType::NoData; flat_data_.reset(); page_numbers_.clear(); privatized_regions_.clear(); @@ -247,25 +173,25 @@ public: void flat_data(flat_data_ptr data) { - storage_type_ = FlatData; + storage_type_ = StorageType::Flat; flat_data_ = std::move(data); page_numbers_.clear(); privatized_regions_.clear(); } const char* flat_data() const { return flat_data_.get(); } - void page_data(PerPageCopy page_data) + void page_data(ChunkedData page_data) { - storage_type_ = ChunkedData; + storage_type_ = StorageType::Chunked; flat_data_.reset(); page_numbers_ = std::move(page_data); privatized_regions_.clear(); } - PerPageCopy const& page_data() const { return page_numbers_; } + ChunkedData const& page_data() const { return page_numbers_; } void privatized_data(std::vector data) { - storage_type_ = PrivatizedData; + storage_type_ = StorageType::Privatized; flat_data_.reset(); page_numbers_.clear(); privatized_regions_ = std::move(data); diff --git a/src/mc/mc_forward.hpp b/src/mc/mc_forward.hpp index 5c704d495e..e77c97d01b 100644 --- a/src/mc/mc_forward.hpp +++ b/src/mc/mc_forward.hpp @@ -16,6 +16,7 @@ namespace simgrid { namespace mc { class PageStore; +class ChunkedData; class ModelChecker; class AddressSpace; class Process; diff --git a/src/mc/mc_page_snapshot.cpp b/src/mc/mc_page_snapshot.cpp index b180c4021c..794b4f129c 100644 --- a/src/mc/mc_page_snapshot.cpp +++ b/src/mc/mc_page_snapshot.cpp @@ -14,62 +14,10 @@ #include "mc_snapshot.h" #include - -#define SOFT_DIRTY_BIT_NUMBER 55 -#define SOFT_DIRTY (((uint64_t)1) << SOFT_DIRTY_BIT_NUMBER) +#include using simgrid::mc::remote; -namespace simgrid { -namespace mc { - -/** @brief Take a per-page snapshot of a region - * - * @param data The start of the region (must be at the beginning of a page) - * @param pag_count Number of pages of the region - * @return Snapshot page numbers of this new snapshot - */ -PerPageCopy::PerPageCopy(PageStore& store, AddressSpace& as, - remote_ptr addr, std::size_t page_count, - const size_t* ref_page_numbers, const std::uint64_t* pagemap) -{ - store_ = &store; - this->pagenos_.resize(page_count); - std::vector buffer(xbt_pagesize); - - for (size_t i = 0; i != page_count; ++i) { - - // We don't have to compare soft-clean pages: - if (ref_page_numbers && pagemap && !(pagemap[i] & SOFT_DIRTY)) { - pagenos_[i] = ref_page_numbers[i]; - store_->ref_page(ref_page_numbers[i]); - continue; - } - - remote_ptr page = remote(addr.address() + (i << xbt_pagebits)); - xbt_assert(mc_page_offset((void*)page.address())==0, - "Not at the beginning of a page"); - - /* Adding another copy (and a syscall) will probably slow things a lot. - TODO, optimize this somehow (at least by grouping the syscalls) - if needed. Either: - - reduce the number of syscalls; - - let the application snapshot itself; - - move the segments in shared memory (this will break `fork` however). - */ - - as.read_bytes( - buffer.data(), xbt_pagesize, page, - simgrid::mc::ProcessIndexDisabled); - - pagenos_[i] = store_->store_page(buffer.data()); - - } -} - -} -} - extern "C" { /** @brief Restore a snapshot of a region @@ -82,7 +30,7 @@ extern "C" { * @param pagenos */ void mc_restore_page_snapshot_region(simgrid::mc::Process* process, - void* start_addr, simgrid::mc::PerPageCopy const& pages_copy) + void* start_addr, simgrid::mc::ChunkedData const& pages_copy) { for (size_t i = 0; i != pages_copy.page_count(); ++i) { // Otherwise, copy the page: diff --git a/src/mc/mc_snapshot.h b/src/mc/mc_snapshot.h index cf2dc5aecb..6977237cf9 100644 --- a/src/mc/mc_snapshot.h +++ b/src/mc/mc_snapshot.h @@ -182,7 +182,7 @@ XBT_PRIVATE void MC_restore_snapshot(mc_snapshot_t); XBT_PRIVATE void mc_restore_page_snapshot_region( simgrid::mc::Process* process, - void* start_addr, simgrid::mc::PerPageCopy const& pagenos); + void* start_addr, simgrid::mc::ChunkedData const& pagenos); const void* MC_region_read_fragmented( mc_mem_region_t region, void* target, const void* addr, size_t size); diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index cc7e45373e..e3df7d8e1a 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -620,6 +620,8 @@ set(MC_SRC src/mc/ObjectInformation.cpp src/mc/PageStore.hpp src/mc/PageStore.cpp + src/mc/ChunkedData.hpp + src/mc/ChunkedData.cpp src/mc/RegionSnapshot.cpp src/mc/RegionSnapshot.hpp src/mc/Type.hpp -- 2.20.1