On Fri, Dec 03, 2021 at 09:39:45AM +0800, huang...@chinatelecom.cn wrote: > +static void dirtylimit_calc_func(void) > +{ > + CPUState *cpu; > + DirtyPageRecord *dirty_pages; > + int64_t start_time, end_time, calc_time; > + DirtyRateVcpu rate; > + int i = 0; > + > + dirty_pages = g_malloc0(sizeof(*dirty_pages) * > + dirtylimit_calc_state->data.nvcpu); > + > + CPU_FOREACH(cpu) { > + record_dirtypages(dirty_pages, cpu, true); > + } > + > + start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); > + g_usleep(DIRTYLIMIT_CALC_TIME_MS * 1000); > + end_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); > + calc_time = end_time - start_time; > + > + qemu_mutex_lock_iothread(); > + memory_global_dirty_log_sync(); > + qemu_mutex_unlock_iothread(); > + > + CPU_FOREACH(cpu) { > + record_dirtypages(dirty_pages, cpu, false); > + } > + > + for (i = 0; i < dirtylimit_calc_state->data.nvcpu; i++) { > + uint64_t increased_dirty_pages = > + dirty_pages[i].end_pages - dirty_pages[i].start_pages; > + uint64_t memory_size_MB = > + (increased_dirty_pages * TARGET_PAGE_SIZE) >> 20; > + int64_t dirtyrate = (memory_size_MB * 1000) / calc_time; > + > + rate.id = i; > + rate.dirty_rate = dirtyrate; > + dirtylimit_calc_state->data.rates[i] = rate; > + > + trace_dirtyrate_do_calculate_vcpu(i, > + dirtylimit_calc_state->data.rates[i].dirty_rate); > + } > +}
This looks so like the calc-dirty-rate code already. I think adding a new resion (GLOBAL_DIRTY_LIMIT) is fine, however still, any chance to merge the code? -- Peter Xu