mirror of
https://github.com/torvalds/linux.git
synced 2026-05-22 22:22:08 +02:00
x86/tsc: Handle CLOCK_SOURCE_VALID_FOR_HRES correctly
Unconditionally setting the CLOCK_SOURCE_VALID_FOR_HRES for the real TSC clocksource is wrong as there is no guarantee that the early TSC was validated for high resolution mode. Set the flag only when the early TSC was validated as otherwise the clocksource selection might enable high resolution mode with a TSC of unknown quality and possibly no way to back out once it is discovered to be unsuitable. Signed-off-by: Thomas Gleixner <tglx@kernel.org> Link: https://patch.msgid.link/20260123231521.790598171@kernel.org
This commit is contained in:
parent
ced7072a3a
commit
79ccb0693a
|
|
@ -1200,7 +1200,6 @@ static struct clocksource clocksource_tsc = {
|
|||
.read = read_tsc,
|
||||
.mask = CLOCKSOURCE_MASK(64),
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS |
|
||||
CLOCK_SOURCE_VALID_FOR_HRES |
|
||||
CLOCK_SOURCE_CAN_INLINE_READ |
|
||||
CLOCK_SOURCE_MUST_VERIFY |
|
||||
CLOCK_SOURCE_VERIFY_PERCPU |
|
||||
|
|
@ -1411,6 +1410,15 @@ static void tsc_refine_calibration_work(struct work_struct *work)
|
|||
have_art = true;
|
||||
clocksource_tsc.base = &art_base_clk;
|
||||
}
|
||||
|
||||
/*
|
||||
* Transfer the valid for high resolution flag if it was set on the
|
||||
* early TSC already. That guarantees that there is no intermediate
|
||||
* clocksource selected once the early TSC is unregistered.
|
||||
*/
|
||||
if (clocksource_tsc_early.flags & CLOCK_SOURCE_VALID_FOR_HRES)
|
||||
clocksource_tsc.flags |= CLOCK_SOURCE_VALID_FOR_HRES;
|
||||
|
||||
clocksource_register_khz(&clocksource_tsc, tsc_khz);
|
||||
unreg:
|
||||
clocksource_unregister(&clocksource_tsc_early);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user