Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
vm->destroy is not at kernel level ...
[simgrid.git] / src / msg / msg_vm.cpp
index 06abe65..15f68ac 100644 (file)
@@ -31,7 +31,6 @@ typedef s_dirty_page* dirty_page_t;
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_vm, msg, "Cloud-oriented parts of the MSG API");
 
-/* **** ******** GENERAL ********* **** */
 const char* MSG_vm_get_name(msg_vm_t vm)
 {
   return vm->getCname();
@@ -71,7 +70,7 @@ size_t MSG_vm_get_ramsize(msg_vm_t vm)
 /* **** Check state of a VM **** */
 static inline int __MSG_vm_is_state(msg_vm_t vm, e_surf_vm_state_t state)
 {
-  return vm->pimpl_vm_ != nullptr && vm->pimpl_vm_->getState() == state;
+  return vm->pimpl_vm_ != nullptr && vm->getState() == state;
 }
 
 /** @brief Returns whether the given VM has just created, not running.
@@ -124,9 +123,6 @@ msg_vm_t MSG_vm_create(msg_host_t pm, const char* name, int coreAmount, int rams
 
   msg_vm_t vm = new simgrid::s4u::VirtualMachine(name, pm, coreAmount, static_cast<sg_size_t>(ramsize) * 1024 * 1024);
   s_vm_params_t params;
-  params.devsize      = 0;
-  params.skip_stage1  = 0;
-  params.skip_stage2  = 0;
   params.max_downtime = 0.03;
   params.mig_speed    = static_cast<double>(mig_netspeed) * 1024 * 1024; // mig_speed
   params.dp_intensity = static_cast<double>(dp_intensity) / 100;
@@ -184,7 +180,7 @@ void MSG_vm_destroy(msg_vm_t vm)
     MSG_vm_shutdown(vm);
 
   /* Then, destroy the VM object */
-  simgrid::simix::kernelImmediate([vm]() { vm->destroy(); });
+  vm->destroy();
 
   if (TRACE_msg_vm_is_enabled()) {
     container_t container = simgrid::instr::Container::byName(vm->getName());
@@ -291,11 +287,11 @@ static int migration_rx_fun(int argc, char *argv[])
   simgrid::simix::kernelImmediate([vm, dst_pm]() {
     /* Update the vm location */
     /* precopy migration makes the VM temporally paused */
-    xbt_assert(vm->pimpl_vm_->getState() == SURF_VM_STATE_SUSPENDED);
+    xbt_assert(vm->getState() == SURF_VM_STATE_SUSPENDED);
 
     /* Update the vm location and resume it */
     vm->pimpl_vm_->setPm(dst_pm);
-    vm->pimpl_vm_->resume();
+    vm->resume();
   });
 
 
@@ -345,7 +341,7 @@ static int migration_rx_fun(int argc, char *argv[])
 
 static void start_dirty_page_tracking(msg_vm_t vm)
 {
-  vm->pimpl_vm_->dp_enabled = 1;
+  vm->pimpl_vm_->dp_enabled = true;
   if (vm->pimpl_vm_->dp_objs.empty())
     return;
 
@@ -360,7 +356,7 @@ static void start_dirty_page_tracking(msg_vm_t vm)
 
 static void stop_dirty_page_tracking(msg_vm_t vm)
 {
-  vm->pimpl_vm_->dp_enabled = 0;
+  vm->pimpl_vm_->dp_enabled = false;
 }
 
 static double get_computed(const std::string& key, msg_vm_t vm, dirty_page_t dp, double remaining, double clock)
@@ -520,22 +516,20 @@ static int migration_tx_fun(int argc, char *argv[])
   // Note that the ms structure has been allocated in do_migration and hence should be freed in the same function ;)
   migration_session* ms = static_cast<migration_session*>(MSG_process_get_data(MSG_process_self()));
 
-  double host_speed = ms->vm->pimpl_vm_->getPm()->getSpeed();
+  double host_speed = ms->vm->getPm()->getSpeed();
   s_vm_params_t params;
   ms->vm->getParameters(&params);
   const sg_size_t ramsize   = ms->vm->getRamsize();
-  const sg_size_t devsize   = params.devsize;
-  const int skip_stage1     = params.skip_stage1;
-  int skip_stage2           = params.skip_stage2;
   const double dp_rate      = host_speed ? (params.mig_speed * params.dp_intensity) / host_speed : 1;
   const double dp_cap       = params.dp_cap;
   const double mig_speed    = params.mig_speed;
   double max_downtime       = params.max_downtime;
 
   double mig_timeout = 10000000.0;
+  bool skip_stage2   = false;
 
-  double remaining_size = static_cast<double>(ramsize + devsize);
-  double threshold = 0.0;
+  size_t remaining_size = ramsize;
+  size_t threshold      = 0.0;
 
   /* check parameters */
   if (ramsize == 0)
@@ -547,48 +541,44 @@ static int migration_tx_fun(int argc, char *argv[])
   }
 
   /* Stage1: send all memory pages to the destination. */
-  XBT_DEBUG("mig-stage1: remaining_size %f", remaining_size);
+  XBT_DEBUG("mig-stage1: remaining_size %zu", remaining_size);
   start_dirty_page_tracking(ms->vm);
 
   double computed_during_stage1 = 0;
-  if (not skip_stage1) {
-    double clock_prev_send = MSG_get_clock();
-
-    try {
-      /* At stage 1, we do not need timeout. We have to send all the memory pages even though the duration of this
-       * transfer exceeds the timeout value. */
-      XBT_VERB("Stage 1: Gonna send %llu bytes", ramsize);
-      sg_size_t sent = send_migration_data(ms->vm, ms->src_pm, ms->dst_pm, ramsize, ms->mbox, 1, 0, mig_speed, -1);
-      remaining_size -= sent;
-      computed_during_stage1 = lookup_computed_flop_counts(ms->vm, 1, 0);
-
-      if (sent < ramsize) {
-        XBT_VERB("mig-stage1: timeout, force moving to stage 3");
-        skip_stage2 = 1;
-      } else if (sent > ramsize)
-        XBT_CRITICAL("bug");
+  double clock_prev_send        = MSG_get_clock();
 
-    }
-    catch (xbt_ex& e) {
-      //hostfailure (if you want to know whether this is the SRC or the DST check directly in send_migration_data code)
-      // Stop the dirty page tracking an return (there is no memory space to release)
-      stop_dirty_page_tracking(ms->vm);
-      return 0;
-    }
-
-    double clock_post_send = MSG_get_clock();
-    mig_timeout -= (clock_post_send - clock_prev_send);
-    if (mig_timeout < 0) {
-      XBT_VERB("The duration of stage 1 exceeds the timeout value, skip stage 2");
-      skip_stage2 = 1;
-    }
+  try {
+    /* At stage 1, we do not need timeout. We have to send all the memory pages even though the duration of this
+     * transfer exceeds the timeout value. */
+    XBT_VERB("Stage 1: Gonna send %llu bytes", ramsize);
+    sg_size_t sent = send_migration_data(ms->vm, ms->src_pm, ms->dst_pm, ramsize, ms->mbox, 1, 0, mig_speed, -1);
+    remaining_size -= sent;
+    computed_during_stage1 = lookup_computed_flop_counts(ms->vm, 1, 0);
+
+    if (sent < ramsize) {
+      XBT_VERB("mig-stage1: timeout, force moving to stage 3");
+      skip_stage2 = true;
+    } else if (sent > ramsize)
+      XBT_CRITICAL("bug");
+
+  } catch (xbt_ex& e) {
+    // hostfailure (if you want to know whether this is the SRC or the DST check directly in send_migration_data code)
+    // Stop the dirty page tracking an return (there is no memory space to release)
+    stop_dirty_page_tracking(ms->vm);
+    return 0;
+  }
 
-    /* estimate bandwidth */
-    double bandwidth = ramsize / (clock_post_send - clock_prev_send);
-    threshold        = bandwidth * max_downtime;
-    XBT_DEBUG("actual bandwidth %f (MB/s), threshold %f", bandwidth / 1024 / 1024, threshold);
+  double clock_post_send = MSG_get_clock();
+  mig_timeout -= (clock_post_send - clock_prev_send);
+  if (mig_timeout < 0) {
+    XBT_VERB("The duration of stage 1 exceeds the timeout value, skip stage 2");
+    skip_stage2 = true;
   }
 
+  /* estimate bandwidth */
+  double bandwidth = ramsize / (clock_post_send - clock_prev_send);
+  threshold        = bandwidth * max_downtime;
+  XBT_DEBUG("actual bandwidth %f (MB/s), threshold %zu", bandwidth / 1024 / 1024, threshold);
 
   /* Stage2: send update pages iteratively until the size of remaining states becomes smaller than threshold value. */
   if (not skip_stage2) {
@@ -610,7 +600,7 @@ static int migration_tx_fun(int argc, char *argv[])
 
       /* Check whether the remaining size is below the threshold value. If so, move to stage 3. */
       remaining_size += updated_size;
-      XBT_DEBUG("mig-stage2.%d: remaining_size %f (%s threshold %f)", stage2_round, remaining_size,
+      XBT_DEBUG("mig-stage2.%d: remaining_size %zu (%s threshold %zu)", stage2_round, remaining_size,
                 (remaining_size < threshold) ? "<" : ">", threshold);
       if (remaining_size < threshold)
         break;
@@ -634,7 +624,7 @@ static int migration_tx_fun(int argc, char *argv[])
         /* timeout did not happen */
         double bandwidth = updated_size / (clock_post_send - clock_prev_send);
         threshold        = bandwidth * max_downtime;
-        XBT_DEBUG("actual bandwidth %f, threshold %f", bandwidth / 1024 / 1024, threshold);
+        XBT_DEBUG("actual bandwidth %f, threshold %zu", bandwidth / 1024 / 1024, threshold);
         remaining_size -= sent;
         stage2_round += 1;
         mig_timeout -= (clock_post_send - clock_prev_send);
@@ -657,7 +647,7 @@ static int migration_tx_fun(int argc, char *argv[])
   }
 
   /* Stage3: stop the VM and copy the rest of states. */
-  XBT_DEBUG("mig-stage3: remaining_size %f", remaining_size);
+  XBT_DEBUG("mig-stage3: remaining_size %zu", remaining_size);
   simgrid::vm::VirtualMachineImpl* pimpl = ms->vm->pimpl_vm_;
   pimpl->setState(SURF_VM_STATE_RUNNING); // FIXME: this bypass of the checks in suspend() is not nice
   pimpl->isMigrating = false;             // FIXME: this bypass of the checks in suspend() is not nice
@@ -665,14 +655,13 @@ static int migration_tx_fun(int argc, char *argv[])
   stop_dirty_page_tracking(ms->vm);
 
   try {
-    XBT_DEBUG("Stage 3: Gonna send %f bytes", remaining_size);
-    send_migration_data(ms->vm, ms->src_pm, ms->dst_pm, static_cast<sg_size_t>(remaining_size), ms->mbox, 3, 0,
-                        mig_speed, -1);
+    XBT_DEBUG("Stage 3: Gonna send %zu bytes", remaining_size);
+    send_migration_data(ms->vm, ms->src_pm, ms->dst_pm, remaining_size, ms->mbox, 3, 0, mig_speed, -1);
   }
   catch(xbt_ex& e) {
     //hostfailure (if you want to know whether this is the SRC or the DST check directly in send_migration_data code)
     // Stop the dirty page tracking an return (there is no memory space to release)
-    ms->vm->pimpl_vm_->resume();
+    ms->vm->resume();
     return 0;
   }
 
@@ -704,7 +693,7 @@ void MSG_vm_migrate(msg_vm_t vm, msg_host_t dst_pm)
    * The second one would be easier.
    */
 
-  msg_host_t src_pm = vm->pimpl_vm_->getPm();
+  msg_host_t src_pm = vm->getPm();
 
   if (src_pm->isOff())
     THROWF(vm_error, 0, "Cannot migrate VM '%s' from host '%s', which is offline.", vm->getCname(), src_pm->getCname());
@@ -772,11 +761,7 @@ void MSG_vm_migrate(msg_vm_t vm, msg_host_t dst_pm)
  */
 void MSG_vm_suspend(msg_vm_t vm)
 {
-  smx_actor_t issuer = SIMIX_process_self();
-  simgrid::simix::kernelImmediate([vm, issuer]() { vm->pimpl_vm_->suspend(issuer); });
-
-  XBT_DEBUG("vm_suspend done");
-
+  vm->suspend();
   if (TRACE_msg_vm_is_enabled()) {
     simgrid::instr::StateType* state = simgrid::instr::Container::byName(vm->getName())->getState("MSG_VM_STATE");
     state->addEntityValue("suspend", "1 0 0"); // suspend is red
@@ -791,8 +776,7 @@ void MSG_vm_suspend(msg_vm_t vm)
  */
 void MSG_vm_resume(msg_vm_t vm)
 {
-  vm->pimpl_vm_->resume();
-
+  vm->resume();
   if (TRACE_msg_vm_is_enabled())
     simgrid::instr::Container::byName(vm->getName())->getState("MSG_VM_STATE")->popEvent();
 }