Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Support for mmap-able snapthots
authorGabriel Corona <gabriel.corona@loria.fr>
Thu, 1 Oct 2015 08:45:19 +0000 (10:45 +0200)
committerGabriel Corona <gabriel.corona@loria.fr>
Fri, 2 Oct 2015 11:15:18 +0000 (13:15 +0200)
This will be used for KSM-friendly snapshots.

src/mc/RegionSnapshot.cpp
src/mc/RegionSnapshot.hpp
src/mc/mc_checkpoint.cpp
src/mc/mc_snapshot.h

index 0bcdd39..634aadc 100644 (file)
@@ -4,6 +4,8 @@
 /* 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. */
 
+#include <sys/mman.h>
+
 #include "mc/mc.h"
 #include "mc_snapshot.h"
 #include "RegionSnapshot.hpp"
@@ -33,12 +35,24 @@ const char* to_cstr(RegionType region)
   }
 }
 
+void data_deleter::operator()(void* p) const
+{
+  switch(type_) {
+  case Free:
+    free(p);
+    break;
+  case Munmap:
+    munmap(p, size_);
+    break;
+  }
+}
+
 RegionSnapshot dense_region(
   RegionType region_type,
   void *start_addr, void* permanent_addr, size_t size)
 {
-  std::vector<char> data(size);
-  mc_model_checker->process().read_bytes(data.data(), size,
+  simgrid::mc::RegionSnapshot::flat_data_ptr data((char*) malloc(size));
+  mc_model_checker->process().read_bytes(data.get(), size,
     remote(permanent_addr),
     simgrid::mc::ProcessIndexDisabled);
 
@@ -47,7 +61,7 @@ RegionSnapshot dense_region(
   region.flat_data(std::move(data));
 
   XBT_DEBUG("New region : type : %s, data : %p (real addr %p), size : %zu",
-            to_cstr(region_type), region.flat_data().data(), permanent_addr, size);
+            to_cstr(region_type), region.flat_data(), permanent_addr, size);
   return std::move(region);
 }
 
index e427a29..975bd26 100644 (file)
@@ -99,6 +99,21 @@ enum class StorageType {
   Privatized = 3
 };
 
+class data_deleter {
+public:
+  enum Type {
+    Free,
+    Munmap
+  };
+private:
+  Type type_;
+  std::size_t size_;
+public:
+  data_deleter() : type_(Free) {}
+  data_deleter(Type type, std::size_t size) : type_(type), size_(size) {}
+  void operator()(void* p) const;
+};
+
 /** @brief Copy/snapshot of a given memory region
  *
  *  Different types of region snapshot storage types exist:
@@ -123,6 +138,8 @@ class RegionSnapshot {
   static const StorageType FlatData = StorageType::Flat;
   static const StorageType ChunkedData = StorageType::Chunked;
   static const StorageType PrivatizedData = StorageType::Privatized;
+public:
+  typedef std::unique_ptr<char[], data_deleter> flat_data_ptr;
 private:
   RegionType region_type_;
   StorageType storage_type_;
@@ -145,7 +162,7 @@ private:
    * */
   void *permanent_addr_;
 
-  std::vector<char> flat_data_;
+  flat_data_ptr flat_data_;
   PerPageCopy page_numbers_;
   std::vector<RegionSnapshot> privatized_regions_;
 public:
@@ -204,7 +221,7 @@ public:
     storage_type_ = NoData;
     privatized_regions_.clear();
     page_numbers_.clear();
-    flat_data_.clear();
+    flat_data_.reset();
     object_info_ = nullptr;
     start_addr_ = nullptr;
     size_ = 0;
@@ -214,24 +231,24 @@ public:
   void clear_data()
   {
     storage_type_ = NoData;
-    flat_data_.clear();
+    flat_data_.reset();
     page_numbers_.clear();
     privatized_regions_.clear();
   }
   
-  void flat_data(std::vector<char> data)
+  void flat_data(flat_data_ptr data)
   {
     storage_type_ = FlatData;
     flat_data_ = std::move(data);
     page_numbers_.clear();
     privatized_regions_.clear();
   }
-  std::vector<char> const& flat_data() const { return flat_data_; }
+  const char* flat_data() const { return flat_data_.get(); }
 
   void page_data(PerPageCopy page_data)
   {
     storage_type_ = ChunkedData;
-    flat_data_.clear();
+    flat_data_.reset();
     page_numbers_ = std::move(page_data);
     privatized_regions_.clear();
   }
@@ -240,7 +257,7 @@ public:
   void privatized_data(std::vector<RegionSnapshot> data)
   {
     storage_type_ = PrivatizedData;
-    flat_data_.clear();
+    flat_data_.reset();
     page_numbers_.clear();
     privatized_regions_ = std::move(data);
   }
index b5aba8c..a06d5f5 100644 (file)
@@ -63,7 +63,7 @@ static void MC_region_restore(mc_mem_region_t region)
     break;
 
   case simgrid::mc::StorageType::Flat:
-    mc_model_checker->process().write_bytes(region->flat_data().data(),
+    mc_model_checker->process().write_bytes(region->flat_data(),
       region->size(), region->permanent_address());
     break;
 
index 7ef1870..72965f4 100644 (file)
@@ -54,7 +54,7 @@ void* mc_translate_address_region(uintptr_t addr, mc_mem_region_t region, int pr
   case simgrid::mc::StorageType::Flat:
     {
       uintptr_t offset = (uintptr_t) addr - (uintptr_t) region->start().address();
-      return (void *) ((uintptr_t) region->flat_data().data() + offset);
+      return (void *) ((uintptr_t) region->flat_data() + offset);
     }
 
   case simgrid::mc::StorageType::Chunked:
@@ -227,7 +227,7 @@ const void* MC_region_read(mc_mem_region_t region, void* target, const void* add
     xbt_die("Storage type not supported");
 
   case simgrid::mc::StorageType::Flat:
-    return (char*) region->flat_data().data() + offset;
+    return (char*) region->flat_data() + offset;
 
   case simgrid::mc::StorageType::Chunked:
     {