#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");
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 */
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;
}
/*
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);
*/
xbt_lib_unset(host_lib, name, SURF_CPU_LEVEL, 0);
xbt_lib_unset(host_lib, name, ROUTING_HOST_LEVEL, 0);
- xbt_lib_unset(host_lib, name, SURF_STORAGE_LEVEL, 0);
xbt_lib_unset(host_lib, name, SURF_WKS_LEVEL, 0);
+ /* TODO: comment out when VM stroage is implemented. */
+ // xbt_lib_unset(host_lib, name, SURF_STORAGE_LEVEL, 0);
+
/* Free the cpu_action of the VM. */
int ret = surf_cpu_model_pm->action_unref(vm_ws->cpu_action);
{
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;
}
+
+/* In the real world, processes on the guest operating system will be somewhat
+ * degraded due to virtualization overhead. The total CPU share that these
+ * processes get is smaller than that of the VM process gets on a host
+ * operating system. */
+const double virt_overhead = 0.95;
+
static double vm_ws_share_resources(surf_model_t workstation_model, double now)
{
/* TODO: udpate action's cost with the total cost of processes on the VM. */
-
/* 0. Make sure that we already calculated the resource share at the physical
* machine layer. */
{
workstation_CLM03_t ws_clm03 = ind_host[SURF_WKS_LEVEL];
cpu_Cas01_t cpu_cas01 = ind_host[SURF_CPU_LEVEL];
- /* skip if it is not a virtual machine */
if (!ws_clm03)
continue;
+ /* skip if it is not a virtual machine */
if (ws_clm03->generic_resource.model != surf_vm_workstation_model)
continue;
xbt_assert(cpu_cas01, "cpu-less workstation");
XBT_DEBUG("assign %f to vm %s @ pm %s", solved_value,
ws_clm03->generic_resource.name, ws_vm2013->sub_ws->generic_resource.name);
- cpu_cas01->constraint->bound = solved_value;
+ // TODO: check lmm_update_constraint_bound() works fine instead of the below manual substitution.
+ // cpu_cas01->constraint->bound = solved_value;
+ surf_model_t cpu_model = cpu_cas01->generic_resource.model;
+ xbt_assert(cpu_model == surf_cpu_model_vm);
+ lmm_system_t vcpu_system = cpu_model->model_private->maxmin_system;
+ lmm_update_constraint_bound(vcpu_system, cpu_cas01->constraint, virt_overhead * solved_value);
}
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);
}
-
/* 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));
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);
model->name = "Virtual Workstation";
model->type = SURF_MODEL_TYPE_VM_WORKSTATION;
- // model->action_unref = ws_action_unref;
+ model->action_unref = ws_action_unref;
model->action_cancel = vm_ws_action_cancel;
// model->action_state_set = ws_action_state_set;
// #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
model->extension.vm_workstation.set_state = vm_ws_set_state;
model->extension.vm_workstation.get_state = vm_ws_get_state;
model->extension.vm_workstation.migrate = vm_ws_migrate;
- model->extension.vm_workstation.get_pm = vm_ws_get_pm;
model->extension.vm_workstation.destroy = vm_ws_destroy;
model->extension.vm_workstation.suspend = vm_ws_suspend;
model->extension.vm_workstation.resume = vm_ws_resume;
model->extension.vm_workstation.save = vm_ws_save;
model->extension.vm_workstation.restore = vm_ws_restore;
+ model->extension.vm_workstation.get_pm = vm_ws_get_pm;
+
+ model->extension.workstation.set_params = ws_set_params;
+ model->extension.workstation.get_params = ws_get_params;
surf_vm_workstation_model = model;
}