diff --git a/cpu/cpu_linux.go b/cpu/cpu_linux.go index 0f095f1..14e0796 100644 --- a/cpu/cpu_linux.go +++ b/cpu/cpu_linux.go @@ -65,22 +65,29 @@ func sysCPUPath(cpu int32, relPath string) string { } func finishCPUInfo(c *InfoStat) error { - if c.Mhz == 0 { - lines, err := common.ReadLines(sysCPUPath(c.CPU, "cpufreq/cpuinfo_max_freq")) - if err == nil { - value, err := strconv.ParseFloat(lines[0], 64) - if err != nil { - return err - } - c.Mhz = value/1000.0 // value is in kHz - } - } + var lines []string + var err error + var value float64 + if len(c.CoreID) == 0 { - lines, err := common.ReadLines(sysCPUPath(c.CPU, "topology/coreId")) + lines, err = common.ReadLines(sysCPUPath(c.CPU, "topology/core_id")) if err == nil { c.CoreID = lines[0] } } + + // override the value of c.Mhz with cpufreq/cpuinfo_max_freq regardless + // of the value from /proc/cpuinfo because we want to report the maximum + // clock-speed of the CPU for c.Mhz, matching the behaviour of Windows + lines, err = common.ReadLines(sysCPUPath(c.CPU, "cpufreq/cpuinfo_max_freq")) + if err != nil { + return err + } + value, err = strconv.ParseFloat(lines[0], 64) + if err != nil { + return err + } + c.Mhz = value/1000.0 // value is in kHz return nil } @@ -136,11 +143,10 @@ func Info() ([]InfoStat, error) { } c.Stepping = int32(t) case "cpu MHz": - t, err := strconv.ParseFloat(value, 64) - if err != nil { - return ret, err + // treat this as the fallback value, thus we ignore error + if t, err := strconv.ParseFloat(value, 64); err == nil { + c.Mhz = t } - c.Mhz = t case "cache size": t, err := strconv.ParseInt(strings.Replace(value, " KB", "", 1), 10, 64) if err != nil {