From: Andrei Gudkov Date: Mon, 28 Aug 2023 12:55:57 +0000 (+0800) Subject: migration/dirtyrate: Fix precision losses and g_usleep overshoot X-Git-Tag: v8.2.0-rc0~152^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3eb82637fbf8c0471990b59e6733fd4beb1f9939;p=thirdparty%2Fqemu.git migration/dirtyrate: Fix precision losses and g_usleep overshoot Signed-off-by: Andrei Gudkov Reviewed-by: Hyman Huang Message-Id: <8ddb0d40d143f77aab8f602bd494e01e5fa01614.1691161009.git.gudkov.andrei@huawei.com> Signed-off-by: Hyman Huang --- diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c index 84f1b0fb203..bccb3515e3c 100644 --- a/migration/dirtyrate.c +++ b/migration/dirtyrate.c @@ -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; @@ -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)