parlib/linux: cache the value of the TSC frequency
Instead of computing it every time. Note: we probably should get this
from an MSR, if possible. Computing takes about a second, and is
usually close enough.
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/user/parlib/include/parlib/tsc-compat.h b/user/parlib/include/parlib/tsc-compat.h
index a124de9..66195c7 100644
--- a/user/parlib/include/parlib/tsc-compat.h
+++ b/user/parlib/include/parlib/tsc-compat.h
@@ -91,9 +91,16 @@
static inline uint64_t get_tsc_freq(void)
{
+ static uint64_t freq;
+
struct timeval prev;
struct timeval curr;
- uint64_t beg = read_tsc_serialized();
+ uint64_t beg, end;
+
+ if (freq)
+ return freq;
+
+ beg = read_tsc_serialized();
gettimeofday(&prev, 0);
while (1) {
@@ -103,9 +110,10 @@
prev.tv_usec))
break;
}
- uint64_t end = read_tsc_serialized();
+ end = read_tsc_serialized();
- return end - beg;
+ freq = end - beg;
+ return freq;
}
/* Don't have a good way to get the overhead on Linux in userspace. */