Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Make hypervisor compile with compile_warnings=ON
[simgrid.git] / src / surf / vm_workstation.c
index fe7d202..a3c5730 100644 (file)
@@ -11,8 +11,8 @@
 #include "surf/surf_resource.h"
 #include "simgrid/sg_config.h"
 #include "vm_workstation_private.h"
-#include "surf/cpu_cas01_private.h"
-#include "surf/maxmin_private.h"
+#include "cpu_cas01_private.h"
+#include "maxmin_private.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_vm_workstation, surf,
                                 "Logging specific to the SURF VM workstation module");
@@ -108,8 +108,6 @@ static void vm_ws_migrate(void *ind_vm, void *ind_dst_pm)
    xbt_assert(ws_vm2013);
    xbt_assert(ws_clm03_dst);
 
-   ws_vm2013->current_state = SURF_VM_STATE_MIGRATING;
-
    /* do something */
 
    /* update net_elm with that of the destination physical host */
@@ -126,10 +124,35 @@ static void vm_ws_migrate(void *ind_vm, void *ind_dst_pm)
 
    ws_vm2013->sub_ws = ws_clm03_dst;
 
+   /* Update vcpu's action for the new pm */
+   {
+#if 0
+     XBT_INFO("cpu_action->remains %g", ws_vm2013->cpu_action->remains);
+     XBT_INFO("cost %f remains %f start %f finish %f", ws_vm2013->cpu_action->cost,
+         ws_vm2013->cpu_action->remains,
+         ws_vm2013->cpu_action->start,
+         ws_vm2013->cpu_action->finish
+         );
+     XBT_INFO("cpu_action state %d", surf_action_state_get(ws_vm2013->cpu_action));
+#endif
+
+     /* create a cpu action bound to the pm model at the destination. */
+     surf_action_t new_cpu_action = surf_cpu_model_pm->extension.cpu.execute(ind_dst_pm, 0);
+
+     e_surf_action_state_t state = surf_action_state_get(ws_vm2013->cpu_action);
+     if (state != SURF_ACTION_DONE)
+       XBT_CRITICAL("FIXME: may need a proper handling, %d", state);
+     if (ws_vm2013->cpu_action->remains > 0)
+       XBT_CRITICAL("FIXME: need copy the state(?), %f", ws_vm2013->cpu_action->remains);
+
+     int ret = surf_cpu_model_pm->action_unref(ws_vm2013->cpu_action);
+     xbt_assert(ret == 1, "Bug: some resource still remains");
+
+     ws_vm2013->cpu_action = new_cpu_action;
+   }
+
    XBT_DEBUG("migrate VM(%s): change net_elm (%p to %p)", vm_name, old_net_elm, new_net_elm);
    XBT_DEBUG("migrate VM(%s): change PM (%s to %s)", vm_name, pm_name_src, pm_name_dst);
-
-   ws_vm2013->current_state = SURF_VM_STATE_RUNNING;
 }
 
 /*
@@ -144,7 +167,6 @@ static void vm_ws_destroy(void *ind_vm_workstation)
        workstation_VM2013_t vm_ws = surf_workstation_resource_priv(ind_vm_workstation);
   cpu_Cas01_t cpu = surf_cpu_resource_priv(ind_vm_workstation);
        const char *name = vm_ws->ws.generic_resource.name;
-  XBT_INFO("%s", name);
 
        xbt_assert(vm_ws);
        xbt_assert(vm_ws->ws.generic_resource.model == surf_vm_workstation_model);
@@ -198,7 +220,6 @@ static void vm_ws_suspend(void *ind_vm_ws)
 {
   workstation_VM2013_t vm_ws = surf_workstation_resource_priv(ind_vm_ws);
 
-  XBT_INFO("vm %p suspend", ind_vm_ws);
   surf_action_suspend(vm_ws->cpu_action);
 
   vm_ws->current_state = SURF_VM_STATE_SUSPENDED;
@@ -359,16 +380,17 @@ static double vm_ws_share_resources(surf_model_t workstation_model, double now)
       continue;
 
     /* It is a virtual machine, so we can cast it to workstation_VM2013_t */
-    workstation_VM2013_t ws_vm2013 = (workstation_VM2013_t) ws_clm03;
     {
-      void *ind_sub_host = xbt_lib_get_elm_or_null(host_lib, ws_vm2013->sub_ws->generic_resource.name);
+#if 0
+      workstation_VM2013_t ws_vm2013 = (workstation_VM2013_t) ws_clm03;            
       XBT_INFO("cost %f remains %f start %f finish %f", ws_vm2013->cpu_action->cost,
           ws_vm2013->cpu_action->remains,
           ws_vm2013->cpu_action->start,
           ws_vm2013->cpu_action->finish
           );
-
+#endif
 #if 0
+      void *ind_sub_host = xbt_lib_get_elm_or_null(host_lib, ws_vm2013->sub_ws->generic_resource.name);      
       surf_cpu_model_pm->action_unref(ws_vm2013->cpu_action);
       /* FIXME: this means busy loop? */
       // ws_vm2013->cpu_action = surf_cpu_model_pm->extension.cpu.execute(ind_sub_host, GUESTOS_NOISE);
@@ -397,9 +419,8 @@ static void *vm_ws_get_pm(void *ind_vm_ws)
 }
 
 
-
 /* Adding a task to a VM updates the VCPU task on its physical machine. */
-surf_action_t vm_ws_execute(void *workstation, double size)
+static surf_action_t vm_ws_execute(void *workstation, double size)
 {
   surf_resource_t ws = ((surf_resource_t) surf_workstation_resource_priv(workstation));
 
@@ -409,7 +430,7 @@ surf_action_t vm_ws_execute(void *workstation, double size)
   double old_cost = vm_ws->cpu_action->cost;
   double new_cost = old_cost + size;
 
-  XBT_INFO("VM(%s)@PM(%s): update dummy action's cost (%f -> %f)",
+  XBT_DEBUG("VM(%s)@PM(%s): update dummy action's cost (%f -> %f)",
       ws->name, vm_ws->sub_ws->generic_resource.name,
       old_cost, new_cost);
 
@@ -454,7 +475,7 @@ static void surf_vm_workstation_model_init_internal(void)
 // #ifdef HAVE_TRACING
 //   model->set_category     = ws_action_set_category;
 // #endif
-//   model->get_remains      = ws_action_get_remains;
+  model->get_remains      = ws_action_get_remains;
 // #ifdef HAVE_LATENCY_BOUND_TRACKING
 //   model->get_latency_limited = ws_get_latency_limited;
 // #endif