From: Juan Quintela <quintela@redhat.com>
To: huangy81@chinatelecom.cn
Cc: "David Hildenbrand" <david@redhat.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
qemu-devel <qemu-devel@nongnu.org>,
"Peter Xu" <peterx@redhat.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>
Subject: Re: [PATCH v1 1/3] migration/dirtyrate: implement vCPU dirtyrate calculation periodically
Date: Thu, 18 Nov 2021 10:26:47 +0100 [thread overview]
Message-ID: <87tug9rezs.fsf@secure.mitica> (raw)
In-Reply-To: <499bdfeea4b19ef44a36e0fbb5be3e0d51765430.1637214721.git.huangy81@chinatelecom.cn> (huangy's message of "Thu, 18 Nov 2021 14:07:20 +0800")
huangy81@chinatelecom.cn wrote:
> From: Hyman Huang(黄勇) <huangy81@chinatelecom.cn>
>
> introduce the third method GLOBAL_DIRTY_RESTRAINT of dirty
> tracking for calculate dirtyrate periodly for dirty restraint.
>
> implement thread for calculate dirtyrate periodly, which will
> be used for dirty restraint.
>
> add dirtyrestraint.h to introduce the util function for dirty
> restrain.
>
> Signed-off-by: Hyman Huang(黄勇) <huangy81@chinatelecom.cn>
Some comentes:
> +void dirtyrestraint_calc_start(void);
> +
> +void dirtyrestraint_calc_state_init(int max_cpus);
dirtylimit_? instead of restraint.
We have a start function, but I can't see a finish/end/stop functions.
> +#define DIRTYRESTRAINT_CALC_TIME_MS 1000 /* 1000ms */
> +
> +struct {
> + DirtyRatesData data;
> + int64_t period;
> + bool enable;
Related to previous comment. I can't see where we set enable to 1, but
nowhere were we set it back to 0, so this never finish.
> + QemuCond ready_cond;
> + QemuMutex ready_mtx;
This is a question of style, but when you only have a mutex and a cond
in one struct, you can use the "cond" and "mutex" names.
But as said, it is a question of style, if you preffer do it this way.
> +static inline void record_dirtypages(DirtyPageRecord *dirty_pages,
> + CPUState *cpu, bool start);
You have put the code at the beggining of the file, if you put it at the
end of it, I think you can avoid this forward declaration.
> +static void dirtyrestraint_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) *
> + dirtyrestraint_calc_state->data.nvcpu);
> +
> + dirtyrestraint_global_dirty_log_start();
> +
> + CPU_FOREACH(cpu) {
> + record_dirtypages(dirty_pages, cpu, true);
> + }
> +
> + start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
> + g_usleep(DIRTYRESTRAINT_CALC_TIME_MS * 1000);
> + end_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
> + calc_time = end_time - start_time;
> +
> + dirtyrestraint_global_dirty_log_stop();
> +
> + CPU_FOREACH(cpu) {
> + record_dirtypages(dirty_pages, cpu, false);
> + }
> +
> + for (i = 0; i < dirtyrestraint_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;
> + dirtyrestraint_calc_state->data.rates[i] = rate;
> +
> + trace_dirtyrate_do_calculate_vcpu(i,
> + dirtyrestraint_calc_state->data.rates[i].dirty_rate);
> + }
> +
> + return;
unnecesary return;
> +}
> +
> +static void *dirtyrestraint_calc_thread(void *opaque)
> +{
> + rcu_register_thread();
> +
> + while (qatomic_read(&dirtyrestraint_calc_state->enable)) {
> + dirtyrestraint_calc_func();
> + dirtyrestraint_calc_state->ready = true;
You really need this to be a global variable? You can pass
it on the opaque, no?
Later, Juan.
next prev parent reply other threads:[~2021-11-18 9:27 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-18 6:07 [PATCH v1 0/3] support dirty restraint on vCPU huangy81
2021-11-18 6:07 ` [PATCH v1 1/3] migration/dirtyrate: implement vCPU dirtyrate calculation periodically huangy81
2021-11-18 9:26 ` Juan Quintela [this message]
2021-11-18 6:07 ` [PATCH v1 2/3] cpu-throttle: implement vCPU throttle huangy81
2021-11-18 6:07 ` [PATCH v1 3/3] cpus-common: implement dirty restraint on vCPU huangy81
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87tug9rezs.fsf@secure.mitica \
--to=quintela@redhat.com \
--cc=david@redhat.com \
--cc=dgilbert@redhat.com \
--cc=huangy81@chinatelecom.cn \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=philmd@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).