diff --git a/migration/ram.c b/migration/ram.c index 998ee96e63050599c7955b3a7b1549c5cd629665..bb829c9d38581256ac975f98c7311d1a1702b7c8 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -956,9 +956,11 @@ static void mig_throttle_guest_down(uint64_t bytes_dirty_period, uint64_t throttle_now = cpu_throttle_get_percentage(); uint64_t cpu_now, cpu_ideal, throttle_inc; + int new_throttle_pct; + /* We have not started throttling yet. Let's start it. */ if (!cpu_throttle_active()) { - cpu_throttle_set(pct_initial); + new_throttle_pct = pct_initial; } else { /* Throttling already on, just increase the rate */ if (!pct_tailslow) { @@ -971,8 +973,10 @@ static void mig_throttle_guest_down(uint64_t bytes_dirty_period, bytes_dirty_period); throttle_inc = MIN(cpu_now - cpu_ideal, pct_increment); } - cpu_throttle_set(MIN(throttle_now + throttle_inc, pct_max)); + new_throttle_pct = MIN(throttle_now + throttle_inc, pct_max); } + trace_migration_throttle(new_throttle_pct); + cpu_throttle_set(new_throttle_pct); } void mig_throttle_counter_reset(void) @@ -1460,7 +1464,6 @@ static void migration_trigger_throttle(RAMState *rs) (++rs->dirty_rate_high_cnt >= 2)) { rs->dirty_rate_high_cnt = 0; if (migrate_auto_converge()) { - trace_migration_throttle(); mig_throttle_guest_down(bytes_dirty_period, bytes_dirty_threshold); } else if (migrate_dirty_limit()) { diff --git a/migration/trace-events b/migration/trace-events index 246710f4886f128db570130235ab6705b2f9355a..7393d945962236458c42c220a40f91c04223a8df 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -91,7 +91,7 @@ get_queued_page_not_dirty(const char *block_name, uint64_t tmp_offset, unsigned migration_bitmap_sync_start(void) "" migration_bitmap_sync_end(uint64_t dirty_pages) "dirty_pages %" PRIu64 migration_bitmap_clear_dirty(char *str, uint64_t start, uint64_t size, unsigned long page) "rb %s start 0x%"PRIx64" size 0x%"PRIx64" page 0x%lx" -migration_throttle(void) "" +migration_throttle(int new_throttle_pct) "guest CPU throttled by %d%%" migration_dirty_limit_guest(int64_t dirtyrate) "guest dirty page rate limit %" PRIi64 " MB/s" ram_discard_range(const char *rbname, uint64_t start, size_t len) "%s: start: %" PRIx64 " %zx" ram_load_loop(const char *rbname, uint64_t addr, int flags, void *host) "%s: addr: 0x%" PRIx64 " flags: 0x%x host: %p"