diff options
author | jkim <jkim@FreeBSD.org> | 2011-04-07 23:28:28 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2011-04-07 23:28:28 +0000 |
commit | 95c723445e6a8035e5b4b318941c66ac674cd16c (patch) | |
tree | 664d6632a866948517ff612d5ccfb37cd5bf91db /sys/compat/linprocfs/linprocfs.c | |
parent | 824b228f1c496d62e28a46c5b32fbd974d60a42e (diff) | |
download | FreeBSD-src-95c723445e6a8035e5b4b318941c66ac674cd16c.zip FreeBSD-src-95c723445e6a8035e5b4b318941c66ac674cd16c.tar.gz |
Use atomic load & store for TSC frequency. It may be overkill for amd64 but
safer for i386 because it can be easily over 4 GHz now. More worse, it can
be easily changed by user with 'machdep.tsc_freq' tunable (directly) or
cpufreq(4) (indirectly). Note it is intentionally not used in performance
critical paths to avoid performance regression (but we should, in theory).
Alternatively, we may add "virtual TSC" with lower frequency if maximum
frequency overflows 32 bits (and ignore possible incoherency as we do now).
Diffstat (limited to 'sys/compat/linprocfs/linprocfs.c')
-rw-r--r-- | sys/compat/linprocfs/linprocfs.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c index b3d4e9c..ddbd8b4 100644 --- a/sys/compat/linprocfs/linprocfs.c +++ b/sys/compat/linprocfs/linprocfs.c @@ -221,6 +221,7 @@ linprocfs_docpuinfo(PFS_FILL_ARGS) { int hw_model[2]; char model[128]; + uint64_t freq; size_t size; int class, fqmhz, fqkhz; int i; @@ -303,9 +304,10 @@ linprocfs_docpuinfo(PFS_FILL_ARGS) if (cpu_feature & (1 << i)) sbuf_printf(sb, " %s", flags[i]); sbuf_cat(sb, "\n"); - if (class >= 5) { - fqmhz = (tsc_freq + 4999) / 1000000; - fqkhz = ((tsc_freq + 4999) / 10000) % 100; + freq = atomic_load_acq_64(&tsc_freq); + if (freq != 0) { + fqmhz = (freq + 4999) / 1000000; + fqkhz = ((freq + 4999) / 10000) % 100; sbuf_printf(sb, "cpu MHz\t\t: %d.%02d\n" "bogomips\t: %d.%02d\n", |