Skip to content

Commit

Permalink
migration/dirtyrate: Fix precision losses and g_usleep overshoot
Browse files Browse the repository at this point in the history
Signed-off-by: Andrei Gudkov <gudkov.andrei@huawei.com>
Reviewed-by: Hyman Huang <yong.huang@smartx.com>
Message-Id: <8ddb0d40d143f77aab8f602bd494e01e5fa01614.1691161009.git.gudkov.andrei@huawei.com>
Signed-off-by: Hyman Huang <yong.huang@smartx.com>
  • Loading branch information
Andrei Gudkov authored and HuangSuiXiao committed Aug 29, 2023
1 parent 19b14ce commit 3eb8263
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions migration/dirtyrate.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ static int64_t dirty_stat_wait(int64_t msec, int64_t initial_time)
msec = current_time - initial_time;
} else {
g_usleep((msec + initial_time - current_time) * 1000);
/* g_usleep may overshoot */
msec = qemu_clock_get_ms(QEMU_CLOCK_REALTIME) - initial_time;
}

return msec;
Expand All @@ -77,9 +79,13 @@ static int64_t do_calculate_dirtyrate(DirtyPageRecord dirty_pages,
{
uint64_t increased_dirty_pages =
dirty_pages.end_pages - dirty_pages.start_pages;
uint64_t memory_size_MiB = qemu_target_pages_to_MiB(increased_dirty_pages);

return memory_size_MiB * 1000 / calc_time_ms;
/*
* multiply by 1000ms/s _before_ converting down to megabytes
* to avoid losing precision
*/
return qemu_target_pages_to_MiB(increased_dirty_pages * 1000) /
calc_time_ms;
}

void global_dirty_log_change(unsigned int flag, bool start)
Expand Down

0 comments on commit 3eb8263

Please sign in to comment.