X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8454ea5fa71f9a14328f16aec13537e592912d48..4c3d4cccb2f5fb04a2bc157ca321e107711cca53:/src/mc/mc_page_snapshot.cpp diff --git a/src/mc/mc_page_snapshot.cpp b/src/mc/mc_page_snapshot.cpp index 7bb42f03d1..b180c4021c 100644 --- a/src/mc/mc_page_snapshot.cpp +++ b/src/mc/mc_page_snapshot.cpp @@ -1,6 +1,7 @@ /* MC interface: definitions that non-MC modules must see, but not the user */ -/* Copyright (c) 2014-2015. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2014-2015. The SimGrid Team. + * All rights reserved. */ /* 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. */ @@ -14,6 +15,9 @@ #include +#define SOFT_DIRTY_BIT_NUMBER 55 +#define SOFT_DIRTY (((uint64_t)1) << SOFT_DIRTY_BIT_NUMBER) + using simgrid::mc::remote; namespace simgrid { @@ -26,7 +30,8 @@ namespace mc { * @return Snapshot page numbers of this new snapshot */ PerPageCopy::PerPageCopy(PageStore& store, AddressSpace& as, - remote_ptr addr, std::size_t page_count) + 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); @@ -34,6 +39,13 @@ PerPageCopy::PerPageCopy(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; + } + 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"); @@ -69,7 +81,7 @@ extern "C" { * @param page_count Number of pages of the region * @param pagenos */ -void mc_restore_page_snapshot_region(mc_process_t process, +void mc_restore_page_snapshot_region(simgrid::mc::Process* process, void* start_addr, simgrid::mc::PerPageCopy const& pages_copy) { for (size_t i = 0; i != pages_copy.page_count(); ++i) { @@ -82,7 +94,7 @@ void mc_restore_page_snapshot_region(mc_process_t process, // ***** High level API -void mc_region_restore_sparse(mc_process_t process, mc_mem_region_t reg) +void mc_region_restore_sparse(simgrid::mc::Process* process, mc_mem_region_t reg) { xbt_assert(((reg->permanent_address().address()) & (xbt_pagesize-1)) == 0, "Not at the beginning of a page");