[libvirt] [PATCH] util: hostcpu: improve CPU freq code for FreeBSD

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 environment 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 | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c index 0f03ff8..b5a37a8 100644 --- a/src/util/virhostcpu.c +++ b/src/util/virhostcpu.c @@ -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; -- 2.7.4

On 31.08.2016 07:14, Roman Bogorodskiy wrote:
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 environment 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 | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c index 0f03ff8..b5a37a8 100644 --- a/src/util/virhostcpu.c +++ b/src/util/virhostcpu.c @@ -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;
ACK Michal

Michal Privoznik wrote:
On 31.08.2016 07:14, Roman Bogorodskiy wrote:
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 environment 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 | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c index 0f03ff8..b5a37a8 100644 --- a/src/util/virhostcpu.c +++ b/src/util/virhostcpu.c
ACK
Pushed, thanks!
Michal
Roman Bogorodskiy
participants (2)
-
Michal Privoznik
-
Roman Bogorodskiy