All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hyman Huang <huangy81@chinatelecom.cn>
To: wucy11@chinatelecom.cn, qemu-devel@nongnu.org
Cc: tugy@chinatelecom.cn, David Hildenbrand <david@redhat.com>,
	yuanmh12@chinatelecom.cn, Juan Quintela <quintela@redhat.com>,
	Richard Henderson <richard.henderson@linaro.org>,
	"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
	Peter Xu <peterx@redhat.com>,
	f4bug@amsat.org, dengpc12@chinatelecom.cn,
	Paolo Bonzini <pbonzini@redhat.com>,
	baiyw2@chinatelecom.cn
Subject: Re: [PATCH v2 2/4] kvm: Dirty ring autoconverge optmization for kvm_cpu_synchronize_kick_all
Date: Sat, 2 Apr 2022 15:22:21 +0800	[thread overview]
Message-ID: <2f1232c1-6238-94c5-73ec-775b9e428e9c@chinatelecom.cn> (raw)
In-Reply-To: <ee39636fb5d2fc95b90942b13b7a65ed55aa227f.1648091540.git.wucy11@chinatelecom.cn>



在 2022/3/28 9:32, wucy11@chinatelecom.cn 写道:
> From: Chongyun Wu <wucy11@chinatelecom.cn>
> 
> Dirty ring feature need call kvm_cpu_synchronize_kick_all
> to flush hardware buffers into KVMslots, but when aucoverge
> run kvm_cpu_synchronize_kick_all calling will become more
> and more time consuming. This will significantly reduce the
> efficiency of dirty page queries, especially when memory
> pressure is high and the speed limit is high.
> 
> When the CPU speed limit is high and kvm_cpu_synchronize_kick_all
> is time-consuming, the rate of dirty pages generated by the VM
> will also be significantly reduced, so it is not necessary to
> call kvm_cpu_synchronize_kick_all at this time, just call it once
> before stopping the VM. This will significantly improve the
> efficiency of dirty page queries under high pressure.
Again, i hope we could consider the migration time instead of just
guest performance.
> 
> Signed-off-by: Chongyun Wu <wucy11@chinatelecom.cn>
> ---
>   accel/kvm/kvm-all.c       | 25 +++++--------------------
>   include/exec/cpu-common.h |  2 ++
>   migration/migration.c     | 11 +++++++++++
>   softmmu/cpus.c            | 18 ++++++++++++++++++
>   4 files changed, 36 insertions(+), 20 deletions(-)
> 
> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
> index 65a4de8..5e02700 100644
> --- a/accel/kvm/kvm-all.c
> +++ b/accel/kvm/kvm-all.c
> @@ -48,6 +48,8 @@
>   
>   #include "hw/boards.h"
>   
> +#include "sysemu/cpu-throttle.h"
> +
>   /* This check must be after config-host.h is included */
>   #ifdef CONFIG_EVENTFD
>   #include <sys/eventfd.h>
> @@ -839,25 +841,6 @@ static uint64_t kvm_dirty_ring_reap(KVMState *s)
>       return total;
>   }
>   
> -static void do_kvm_cpu_synchronize_kick(CPUState *cpu, run_on_cpu_data arg)
> -{
> -    /* No need to do anything */
> -}
> -
> -/*
> - * Kick all vcpus out in a synchronized way.  When returned, we
> - * guarantee that every vcpu has been kicked and at least returned to
> - * userspace once.
> - */
> -static void kvm_cpu_synchronize_kick_all(void)
> -{
> -    CPUState *cpu;
> -
> -    CPU_FOREACH(cpu) {
> -        run_on_cpu(cpu, do_kvm_cpu_synchronize_kick, RUN_ON_CPU_NULL);
> -    }
> -}
> -
>   /*
>    * Flush all the existing dirty pages to the KVM slot buffers.  When
>    * this call returns, we guarantee that all the touched dirty pages
> @@ -879,7 +862,9 @@ static void kvm_dirty_ring_flush(void)
>        * First make sure to flush the hardware buffers by kicking all
>        * vcpus out in a synchronous way.
>        */
> -    kvm_cpu_synchronize_kick_all();
> +    if (!cpu_throttle_get_percentage()) {
> +        qemu_kvm_cpu_synchronize_kick_all();
> +    }
For the code logic itself, kvm_dirty_ring_flush aims to flush all 
existing dirty pages, same as i reviewed in v1's first commit 
"kvm,memory: Optimize dirty page collection for dirty ring", we 
shouldn't consider the migation logic in this path.
>       kvm_dirty_ring_reap(kvm_state);
>       trace_kvm_dirty_ring_flush(1);
>   }
> diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
> index 50a7d29..13045b3 100644
> --- a/include/exec/cpu-common.h
> +++ b/include/exec/cpu-common.h
> @@ -160,4 +160,6 @@ extern int singlestep;
>   
>   void list_cpus(const char *optarg);
>   
> +void qemu_kvm_cpu_synchronize_kick_all(void);
> +
>   #endif /* CPU_COMMON_H */
> diff --git a/migration/migration.c b/migration/migration.c
> index 695f0f2..ca1db88 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -61,6 +61,7 @@
>   #include "sysemu/cpus.h"
>   #include "yank_functions.h"
>   #include "sysemu/qtest.h"
> +#include "sysemu/kvm.h"
>   
>   #define MAX_THROTTLE  (128 << 20)      /* Migration transfer speed throttling */
>   
> @@ -3183,6 +3184,16 @@ static void migration_completion(MigrationState *s)
>   
>           if (!ret) {
>               bool inactivate = !migrate_colo_enabled();
> +            /*
> +             * Before stop vm do qemu_kvm_cpu_synchronize_kick_all to
> +             * fulsh hardware buffer into KVMslots for dirty ring
> +             * optmiaztion, If qemu_kvm_cpu_synchronize_kick_all is not
> +             * called when the CPU speed is limited to improve efficiency
> +             */
> +            if (kvm_dirty_ring_enabled()
> +                && cpu_throttle_get_percentage()) {
> +                qemu_kvm_cpu_synchronize_kick_all();
> +            }
>               ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
>               trace_migration_completion_vm_stop(ret);
>               if (ret >= 0) {
> diff --git a/softmmu/cpus.c b/softmmu/cpus.c
> index 7b75bb6..d028d83 100644
> --- a/softmmu/cpus.c
> +++ b/softmmu/cpus.c
> @@ -810,3 +810,21 @@ void qmp_inject_nmi(Error **errp)
>       nmi_monitor_handle(monitor_get_cpu_index(monitor_cur()), errp);
>   }
>   
[...]
> +static void do_kvm_cpu_synchronize_kick(CPUState *cpu, run_on_cpu_data arg)
> +{
> +    /* No need to do anything */
> +}
> +
> +/*
> + * Kick all vcpus out in a synchronized way.  When returned, we
> + * guarantee that every vcpu has been kicked and at least returned to
> + * userspace once.
> + */
> +void qemu_kvm_cpu_synchronize_kick_all(void)
> +{
> +    CPUState *cpu;
> +
> +    CPU_FOREACH(cpu) {
> +        run_on_cpu(cpu, do_kvm_cpu_synchronize_kick, RUN_ON_CPU_NULL);
> +    }
> +}
For the code style itself, IMHO, exporting helpers should split into a 
standalone commit.
-- 
Best regard

Hyman Huang(黄勇)


  reply	other threads:[~2022-04-02  7:26 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-28  1:32 [PATCH v2 0/4] Dirty ring and auto converge optimization wucy11
2022-03-28  1:32 ` [PATCH v2 1/4] kvm: Dynamically adjust the rate of dirty ring reaper thread wucy11
2022-04-02  7:04   ` Hyman Huang
2022-04-02  7:28     ` Chongyun Wu
2022-05-13 16:50       ` Peter Xu
2022-03-28  1:32 ` [PATCH v2 2/4] kvm: Dirty ring autoconverge optmization for kvm_cpu_synchronize_kick_all wucy11
2022-04-02  7:22   ` Hyman Huang [this message]
2022-05-13 16:41     ` Peter Xu
2022-03-28  1:32 ` [PATCH v2 3/4] kvm: Introduce a dirty rate calculation method based on dirty ring wucy11
2022-04-02  7:28   ` Hyman Huang
2022-04-02  8:59     ` Chongyun Wu
2022-05-13 17:25       ` Peter Xu
2022-03-28  1:32 ` [PATCH v2 4/4] migration: Calculate the appropriate throttle for autoconverge wucy11
2022-04-01 13:13 ` [PATCH v2 0/4] Dirty ring and auto converge optimization Peter Xu
2022-04-02  2:13   ` Chongyun Wu

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=2f1232c1-6238-94c5-73ec-775b9e428e9c@chinatelecom.cn \
    --to=huangy81@chinatelecom.cn \
    --cc=baiyw2@chinatelecom.cn \
    --cc=david@redhat.com \
    --cc=dengpc12@chinatelecom.cn \
    --cc=dgilbert@redhat.com \
    --cc=f4bug@amsat.org \
    --cc=pbonzini@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=richard.henderson@linaro.org \
    --cc=tugy@chinatelecom.cn \
    --cc=wucy11@chinatelecom.cn \
    --cc=yuanmh12@chinatelecom.cn \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.