A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[mc] Bring back soft-dirty tracking from the dead 💀
[simgrid.git]
/
src
/
mc
/
mc_page_snapshot.cpp
diff --git
a/src/mc/mc_page_snapshot.cpp
b/src/mc/mc_page_snapshot.cpp
index
91dfcbd
..
b180c40
100644
(file)
--- 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 */
/* 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. */
/* 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 <xbt/mmalloc.h>
#include <xbt/mmalloc.h>
+#define SOFT_DIRTY_BIT_NUMBER 55
+#define SOFT_DIRTY (((uint64_t)1) << SOFT_DIRTY_BIT_NUMBER)
+
using simgrid::mc::remote;
namespace simgrid {
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,
* @return Snapshot page numbers of this new snapshot
*/
PerPageCopy::PerPageCopy(PageStore& store, AddressSpace& as,
- remote_ptr<void> addr, std::size_t page_count)
+ remote_ptr<void> addr, std::size_t page_count,
+ const size_t* ref_page_numbers, const std::uint64_t* pagemap)
{
store_ = &store;
this->pagenos_.resize(page_count);
{
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) {
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<void> page = remote(addr.address() + (i << xbt_pagebits));
xbt_assert(mc_page_offset((void*)page.address())==0,
"Not at the beginning of a page");
remote_ptr<void> page = remote(addr.address() + (i << xbt_pagebits));
xbt_assert(mc_page_offset((void*)page.address())==0,
"Not at the beginning of a page");