migration: set bytes_xfer_* outside of autoconverge logic

The bytes_xfer_now/prev counters are only used by the auto convergence
logic. However, they are used alongside the dirty_pages_rate counter,
which is calculated (and required) outside of this logic. The problem
with this approach is that if the auto convergence capability is changed
while a migration is ongoing, the relationship of the counters will be
broken.

This moves the management of bytes_xfer_now/prev counters outside of the
auto convergence logic to address this issue.

Signed-off-by: Felipe Franciosi <felipe@nutanix.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
Felipe Franciosi 2017-05-24 17:10:02 +01:00 committed by Juan Quintela
parent d693c6f10f
commit d2a4d85a8a

View File

@ -697,6 +697,7 @@ static void migration_bitmap_sync(RAMState *rs)
/* calculate period counters */ /* calculate period counters */
rs->dirty_pages_rate = rs->num_dirty_pages_period * 1000 rs->dirty_pages_rate = rs->num_dirty_pages_period * 1000
/ (end_time - rs->time_last_bitmap_sync); / (end_time - rs->time_last_bitmap_sync);
bytes_xfer_now = ram_bytes_transferred();
if (migrate_auto_converge()) { if (migrate_auto_converge()) {
/* The following detection logic can be refined later. For now: /* The following detection logic can be refined later. For now:
@ -704,7 +705,6 @@ static void migration_bitmap_sync(RAMState *rs)
amount of bytes that just got transferred since the last time we amount of bytes that just got transferred since the last time we
were in this routine. If that happens twice, start or increase were in this routine. If that happens twice, start or increase
throttling */ throttling */
bytes_xfer_now = ram_bytes_transferred();
if ((rs->num_dirty_pages_period * TARGET_PAGE_SIZE > if ((rs->num_dirty_pages_period * TARGET_PAGE_SIZE >
(bytes_xfer_now - rs->bytes_xfer_prev) / 2) && (bytes_xfer_now - rs->bytes_xfer_prev) / 2) &&
@ -713,7 +713,6 @@ static void migration_bitmap_sync(RAMState *rs)
rs->dirty_rate_high_cnt = 0; rs->dirty_rate_high_cnt = 0;
mig_throttle_guest_down(); mig_throttle_guest_down();
} }
rs->bytes_xfer_prev = bytes_xfer_now;
} }
if (migrate_use_xbzrle()) { if (migrate_use_xbzrle()) {
@ -730,6 +729,7 @@ static void migration_bitmap_sync(RAMState *rs)
/* reset period counters */ /* reset period counters */
rs->time_last_bitmap_sync = end_time; rs->time_last_bitmap_sync = end_time;
rs->num_dirty_pages_period = 0; rs->num_dirty_pages_period = 0;
rs->bytes_xfer_prev = bytes_xfer_now;
} }
if (migrate_use_events()) { if (migrate_use_events()) {
qapi_event_send_migration_pass(rs->bitmap_sync_count, NULL); qapi_event_send_migration_pass(rs->bitmap_sync_count, NULL);