Hi,

as there was not much response on this topic, adding some
more people to CC.
Would be great to get the one or other acked-by: for stable
inclusion.

Thanks,

   Thomas

On Monday, January 17, 2011 11:03:13 AM Thomas Renninger wrote:
> 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

Reply via email to