Skip site navigation (1)Skip section navigation (2)
Date:      12 Nov 2002 15:15:14 -0600
From:      "Michael A. Mackey" <michael-mackey@uiowa.edu>
To:        jhb@freebsd.org
Cc:        freebsd-alpha@freebsd.org
Subject:   Re: Extreme time drift in SMP mode
Message-ID:  <1037135718.27957.17.camel@focaccia.>

next in thread | raw e-mail | index | archive | help
Well, I guess I got really lucky....

I seem to have fixed the time drift problem, based on a hunch.

Drew, after what you said about the boot processor alone driving the
timing, I decided to allow both processors to drive the timer.  So, I
changed the code in the function 'alpha_clock_interrupt ()' in 
/usr/src/sys/alpha/alpha/interrupt.c (actually I only added an #undef
SMP statement on line 467 and redefined it before the 'critical_exit()'
call).

And now, the SMP system keeps proper track of the time.

In a couple of days, I have two more processors arriving.  Then I can
really test if this fix works.

Thanks for your help - and I hope others can verify my results.


On Tue, 2002-11-12 at 11:13, Andrew Gallatin wrote:
> 
> Andrew Gallatin writes:
>  > 
>  > Roberto de Iriarte writes:
>  > 
>  >  > Hmmm. my dmesg reads differently
>  >  > BTW, my system has only one CPU, and the clock has never
drifted.
>  >  > 
>  > 
>  > That's the thing.  The 2100 is unlike all other alphas, and handles
>  > clocks differently in MP mode.
> 
> To elaborate on the above, I think most MP alphas tie the clock
> interrupt to the boot cpu, and it ticks at hz.   
> 
> I think the 2100 round-robins the clock interrupt to all running cpus,
> therefore the boot cpu only ticks at hz/mp_ncpus.  
> 
> Currently, we pay attention only to the boot CPU.  From 
> alpha_clock_interrupt() in sys/alpha/alpha/interrupt.c
> <...>
>                 critical_enter();
> #ifdef SMP
>                 /*
>                  * Only one processor drives the actual timer.
>                  */
>                 if (PCPU_GET(cpuid) == boot_cpu_id) {
> #endif
>                         (*platform.clockintr)(framep);
>                         /* divide hz (1024) by 8 to get stathz (128)
*/
>                         if ((++schedclk2 & 0x7) == 0)
>                                 statclock((struct clockframe
*)framep);
> #ifdef SMP
>                 } else {
>                         mtx_lock_spin(&sched_lock);
>                         hardclock_process(curthread,
TRAPF_USERMODE(framep));
>                         if ((schedclk2 & 0x7) == 0)
>                                 statclock_process(curkse,
TRAPF_PC(framep),
>                                     TRAPF_USERMODE(framep));
>                         mtx_unlock_spin(&sched_lock);
>                 }
> #endif
>                 critical_exit();
> <...>
> 
> 
> Given that I know zippo about how timekeeping works, I don't know
> what a good fix might be.   If I had a machine in front of me,
> I'd be tempted to try dividing the a frequency by 2 in
sys/alpha/alpha/clock.c, 
> but I'm not sure which one, or  if it can be adjusted as additional
processors
> are found and started. (which would be slightly less wrong..).
> 
> Drew




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-alpha" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1037135718.27957.17.camel>