[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] [PATCH] Disable Xen PowerNow! support on Opteron 2nd gen and earlier processors



> I tried this suggestion and also implemented the trace function in
> cpu_frequency_change() and local_time_calibration() you suggested in a
> previous message.

Please provide the output of the tracing. Presumably the
time-goes-backwards messages only come out when stepping frequency down?
Presumably it is the CPU that is down-stepping that thinks time has gone
backwards? The messages comes out shortly after the downstep?

Once the multiplier change has happened, you need to create a new time
record for the CPU based on the global clock PIT/HPET (and update the
frequency info in the record).

Implemented correctly, this really ought to work just fine.

Ian

 
> It made no discernable difference in my tests.  I did high to low and
> low to high changes roughly every five minutes, and always got an
> excessive difference inside of Xen and usually got error messages in
> Linux.
> 
> Changed code follows and the xm dmesg log is attached.
> diff -r 62fc84adc8ed xen/arch/x86/time.c
> --- a/xen/arch/x86/time.c     Fri Jan 18 13:43:26 2008 +0000
> +++ b/xen/arch/x86/time.c     Fri Jan 25 16:45:03 2008 -0600
> @@ -724,6 +724,20 @@ void update_domain_wallclock_time(struct
>      spin_unlock(&wc_lock);
>  }
> 
> +void checktime(char *buf);
> +void checktime(char *buf)
> +{
> +        u64 s_tmp, p_tmp, diff;
> +        s_tmp = get_s_time();
> +        p_tmp = read_platform_stime();
> +        if (s_tmp > p_tmp)
> +                diff = s_tmp - p_tmp;
> +        else
> +                diff = p_tmp - s_tmp;
> +        if (diff > 50000000)
> +                printk(KERN_ERR "%s:time differed by %lu platform
time
> +%lu, systime %lu\n", buf, diff, p_tmp, s_tmp); }
> +
>  int cpu_frequency_change(u64 freq)
>  {
>      struct cpu_time *t = &this_cpu(cpu_time); @@ -732,11 +746,14 @@
> int cpu_frequency_change(u64 freq)
>      local_irq_disable();
>      rdtscll(curr_tsc);
>      t->local_tsc_stamp = curr_tsc;
> -    t->stime_local_stamp = get_s_time();
> +//    t->stime_local_stamp = get_s_time();
>      t->stime_master_stamp = read_platform_stime();
> +    t->stime_local_stamp = t->stime_master_stamp;
>      set_time_scale(&t->tsc_scale, freq);
> +checktime("frequency_change");
>      local_irq_enable();
> 
> +printk(KERN_ERR "freq change at %lu\n", t->stime_master_stamp);
>      /* A full epoch should pass before we check for deviation. */
>      set_timer(&t->calibration_timer, NOW() + EPOCH);
>      if ( smp_processor_id() == 0 )
> @@ -808,6 +825,7 @@ static void local_time_calibration(void
>      rdtscll(curr_tsc);
>      curr_local_stime  = get_s_time();
>      curr_master_stime = read_platform_stime();
> +checktime("calibration");
>      local_irq_enable();
> 
>  #if 0

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.