On Tue, Mar 25, 2025 at 01:13:50PM +0900, Suleiman Souhlal wrote: > When the host resumes from a suspend, the guest thinks any task > that was running during the suspend ran for a long time, even though > the effective run time was much shorter, which can end up having > negative effects with scheduling. > > [...] > > Signed-off-by: Suleiman Souhlal <suleiman@xxxxxxxxxx> Saw the corresponding host suspended time has been compensated in update_rq_clock_task(): Tested-by: Tzung-Bi Shih <tzungbi@xxxxxxxxxx> With 1 minor comment: Reviewed-by: Tzung-Bi Shih <tzungbi@xxxxxxxxxx> > @@ -917,8 +918,13 @@ struct kvm_vcpu_arch { > > struct { > u8 preempted; > + bool host_suspended; Use it in bool manner. > +static void wait_for_resume(struct kvm_vcpu *vcpu) > +{ > + wait_event_interruptible(vcpu->arch.st.resume_waitq, > + vcpu->arch.st.host_suspended == 0); E.g.: !vcpu->arch.st.host_suspended. > @@ -6939,6 +6954,19 @@ static int kvm_arch_suspend_notifier(struct kvm *kvm) > > mutex_lock(&kvm->lock); > kvm_for_each_vcpu(i, vcpu, kvm) { > + vcpu->arch.st.last_suspend = ktime_get_boottime_ns(); > + /* > + * Tasks get thawed before the resume notifier has been called > + * so we need to block vCPUs until the resume notifier has run. > + * Otherwise, suspend steal time might get applied too late, > + * and get accounted to the wrong guest task. > + * This also ensures that the guest paused bit set below > + * doesn't get checked and cleared before the host actually > + * suspends. > + */ > + vcpu->arch.st.host_suspended = 1; E.g.: true. > +static int kvm_arch_resume_notifier(struct kvm *kvm) > +{ > + struct kvm_vcpu *vcpu; > + unsigned long i; > + > + mutex_lock(&kvm->lock); > + kvm_for_each_vcpu(i, vcpu, kvm) { > + vcpu->arch.st.host_suspended = 0; E.g.: false.