From: Gabriel Corona Date: Thu, 14 Apr 2016 12:32:24 +0000 (+0200) Subject: [mv] Remove soft-darty tracking X-Git-Tag: v3_13~97^2~2^2~6 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/2b0d4aa36f4ef3a0e253b6104b317b5737e075e8 [mv] Remove soft-darty tracking * the code handling this is quite a mess; * let's have a clean codebase before trying to optimize to much. --- diff --git a/src/include/mc/mc.h b/src/include/mc/mc.h index e24db91b44..9d3deb3836 100644 --- a/src/include/mc/mc.h +++ b/src/include/mc/mc.h @@ -35,7 +35,6 @@ extern XBT_PRIVATE int _sg_do_model_check_record; extern XBT_PRIVATE int _sg_mc_checkpoint; extern XBT_PUBLIC(int) _sg_mc_sparse_checkpoint; extern XBT_PUBLIC(int) _sg_mc_ksm; -extern XBT_PUBLIC(int) _sg_mc_soft_dirty; extern XBT_PUBLIC(char*) _sg_mc_property_file; extern XBT_PRIVATE int _sg_mc_timeout; extern XBT_PRIVATE int _sg_mc_hash; @@ -52,7 +51,6 @@ XBT_PRIVATE void _mc_cfg_cb_reduce(const char *name); XBT_PRIVATE void _mc_cfg_cb_checkpoint(const char *name); XBT_PRIVATE void _mc_cfg_cb_sparse_checkpoint(const char *name); XBT_PRIVATE void _mc_cfg_cb_ksm(const char *name); -XBT_PRIVATE void _mc_cfg_cb_soft_dirty(const char *name); XBT_PRIVATE void _mc_cfg_cb_property(const char *name); XBT_PRIVATE void _mc_cfg_cb_timeout(const char *name); XBT_PRIVATE void _mc_cfg_cb_snapshot_fds(const char *name); diff --git a/src/mc/ChunkedData.cpp b/src/mc/ChunkedData.cpp index 8d5a8e0c7b..ff1da46351 100644 --- a/src/mc/ChunkedData.cpp +++ b/src/mc/ChunkedData.cpp @@ -16,9 +16,6 @@ #include "src/mc/ChunkedData.hpp" #include "src/mc/PageStore.hpp" -#define SOFT_DIRTY_BIT_NUMBER 55 -#define SOFT_DIRTY (((uint64_t)1) << SOFT_DIRTY_BIT_NUMBER) - namespace simgrid { namespace mc { @@ -29,8 +26,7 @@ namespace mc { * @return Snapshot page numbers of this new snapshot */ ChunkedData::ChunkedData(PageStore& store, AddressSpace& as, - RemotePtr addr, std::size_t page_count, - const std::size_t* ref_page_numbers, const std::uint64_t* pagemap) + RemotePtr addr, std::size_t page_count) { store_ = &store; this->pagenos_.resize(page_count); @@ -38,13 +34,6 @@ ChunkedData::ChunkedData(PageStore& store, AddressSpace& as, 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; - } - RemotePtr page = remote((void*) simgrid::mc::mmu::join(i, addr.address())); xbt_assert(simgrid::mc::mmu::split(page.address()).second == 0, diff --git a/src/mc/ChunkedData.hpp b/src/mc/ChunkedData.hpp index 706c749fb6..ae6efb13e5 100644 --- a/src/mc/ChunkedData.hpp +++ b/src/mc/ChunkedData.hpp @@ -82,8 +82,7 @@ public: } ChunkedData(PageStore& store, AddressSpace& as, - RemotePtr addr, std::size_t page_count, - const std::size_t* ref_page_numbers, const std::uint64_t* pagemap); + RemotePtr addr, std::size_t page_count); }; } diff --git a/src/mc/PageStore.hpp b/src/mc/PageStore.hpp index 2ec8ec99e0..979e02fb5d 100644 --- a/src/mc/PageStore.hpp +++ b/src/mc/PageStore.hpp @@ -26,7 +26,7 @@ namespace mc { * The first (lower) layer of the per-page snapshot mechanism is a page * store: its responsibility is to store immutable shareable * reference-counted memory pages independently of the snapshotting - * logic. Snapshot management and representation, soft-dirty tracking is + * logic. Snapshot management and representation is * handled to an higher layer. READMORE * * Data structure: diff --git a/src/mc/Process.cpp b/src/mc/Process.cpp index de44cf84f2..de390cd39c 100644 --- a/src/mc/Process.cpp +++ b/src/mc/Process.cpp @@ -181,14 +181,6 @@ static void zero_buffer_init(void) close(fd); } -static -int open_process_file(pid_t pid, const char* file, int flags) -{ - char buff[50]; - snprintf(buff, sizeof(buff), "/proc/%li/%s", (long) pid, file); - return open(buff, flags); -} - int open_vm(pid_t pid, int flags) { const size_t buffer_size = 30; @@ -246,11 +238,6 @@ Process::~Process() } unw_destroy_addr_space(this->unw_addr_space); - - if (this->clear_refs_fd_ >= 0) - close(this->clear_refs_fd_); - if (this->pagemap_fd_ >= 0) - close(this->pagemap_fd_); } /** Refresh the information about the process @@ -574,30 +561,6 @@ void Process::ignore_region(std::uint64_t addr, std::size_t size) ignored_regions_.begin() + position, region); } -void Process::reset_soft_dirty() -{ - if (this->clear_refs_fd_ < 0) { - this->clear_refs_fd_ = open_process_file(pid_, "clear_refs", O_WRONLY|O_CLOEXEC); - if (this->clear_refs_fd_ < 0) - xbt_die("Could not open clear_refs file for soft-dirty tracking. Run as root?"); - } - if(::write(this->clear_refs_fd_, "4\n", 2) != 2) - xbt_die("Could not reset softdirty bits"); -} - -void Process::read_pagemap(uint64_t* pagemap, size_t page_start, size_t page_count) -{ - if (pagemap_fd_ < 0) { - pagemap_fd_ = open_process_file(pid_, "pagemap", O_RDONLY|O_CLOEXEC); - if (pagemap_fd_ < 0) - xbt_die("Could not open pagemap file for soft-dirty tracking. Run as root?"); - } - ssize_t bytesize = sizeof(uint64_t) * page_count; - off_t offset = sizeof(uint64_t) * page_start; - if (pread_whole(pagemap_fd_, pagemap, bytesize, offset) != bytesize) - xbt_die("Could not read pagemap"); -} - void Process::ignore_heap(IgnoredHeapRegion const& region) { if (ignored_heap_.empty()) { diff --git a/src/mc/Process.hpp b/src/mc/Process.hpp index 7f4127e5c1..10bd3b547d 100644 --- a/src/mc/Process.hpp +++ b/src/mc/Process.hpp @@ -178,9 +178,6 @@ public: running_ = false; } - void reset_soft_dirty(); - void read_pagemap(uint64_t* pagemap, size_t start_page, size_t page_count); - bool privatized(ObjectInformation const& info) const { return privatized_ && info.executable(); @@ -262,8 +259,6 @@ private: RemotePtr maestro_stack_start_, maestro_stack_end_; int memory_file = -1; std::vector ignored_regions_; - int clear_refs_fd_ = -1; - int pagemap_fd_ = -1; bool privatized_ = false; std::vector stack_areas_; std::vector ignored_heap_; diff --git a/src/mc/RegionSnapshot.cpp b/src/mc/RegionSnapshot.cpp index 8fe9a9865f..94acf100e2 100644 --- a/src/mc/RegionSnapshot.cpp +++ b/src/mc/RegionSnapshot.cpp @@ -112,45 +112,28 @@ RegionSnapshot dense_region( * @param size Size of the data* */ RegionSnapshot region( - RegionType type, void *start_addr, void* permanent_addr, size_t size, - RegionSnapshot const* ref_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, ref_region); + return sparse_region(type, start_addr, permanent_addr, size); else return dense_region(type, start_addr, permanent_addr, size); } RegionSnapshot sparse_region(RegionType region_type, - void *start_addr, void* permanent_addr, size_t size, - RegionSnapshot const* ref_region) + void *start_addr, void* permanent_addr, size_t size) { simgrid::mc::Process* process = &mc_model_checker->process(); assert(process != nullptr); - bool use_soft_dirty = _sg_mc_sparse_checkpoint && _sg_mc_soft_dirty - && ref_region != nullptr - && ref_region->storage_type() == simgrid::mc::StorageType::Chunked; - 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); - std::vector pagemap; - const size_t* ref_page_numbers = nullptr; - if (use_soft_dirty) { - pagemap.resize(page_count); - process->read_pagemap(pagemap.data(), - simgrid::mc::mmu::split((std::size_t) permanent_addr).first, page_count); - ref_page_numbers = ref_region->page_data().pagenos(); - } - simgrid::mc::ChunkedData page_data( - mc_model_checker->page_store(), *process, permanent_addr, page_count, - ref_page_numbers, - use_soft_dirty ? pagemap.data() : nullptr); + mc_model_checker->page_store(), *process, permanent_addr, page_count); simgrid::mc::RegionSnapshot region( region_type, start_addr, permanent_addr, size); diff --git a/src/mc/RegionSnapshot.hpp b/src/mc/RegionSnapshot.hpp index 7a76d7c815..182c6f185b 100644 --- a/src/mc/RegionSnapshot.hpp +++ b/src/mc/RegionSnapshot.hpp @@ -266,15 +266,13 @@ public: RegionSnapshot privatized_region( RegionType region_type, void *start_addr, void* permanent_addr, - std::size_t size, const RegionSnapshot* ref_region); + std::size_t size); RegionSnapshot dense_region( RegionType type, void *start_addr, void* data_addr, std::size_t size); simgrid::mc::RegionSnapshot sparse_region( - RegionType type, void *start_addr, void* data_addr, std::size_t size, - RegionSnapshot const* ref_region); + RegionType type, void *start_addr, void* data_addr, std::size_t size); simgrid::mc::RegionSnapshot region( - RegionType type, void *start_addr, void* data_addr, std::size_t size, - RegionSnapshot const* ref_region); + RegionType type, void *start_addr, void* data_addr, std::size_t size); } } diff --git a/src/mc/mc_checkpoint.cpp b/src/mc/mc_checkpoint.cpp index 36ed86313d..04f995e869 100644 --- a/src/mc/mc_checkpoint.cpp +++ b/src/mc/mc_checkpoint.cpp @@ -86,7 +86,7 @@ static void restore(mc_mem_region_t region) #if HAVE_SMPI RegionSnapshot privatized_region( RegionType region_type, void *start_addr, void* permanent_addr, - std::size_t size, const RegionSnapshot* ref_region + std::size_t size ) { size_t process_count = MC_smpi_process_count(); @@ -103,13 +103,9 @@ RegionSnapshot privatized_region( std::vector data; data.reserve(process_count); - for (size_t i = 0; i < process_count; i++) { - const simgrid::mc::RegionSnapshot* ref_privatized_region = nullptr; - if (ref_region && ref_region->storage_type() == StorageType::Privatized) - ref_privatized_region = &ref_region->privatized_data()[i]; + for (size_t i = 0; i < process_count; i++) data.push_back(simgrid::mc::region(region_type, start_addr, - privatisation_regions[i].address, size, ref_privatized_region)); - } + privatisation_regions[i].address, size)); simgrid::mc::RegionSnapshot region = simgrid::mc::RegionSnapshot( region_type, start_addr, permanent_addr, size); @@ -130,20 +126,16 @@ void add_region(int index, simgrid::mc::Snapshot* snapshot, else if (type == simgrid::mc::RegionType::Heap) xbt_assert(!object_info, "Unexpected object info for heap region."); - simgrid::mc::RegionSnapshot const* ref_region = nullptr; - if (mc_model_checker->parent_snapshot_) - ref_region = mc_model_checker->parent_snapshot_->snapshot_regions[index].get(); - simgrid::mc::RegionSnapshot region; #if HAVE_SMPI const bool privatization_aware = object_info && mc_model_checker->process().privatized(*object_info); if (privatization_aware && MC_smpi_process_count()) region = simgrid::mc::privatized_region( - type, start_addr, permanent_addr, size, ref_region); + type, start_addr, permanent_addr, size); else #endif - region = simgrid::mc::region(type, start_addr, permanent_addr, size, ref_region); + region = simgrid::mc::region(type, start_addr, permanent_addr, size); region.object_info(object_info); snapshot->snapshot_regions[index] @@ -584,12 +576,8 @@ std::shared_ptr take_snapshot(int num_state) if (_sg_mc_snapshot_fds) snapshot->current_fds = get_current_fds(mc_model_checker->process().pid()); - const bool use_soft_dirty = _sg_mc_sparse_checkpoint && _sg_mc_soft_dirty; - /* Save the std heap and the writable mapped pages of libsimgrid and binary */ get_memory_regions(mc_process, snapshot.get()); - if (use_soft_dirty) - mc_process->reset_soft_dirty(); snapshot->to_ignore = mc_model_checker->process().ignored_heap(); @@ -603,8 +591,6 @@ std::shared_ptr take_snapshot(int num_state) snapshot->hash = 0; snapshot_ignore_restore(snapshot.get()); - if (use_soft_dirty) - mc_model_checker->parent_snapshot_ = snapshot; return snapshot; } @@ -652,16 +638,11 @@ void restore_snapshot_fds(simgrid::mc::Snapshot* snapshot) void restore_snapshot(std::shared_ptr snapshot) { XBT_DEBUG("Restore snapshot %i", snapshot->num_state); - const bool use_soft_dirty = _sg_mc_sparse_checkpoint && _sg_mc_soft_dirty; restore_snapshot_regions(snapshot.get()); if (_sg_mc_snapshot_fds) restore_snapshot_fds(snapshot.get()); - if (use_soft_dirty) - mc_model_checker->process().reset_soft_dirty(); snapshot_ignore_restore(snapshot.get()); mc_model_checker->process().clear_cache(); - if (use_soft_dirty) - mc_model_checker->parent_snapshot_ = snapshot; } } diff --git a/src/mc/mc_config.cpp b/src/mc/mc_config.cpp index 4b0f610eb0..84b8b07dbc 100644 --- a/src/mc/mc_config.cpp +++ b/src/mc/mc_config.cpp @@ -51,7 +51,6 @@ int _sg_do_model_check = 0; int _sg_do_model_check_record = 0; int _sg_mc_checkpoint = 0; int _sg_mc_sparse_checkpoint = 0; -int _sg_mc_soft_dirty = 0; int _sg_mc_ksm = 0; char *_sg_mc_property_file = nullptr; int _sg_mc_hash = 0; @@ -95,16 +94,6 @@ void _mc_cfg_cb_sparse_checkpoint(const char *name) { _sg_mc_sparse_checkpoint = xbt_cfg_get_boolean(name); } -void _mc_cfg_cb_soft_dirty(const char *name) { - if (_sg_cfg_init_status && !_sg_do_model_check) - xbt_die("You are specifying a soft dirty value after the initialization " - "(through MSG_config?), but model-checking was not activated " - "at config time (through --cfg=model-check:1). " - "This won't work, sorry."); - - _sg_mc_soft_dirty = xbt_cfg_get_boolean(name); -} - void _mc_cfg_cb_ksm(const char *name) { if (_sg_cfg_init_status && !_sg_do_model_check) diff --git a/src/mc/mc_snapshot.cpp b/src/mc/mc_snapshot.cpp index 49147ba42c..7e67049042 100644 --- a/src/mc/mc_snapshot.cpp +++ b/src/mc/mc_snapshot.cpp @@ -253,12 +253,12 @@ static void test_snapshot(bool sparse_checkpoint) { // Init memory and take snapshots: init_memory(source, byte_size); simgrid::mc::RegionSnapshot region0 = simgrid::mc::sparse_region( - simgrid::mc::RegionType::Unknown, source, source, byte_size, nullptr); + simgrid::mc::RegionType::Unknown, source, source, byte_size); for(int i=0; i faster verification, but huge memory consumption; higher values are good compromises between speed and memory consumption."); xbt_cfg_register_boolean("model-check/sparse_checkpoint", "no", _mc_cfg_cb_sparse_checkpoint, "Use sparse per-page snapshots."); - xbt_cfg_register_boolean("model-check/soft-dirty", "no", _mc_cfg_cb_soft_dirty, "Use sparse per-page snapshots."); xbt_cfg_register_boolean("model-check/ksm", "no", _mc_cfg_cb_ksm, "Kernel same-page merging"); xbt_cfg_register_string("model-check/property","", _mc_cfg_cb_property,