]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: hostcpu: improve CPU freq code for FreeBSD
authorRoman Bogorodskiy <bogorodskiy@gmail.com>
Wed, 31 Aug 2016 05:14:41 +0000 (08:14 +0300)
committerRoman Bogorodskiy <bogorodskiy@gmail.com>
Tue, 6 Sep 2016 15:27:56 +0000 (18:27 +0300)
Current implementation uses the dev.cpu.0.freq sysctl that is
provided by the cpufreq(4) framework and returns the actual
CPU frequency. However, there are environments where it's not available,
e.g. when running nested in KVM. In this case fall back to hw.clockrate
that reports CPU frequency at the boot time.

Resolves (hopefully):
https://bugzilla.redhat.com/show_bug.cgi?id=1369964

src/util/virhostcpu.c

index 0f03ff82feaee0348d48fe1225cca953cc6b49bd..b5a37a8965fb1b21b76b389ddd34dace08b2a41e 100644 (file)
@@ -994,9 +994,16 @@ virHostCPUGetInfo(virArch hostarch ATTRIBUTE_UNUSED,
     *threads = 1;
 
 # ifdef __FreeBSD__
+    /* dev.cpu.%d.freq reports current active CPU frequency. It is provided by
+     * the cpufreq(4) framework. However, it might be disabled or no driver
+     * available. In this case fallback to "hw.clockrate" which reports boot time
+     * CPU frequency. */
+
     if (sysctlbyname("dev.cpu.0.freq", &cpu_freq, &cpu_freq_len, NULL, 0) < 0) {
-        virReportSystemError(errno, "%s", _("cannot obtain CPU freq"));
-        return -1;
+        if (sysctlbyname("hw.clockrate", &cpu_freq, &cpu_freq_len, NULL, 0) < 0) {
+            virReportSystemError(errno, "%s", _("cannot obtain CPU freq"));
+            return -1;
+        }
     }
 
     *mhz = cpu_freq;