X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f233a6d6c7d459205695d95e840063beba932147..4c3d4cccb2f5fb04a2bc157ca321e107711cca53:/src/mc/mc_page_snapshot.cpp diff --git a/src/mc/mc_page_snapshot.cpp b/src/mc/mc_page_snapshot.cpp index 91dfcbd961..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");