Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Nov 2002 12:13:58 -0500 (EST)
From:      Andrew Gallatin <gallatin@cs.duke.edu>
To:        "Dr. Michael Mackey" <mackey@engineering.uiowa.edu>
Cc:        John Baldwin <jhb@FreeBSD.ORG>, freebsd-alpha@FreeBSD.ORG
Subject:   Re: Extreme time drift in SMP mode
Message-ID:  <15825.14038.294916.650698@grasshopper.cs.duke.edu>
In-Reply-To: <15825.12436.199011.915697@grasshopper.cs.duke.edu>
References:  <XFMail.20021112104816.jhb@FreeBSD.org> <3DD12AA2.8D84B3E2@engineering.uiowa.edu> <3DD12CE7.10103@spock.cl> <15825.12436.199011.915697@grasshopper.cs.duke.edu>

next in thread | previous in thread | raw e-mail | index | archive | help

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?15825.14038.294916.650698>