On Tue, Sep 17, 2024 at 11:09:17AM +0530, Naman Jain wrote: > read_hv_sched_clock_tsc() assumes that the Hyper-V clock counter is > bigger than the variable hv_sched_clock_offset, which is cached during > early boot, but depending on the timing this assumption may be false > when a hibernated VM starts again (the clock counter starts from 0 > again) and is resuming back (Note: hv_init_tsc_clocksource() is not > called during hibernation/resume); consequently, > read_hv_sched_clock_tsc() may return a negative integer (which is > interpreted as a huge positive integer since the return type is u64) > and new kernel messages are prefixed with huge timestamps before > read_hv_sched_clock_tsc() grows big enough (which typically takes > several seconds). > > Fix the issue by saving the Hyper-V clock counter just before the > suspend, and using it to correct the hv_sched_clock_offset in > resume. This makes hv tsc page based sched_clock continuous and ensures > that post resume, it starts from where it left off during suspend. > Override x86_platform.save_sched_clock_state and > x86_platform.restore_sched_clock_state routines to correct this as soon > as possible. > > Note: if Invariant TSC is available, the issue doesn't happen because > 1) we don't register read_hv_sched_clock_tsc() for sched clock: > See commit e5313f1c5404 ("clocksource/drivers/hyper-v: Rework > clocksource and sched clock setup"); > 2) the common x86 code adjusts TSC similarly: see > __restore_processor_state() -> tsc_verify_tsc_adjust(true) and > x86_platform.restore_sched_clock_state(). > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: 1349401ff1aa ("clocksource/drivers/hyper-v: Suspend/resume Hyper-V clocksource for hibernation") > Co-developed-by: Dexuan Cui <decui@xxxxxxxxxxxxx> > Signed-off-by: Dexuan Cui <decui@xxxxxxxxxxxxx> > Signed-off-by: Naman Jain <namjain@xxxxxxxxxxxxxxxxxxx> Applied to hyperv-fixes with the subject line fixed up. Thanks.