a5135d9c45
commit bcc80dec91ee745b3d66f3e48f0ec2efdea97149 upstream. 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@vger.kernel.org Fixes: 1349401ff1aa ("clocksource/drivers/hyper-v: Suspend/resume Hyper-V clocksource for hibernation") Co-developed-by: Dexuan Cui <decui@microsoft.com> Signed-off-by: Dexuan Cui <decui@microsoft.com> Signed-off-by: Naman Jain <namjain@linux.microsoft.com> Reviewed-by: Michael Kelley <mhklinux@outlook.com> Link: https://lore.kernel.org/r/20240917053917.76787-1-namjain@linux.microsoft.com Signed-off-by: Wei Liu <wei.liu@kernel.org> Message-ID: <20240917053917.76787-1-namjain@linux.microsoft.com> Signed-off-by: Naman Jain <namjain@linux.microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
||
---|---|---|
.. | ||
acpi_pm.c | ||
arc_timer.c | ||
arm_arch_timer.c | ||
arm_global_timer.c | ||
armv7m_systick.c | ||
asm9260_timer.c | ||
bcm2835_timer.c | ||
bcm_kona_timer.c | ||
clksrc-dbx500-prcmu.c | ||
clksrc_st_lpc.c | ||
clps711x-timer.c | ||
dummy_timer.c | ||
dw_apb_timer.c | ||
dw_apb_timer_of.c | ||
em_sti.c | ||
exynos_mct.c | ||
exynos_mct_v2.c | ||
exynos_mct_v2.h | ||
h8300_timer8.c | ||
h8300_timer16.c | ||
h8300_tpu.c | ||
hyperv_timer.c | ||
i8253.c | ||
ingenic-ost.c | ||
ingenic-sysost.c | ||
ingenic-timer.c | ||
jcore-pit.c | ||
Kconfig | ||
Makefile | ||
mips-gic-timer.c | ||
mmio.c | ||
mps2-timer.c | ||
mxs_timer.c | ||
nomadik-mtu.c | ||
numachip.c | ||
renesas-ostm.c | ||
samsung_pwm_timer.c | ||
scx200_hrt.c | ||
sh_cmt.c | ||
sh_mtu2.c | ||
sh_tmu.c | ||
timer-armada-370-xp.c | ||
timer-atcpit100.c | ||
timer-atlas7.c | ||
timer-atmel-pit.c | ||
timer-atmel-st.c | ||
timer-atmel-tcb.c | ||
timer-cadence-ttc.c | ||
timer-clint.c | ||
timer-cs5535.c | ||
timer-davinci.c | ||
timer-digicolor.c | ||
timer-efm32.c | ||
timer-fsl-ftm.c | ||
timer-fttmr010.c | ||
timer-gx6605s.c | ||
timer-imx-gpt.c | ||
timer-imx-sysctr.c | ||
timer-imx-tpm.c | ||
timer-integrator-ap.c | ||
timer-ixp4xx.c | ||
timer-keystone.c | ||
timer-lpc32xx.c | ||
timer-mediatek.c | ||
timer-meson6.c | ||
timer-microchip-pit64b.c | ||
timer-milbeaut.c | ||
timer-mp-csky.c | ||
timer-npcm7xx.c | ||
timer-nps.c | ||
timer-of.c | ||
timer-of.h | ||
timer-orion.c | ||
timer-owl.c | ||
timer-oxnas-rps.c | ||
timer-pistachio.c | ||
timer-prima2.c | ||
timer-probe.c | ||
timer-pxa.c | ||
timer-qcom.c | ||
timer-rda.c | ||
timer-riscv.c | ||
timer-rockchip.c | ||
timer-sp.h | ||
timer-sp804.c | ||
timer-sprd.c | ||
timer-stm32-lp.c | ||
timer-stm32.c | ||
timer-sun4i.c | ||
timer-sun5i.c | ||
timer-tango-xtal.c | ||
timer-tegra.c | ||
timer-ti-32k.c | ||
timer-ti-dm-systimer.c | ||
timer-ti-dm.c | ||
timer-u300.c | ||
timer-versatile.c | ||
timer-vf-pit.c | ||
timer-vt8500.c | ||
timer-zevio.c |