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>