static void send_migration_data(const char *vm_name, const char *src_pm_name, const char *dst_pm_name,
- double size, char *mbox, int stage, int stage2_round)
+ double size, char *mbox, int stage, int stage2_round, double mig_speed)
{
char *task_name = get_mig_task_name(vm_name, src_pm_name, dst_pm_name, stage);
msg_task_t task = MSG_task_create(task_name, 0, size, NULL);
- msg_error_t ret = MSG_task_send(task, mbox);
+
+ msg_error_t ret;
+ if (mig_speed > 0)
+ ret = MSG_task_send_bounded(task, mbox, mig_speed);
+ else
+ ret = MSG_task_send(task, mbox);
xbt_assert(ret == MSG_OK);
if (stage == 2)
const double max_downtime = params.max_downtime;
const double dp_rate = params.dp_rate;
const double dp_cap = params.dp_cap;
+ const double mig_speed = params.mig_speed;
double remaining_size = ramsize + devsize;
double threshold = max_downtime * 125 * 1000 * 1000;
/* Stage1: send all memory pages to the destination. */
start_dirty_page_tracking(vm);
- send_migration_data(vm_name, src_pm_name, dst_pm_name, ramsize, mbox, 1, 0);
+ send_migration_data(vm_name, src_pm_name, dst_pm_name, ramsize, mbox, 1, 0, mig_speed);
remaining_size -= ramsize;
if (remaining_size < threshold)
break;
- send_migration_data(vm_name, src_pm_name, dst_pm_name, updated_size, mbox, 2, stage2_round);
+ send_migration_data(vm_name, src_pm_name, dst_pm_name, updated_size, mbox, 2, stage2_round, mig_speed);
remaining_size -= updated_size;
stage2_round += 1;
simcall_vm_suspend(vm);
stop_dirty_page_tracking(vm);
- send_migration_data(vm_name, src_pm_name, dst_pm_name, remaining_size, mbox, 3, 0);
+ send_migration_data(vm_name, src_pm_name, dst_pm_name, remaining_size, mbox, 3, 0, mig_speed);
xbt_free(mbox);
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(?), %d", ws_vm2013->cpu_action->remains);
+ 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");