Date: Tue, 12 Nov 2002 16:44:59 -0500 (EST) From: John Baldwin <jhb@FreeBSD.org> To: "Michael A. Mackey" <michael-mackey@uiowa.edu> Cc: freebsd-alpha@freebsd.org Subject: Re: Extreme time drift in SMP mode Message-ID: <XFMail.20021112164459.jhb@FreeBSD.org> In-Reply-To: <1037135718.27957.17.camel@focaccia.>
index | next in thread | previous in thread | raw e-mail
On 12-Nov-2002 Michael A. Mackey wrote:
> 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.
Well, that's not really an ideal fix for the problem. :( Adjusting
the timer frequency in the SMP case instead would be preferred.
> 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
>
>
>
--
John Baldwin <jhb@FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve!" - http://www.FreeBSD.org/
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-alpha" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.20021112164459.jhb>
