Re: get_cycles() on i386

From: john stultz
Date: Tue Nov 04 2003 - 18:30:22 EST


On Tue, 2003-11-04 at 15:22, Joel Becker wrote:
> Folks,
> Certain distributions are building all of their SMP kernels
> NUMA-aware. This is great, as the kernels support boxes like the x440
> with no trouble. However, this implicitly disables CONFIG_X86_TSC.
> While that is good for NUMA systems, and fine from a kernel timing
> standpoint, it also eliminates any generic access to the TSC via
> get_cycles(). With CONFIG_X86_TSC not defined, get_cycles() always
> returns 0.
> Given that >95% of machines will not be x440s, this means that a
> user of that kernel cannot access a high resolution timer via
> get_cycles(). I don't want to have to litter my code with rdtscll()
> when I managed to remove it!
> The proposed patch is trivial. If the system has a TSC, it is
> available get_cycles(). This makes no change to the other parts of the
> kernel protected by CONFIG_X86_TSC.

CONFIG_X86_TSC be the devil. Personally, I'd much prefer dropping the
compile time option and using dynamic detection. Something like (not
recently tested and i believe against 2.5.something, but you get the
idea):


diff -Nru a/include/asm-i386/timex.h b/include/asm-i386/timex.h
--- a/include/asm-i386/timex.h Mon Feb 24 21:09:32 2003
+++ b/include/asm-i386/timex.h Mon Feb 24 21:09:32 2003
@@ -40,14 +40,10 @@

static inline cycles_t get_cycles (void)
{
-#ifndef CONFIG_X86_TSC
- return 0;
-#else
- unsigned long long ret;
-
- rdtscll(ret);
+ unsigned long long ret = 0;
+ if(cpu_has_tsc)
+ rdtscll(ret);
return ret;
-#endif
}

extern unsigned long cpu_khz;


thanks
-john


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/