From: Sean Christopherson <seanjc@google.com>
To: Lei Chen <lei.chen@smartx.com>
Cc: igor@gooddata.com, jan.cipa@gooddata.com,
jaroslav.pulchart@gooddata.com, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org, pbonzini@redhat.com
Subject: Re: [PATCH v2] KVM: x86: Rate-limit global clock updates on vCPU load
Date: Thu, 9 Apr 2026 12:21:39 -0700 [thread overview]
Message-ID: <adf8Q1VSeAMMyCa_@google.com> (raw)
In-Reply-To: <20260409142226.2581-1-lei.chen@smartx.com>
On Thu, Apr 09, 2026, Lei Chen wrote:
> commit 446fcce2a52b ("Revert "x86: kvm: rate-limit global clock updates"")
> dropped the rate limiting for KVM_REQ_GLOBAL_CLOCK_UPDATE.
>
> As a result, kvm_arch_vcpu_load() can queue global clock update requests
> every time a vCPU is scheduled when the master clock is disabled or when
> the vCPU is loaded for the first time.
>
> Restore the throttling with a per-VM ratelimit state and gate
> KVM_REQ_GLOBAL_CLOCK_UPDATE through __ratelimit(), so frequent vCPU
> scheduling does not generate a steady stream of redundant clock update
> requests.
>
> Fixes: 446fcce2a52b ("Revert "x86: kvm: rate-limit global clock updates"")
> Signed-off-by: Lei Chen <lei.chen@smartx.com>
> Reported-by: Jaroslav Pulchart <jaroslav.pulchart@gooddata.com>
> Closes: https://lore.kernel.org/all/CAK8fFZ5gY8_Mw2A=iZVFNVKQNrXQzVsn-HTd+Me9K6ZfmdgA+Q@mail.gmail.com/
> ---
> CHANGELOG:
> v2:
> - remove comment of kvmclock_update_rs
> - make sure kvm_arch_vcpu_load make KVM_REQ_CLOCK_UPDATE for this vcpu
> - add RATELIMIT_MSG_ON_RELEASE to kvmclock_update_rs
>
> v1:
> - initial version(https://lore.kernel.org/all/20260407070046.2336-1-lei.chen@smartx.com/)
> ---
> arch/x86/include/asm/kvm_host.h | 1 +
> arch/x86/kvm/x86.c | 11 +++++++++--
> 2 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 5a3bfa293e8b..5e750c49d21e 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -1453,6 +1453,7 @@ struct kvm_arch {
> bool use_master_clock;
> u64 master_kernel_ns;
> u64 master_cycle_now;
> + struct ratelimit_state kvmclock_update_rs;
>
> #ifdef CONFIG_KVM_HYPERV
> struct kvm_hv hyperv;
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 63afdb6bb078..a534e8391611 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -5210,8 +5210,13 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
> * On a host with synchronized TSC, there is no need to update
> * kvmclock on vcpu->cpu migration
> */
> - if (!vcpu->kvm->arch.use_master_clock || vcpu->cpu == -1)
> - kvm_make_request(KVM_REQ_GLOBAL_CLOCK_UPDATE, vcpu);
> + if (!vcpu->kvm->arch.use_master_clock || vcpu->cpu == -1) {
> + if (__ratelimit(&vcpu->kvm->arch.kvmclock_update_rs))
> + kvm_make_request(KVM_REQ_GLOBAL_CLOCK_UPDATE, vcpu);
> + else
> + kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
What I was trying to call out in my review of v1, is that prior to commit
446fcce2a52b, the effectively ratelimiting applied to *all* instances of
KVM_REQ_GLOBAL_CLOCK_UPDATE. Which meant that KVM's existing behavior is that
kvm_write_system_time() would be subject to the ratelimiting as well.
That said, I don't see any obvious problems with immediately honoring writes to
MSR_KVM_SYSTEM_TIME{,_NEW}, and it's probably a much better experience for the
guest. So I'm a-ok with this approach, but we should call out that skipping the
synthetic MSR case is deliberate. No need for a v3, I'll add a blurb when
applying.
> + }
> +
> if (vcpu->cpu != cpu)
> kvm_make_request(KVM_REQ_MIGRATE_TIMER, vcpu);
> vcpu->cpu = cpu;
> @@ -13189,6 +13194,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
> raw_spin_lock_init(&kvm->arch.tsc_write_lock);
> mutex_init(&kvm->arch.apic_map_lock);
> seqcount_raw_spinlock_init(&kvm->arch.pvclock_sc, &kvm->arch.tsc_write_lock);
> + ratelimit_state_init(&kvm->arch.kvmclock_update_rs, HZ, 10);
> + ratelimit_set_flags(&kvm->arch.kvmclock_update_rs, RATELIMIT_MSG_ON_RELEASE);
IIUC, so long was KVM doesn't explicitly invoke ratelimit_state_exit(), setting
RATELIMIT_MSG_ON_RELEASE means we won't get dmesg spam? To be clear, I'm 100%
in favor of suppressing dmesg output.
> kvm->arch.kvmclock_offset = -get_kvmclock_base_ns();
>
> raw_spin_lock_irqsave(&kvm->arch.tsc_write_lock, flags);
> --
> 2.51.0
>
next prev parent reply other threads:[~2026-04-09 19:21 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-21 14:32 [REGRESSION 6.19, BISECTED] KVM: x86: kvmclock rate-limit removal causes IPI storm and high guest steal time Jaroslav Pulchart
2026-03-23 2:27 ` Lei Chen
2026-04-01 6:43 ` Lei Chen
2026-04-01 21:16 ` Sean Christopherson
2026-04-07 7:00 ` [PATCH v1] KVM: x86: Rate-limit global clock updates on vCPU load Lei Chen
2026-04-07 18:02 ` Sean Christopherson
2026-04-09 13:03 ` Lei Chen
2026-04-09 13:36 ` Lei Chen
2026-04-09 14:22 ` [PATCH v2] " Lei Chen
2026-04-09 19:21 ` Sean Christopherson [this message]
2026-05-06 9:48 ` Thorsten Leemhuis
2026-05-06 12:55 ` Sean Christopherson
2026-05-06 14:09 ` Thorsten Leemhuis
2026-05-06 15:22 ` Sean Christopherson
2026-05-06 15:58 ` Jaroslav Pulchart
2026-05-06 20:31 ` Sean Christopherson
2026-05-07 9:27 ` Jaroslav Pulchart
2026-05-07 19:09 ` Sean Christopherson
2026-05-06 20:10 ` Jaroslav Pulchart
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=adf8Q1VSeAMMyCa_@google.com \
--to=seanjc@google.com \
--cc=igor@gooddata.com \
--cc=jan.cipa@gooddata.com \
--cc=jaroslav.pulchart@gooddata.com \
--cc=kvm@vger.kernel.org \
--cc=lei.chen@smartx.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
/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.