Hi, this patch seem to not only be a performance optimization, but fixes (works around) a time drift issue when suspending.
The time drift happens when hpet.c encounters specific hpet/HW capabilities to set up per CPU hpet msi interrupt vectors. While the real culprit seem to be in the per CPU hpet msi vector code, this patch seem to address the issue in an easy and riskless manner, suitable for stable@ kernels. No idea which HW is set up with per CPU hpet msi irqs (not much). If such configuration only happens on recent arat capable machines, latest mainline kernels might get cleaned up by removing this code and stable@ kernels are fine with this easy patch. Patch slightly adjusted (hunk 3/3 did not apply) to latest linux-2.6.32.y tree. Thanks, Thomas --- From: Shaohua Li <[email protected]> x86, hpet: Disable per-cpu hpet timer if ARAT is supported Git-commit: 39fe05e58c5e448601ce46e6b03900d5bf31c4b0 If CPU support always running local APIC timer, per-cpu hpet timer could be disabled, which is useless and wasteful in such case. Let's leave the timers to others. The effect is that we reserve less timers. Signed-off-by: Shaohua Li <[email protected]> LKML-Reference: <[email protected]> Signed-off-by: Ingo Molnar <[email protected]> --- arch/x86/kernel/hpet.c | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index c771e1a..69cab24 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c @@ -606,6 +606,8 @@ static void hpet_msi_capability_lookup(unsigned int start_timer) if (hpet_msi_disable) return; + if (boot_cpu_has(X86_FEATURE_ARAT)) + return; id = hpet_readl(HPET_ID); num_timers = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT); @@ -894,10 +896,8 @@ int __init hpet_enable(void) if (id & HPET_ID_LEGSUP) { hpet_legacy_clockevent_register(); - hpet_msi_capability_lookup(2); return 1; } - hpet_msi_capability_lookup(0); return 0; out_nohpet: @@ -930,12 +930,20 @@ static __init int hpet_late_init(void) if (!hpet_virt_address) return -ENODEV; + if (hpet_readl(HPET_ID) & HPET_ID_LEGSUP) + hpet_msi_capability_lookup(2); + else + hpet_msi_capability_lookup(0); + hpet_reserve_platform_timers(hpet_readl(HPET_ID)); hpet_print_config(); if (hpet_msi_disable) return 0; + if (boot_cpu_has(X86_FEATURE_ARAT)) + return 0; + for_each_online_cpu(cpu) { hpet_cpuhp_notify(NULL, CPU_ONLINE, (void *)(long)cpu); } _______________________________________________ stable mailing list [email protected] http://linux.kernel.org/mailman/listinfo/stable
