On 01/22/14 at 10:08pm, Peter Zijlstra wrote:
> > 
> > I think its the right region to look through. My current suspect is the
> > linear continuity fit with the initial 'random' multiplier.
> > 
> > That initial 'random' multiplier can get us quite high, and we'll fit
> > the function to match that but continue at a sane rate.
> > 
> > I'll try and prod a little more later this evening as time permits.
> 
> Does this cure things?

Peter, the odd timstamp still happens with this patch for me.

> 
> ---
>  arch/x86/kernel/tsc.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
> index a3acbac2ee72..bb04148c5fe0 100644
> --- a/arch/x86/kernel/tsc.c
> +++ b/arch/x86/kernel/tsc.c
> @@ -237,7 +237,7 @@ static inline unsigned long long cycles_2_ns(unsigned 
> long long cyc)
>  /* XXX surely we already have this someplace in the kernel?! */
>  #define DIV_ROUND(n, d) (((n) + ((d) / 2)) / (d))
>  
> -static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu)
> +static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu, bool origin)
>  {
>       unsigned long long tsc_now, ns_now;
>       struct cyc2ns_data *data;
> @@ -252,7 +252,10 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int 
> cpu)
>       data = cyc2ns_write_begin(cpu);
>  
>       rdtscll(tsc_now);
> -     ns_now = cycles_2_ns(tsc_now);
> +     if (origin)
> +             ns_now = 0;
> +     else
> +             ns_now = cycles_2_ns(tsc_now);
>  
>       /*
>        * Compute a new multiplier as per the above comment and ensure our
> @@ -926,7 +929,7 @@ static int time_cpufreq_notifier(struct notifier_block 
> *nb, unsigned long val,
>                       mark_tsc_unstable("cpufreq changes");
>       }
>  
> -     set_cyc2ns_scale(tsc_khz, freq->cpu);
> +     set_cyc2ns_scale(tsc_khz, freq->cpu, false);
>  
>       return 0;
>  }
> @@ -1199,7 +1202,7 @@ void __init tsc_init(void)
>        */
>       for_each_possible_cpu(cpu) {
>               cyc2ns_init(cpu);
> -             set_cyc2ns_scale(cpu_khz, cpu);
> +             set_cyc2ns_scale(cpu_khz, cpu, true);
>       }
>  
>       if (tsc_disabled > 0)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to