On Wed, Apr 13, 2005 at 07:36:40AM -0400, Greg Weeks wrote:
> >So honestly, I don't know what's happening with BogoMIPS. :-) What I do
> >know however, it isn't worth a cracker in terms of benchmarking value.
> >;-)
>
> I could care less about it as a benchmarking value, but it's used to do
> calibrated udelays. If mips doesn't need it because it calibrates some
> other way then fine. I suspect not though and we're probably using an
> initial works everywhere value. I don't know though.
The bugs is the result of the somewhat messy way the calibration code is
working. calibrate_delay() puts it's result into a global variable,
loops_per_jiffy. The value is CPU-specific not global, so we need to
copy it to a per-processor data structure which we do on SMP but forget
to do on uniprocessor. At the same time the actual delay loop code in
delay.h knew to use loops_per_jiffy on uniprocessor, so it was actually
working ok.
Ralf
Index: arch/mips/kernel/cpu-probe.c
===================================================================
RCS file: /home/cvs/linux/arch/mips/kernel/cpu-probe.c,v
retrieving revision 1.43
diff -u -r1.43 cpu-probe.c
--- arch/mips/kernel/cpu-probe.c 8 Apr 2005 20:36:05 -0000 1.43
+++ arch/mips/kernel/cpu-probe.c 13 Apr 2005 13:19:11 -0000
@@ -17,7 +17,6 @@
#include <linux/ptrace.h>
#include <linux/stddef.h>
-#include <asm/bugs.h>
#include <asm/cpu.h>
#include <asm/fpu.h>
#include <asm/mipsregs.h>
Index: arch/mips/kernel/smp.c
===================================================================
RCS file: /home/cvs/linux/arch/mips/kernel/smp.c,v
retrieving revision 1.77
diff -u -r1.77 smp.c
--- arch/mips/kernel/smp.c 18 Mar 2005 17:36:53 -0000 1.77
+++ arch/mips/kernel/smp.c 13 Apr 2005 13:19:11 -0000
@@ -226,7 +226,6 @@
/* called from main before smp_init() */
void __init smp_prepare_cpus(unsigned int max_cpus)
{
- cpu_data[0].udelay_val = loops_per_jiffy;
init_new_context(current, &init_mm);
current_thread_info()->cpu = 0;
smp_tune_scheduling();
Index: include/asm-mips/bugs.h
===================================================================
RCS file: /home/cvs/linux/include/asm-mips/bugs.h,v
retrieving revision 1.10
diff -u -r1.10 bugs.h
--- include/asm-mips/bugs.h 25 Jul 2003 22:49:24 -0000 1.10
+++ include/asm-mips/bugs.h 13 Apr 2005 13:19:12 -0000
@@ -8,12 +8,17 @@
#define _ASM_BUGS_H
#include <linux/config.h>
+#include <asm/cpu.h>
+#include <asm/cpu-info.h>
extern void check_bugs32(void);
extern void check_bugs64(void);
static inline void check_bugs(void)
{
+ unsigned int cpu = smp_processor_id();
+
+ cpu_data[cpu].udelay_val = loops_per_jiffy;
check_bugs32();
#ifdef CONFIG_MIPS64
check_bugs64();
Index: include/asm-mips/delay.h
===================================================================
RCS file: /home/cvs/linux/include/asm-mips/delay.h,v
retrieving revision 1.16
diff -u -r1.16 delay.h
--- include/asm-mips/delay.h 8 Oct 2004 02:41:17 -0000 1.16
+++ include/asm-mips/delay.h 13 Apr 2005 13:19:12 -0000
@@ -15,8 +15,6 @@
#include <asm/compiler.h>
-extern unsigned long loops_per_jiffy;
-
static inline void __delay(unsigned long loops)
{
if (sizeof(long) == 4)
@@ -82,11 +80,7 @@
__delay(usecs);
}
-#ifdef CONFIG_SMP
#define __udelay_val cpu_data[smp_processor_id()].udelay_val
-#else
-#define __udelay_val loops_per_jiffy
-#endif
#define udelay(usecs) __udelay((usecs),__udelay_val)
|