On Tue, 2026-08-11 at 07:33 -0700, Sean Christopherson wrote:
> 
> Actually, why are KVM_{G,S}ET_CLOCK_GUEST vCPU-scoped?  Per the documentation,
> the API "Sets the KVM clock (for the whole VM) in terms of the vCPU TSC".  If
> the APIs are VM-scoped instead of vCPU-scoped, then KVM can simply 
> save/restore
> what's in the per-VM masterclock state, no?

They're vCPU-scoped because they need to be tied to a guest TSC (on
live migration, neither ka->master_cycle_now nor ka->master_kernel_ns
are useful — those are the "per-VM masterclock state").

Theoretically, guest TSCs can be different on each vCPU (different
offset, different *rate* even. Not that we allow KVM_[GS]ET_CLOCK_GUEST
at different rates, I concede).

So they operate in the context of a given vCPU, and *its* TSC.

And I think I'm going to defend that 'theoretical they can be
different', because I *would* like to eliminate the ways that a *guest*
can force non-masterclock mode, and that does mean allowing the offset-
TSC case.

FWIW in my local tree I've just extended the pvclock_migration_test to
test precisely the thing you were concerned about: three vCPUs with
divergent TSC offsets, migrated by setting each vCPU's TSC and then
invoking KVM_SET_CLOCK_GUEST once, through vCPU0. Masterclock stays
active, TSC_STABLE_BIT is correctly clear, and all three vCPUs'
pvclocks (and KVM_GET_CLOCK) agree to within a nanosecond afterwards.
I'll include that in the next spin.

> That would also help address my concerns about sanity checking the TSC 
> frequency
> against the kvmclock frequency, as the APIs are much more blatantly about 
> saving
> and restoring masterclock state.  For whatever reason, it feels more natural 
> for
> me to say that KVM_SET_CLOCK_GUEST will fail if the target frequency doesn't
> (fuzzily?) match the frequency at which the masterclock is already configured.
> Probably because use_master_clock directly gates that information?  Whereas 
> the
> vCPU's frequency is independently configured but obviously influences 
> masterclock
> mode.

I am perfectly happy to say that the *existing* check as I have coded
it, is matching against the frequency at which the masterclock is
configured. Because we can't *get* there if the guest is not in
masterclock mode, and it can't be in masterclock mode unless all its
vCPUs are running at the same rate, which *is* the master clock rate.
:)

I guess I could even concede to change the actual code rather than just
the comment... (untested)

Still needs the *offset* of the vCPU though.

--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3595,15 +3595,15 @@ static int kvm_vcpu_ioctl_set_clock_guest(struct 
kvm_vcpu *v, void __user *argp

        if (kvm_caps.has_tsc_control)
                curr_tsc_hz = kvm_scale_tsc(curr_tsc_hz,
-                                           v->arch.l1_tsc_scaling_ratio);
+                                           ka->master_tsc_scaling_ratio);

        /*
         * The mul/shift in the provided pvclock structure encode the guest
         * TSC frequency at which it was generated. Sanity-check that it is
-        * consistent with this vCPU's effective TSC frequency, allowing a
-        * discrepancy of 1 kHz either way since independently calibrated
-        * hosts will not measure precisely the same value even for the
-        * same nominal frequency.
+        * consistent with the frequency at which the masterclock is
+        * configured, allowing a discrepancy of 1 kHz either way since
+        * independently calibrated hosts will not measure precisely the
+        * same value even for the same nominal frequency.
         */
        if (user_tsc_hz < curr_tsc_hz - 1000 ||
            user_tsc_hz > curr_tsc_hz + 1000) {

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to