Thanks Daniel,
On Wed, Jul 9, 2025 at 10:17 AM Daniel P. Berrangé <berrange(a)redhat.com>
wrote:
On Wed, Jul 09, 2025 at 10:03:26AM +0200, Hector Cao wrote:
> Hello,
>
> This mail is a Request for Comment.
>
> On recent Intel CPUs, some of the CPU features (mostly vmx-* subfeatures)
> are listed and controlled
> via the MSRs (Model Specific Registers) instead of the traditional CPUID
> instruction method.
>
> Right now, libvirt reads the MSR's values via /dev/cpu/*/cpu populated by
> the msr kernel module.
>
> src/cpu/cpu_x86.c:
> ...
> /* This is best effort since there might be no way to read the MSR
> * when we are not running as root. */
> for (i = 0; i < nmsrs; i++) {
> if (virHostCPUGetMSR(msrs[i], &msr) == 0) {
> virCPUx86DataItem item = {
> .type = VIR_CPU_X86_DATA_MSR,
> .data.msr = {
> ...
>
> There are 2 potential issues:
>
> 1) As stated in the source code comment above, MSR values read might fail
> when libvirt is not run as root.
> 2) MSR values read might fail if the MSR kernel module is not loaded,
this
> is still the case in some of the Linux distros.
Neither of these should happen. virHostCPUGetMSR will try /dev/cpu/0/msr
and if that fails to be opened, it should always fallback to /dev/kvm.
My bad, I missed the fallback to /dev/kvm. Indeed, libvirt will fallback to
use /dev/kvm if it cannot read /dev/cpu/*
Let me check again why the fallback did not work for me, and report back
(probably, the libvirt user does not belong to the kvm group ...)
> Andrea Bolognani's proposal of an approach that could work:
>
>
> 1. try using the unprivileged KVM API is available (or maybe the
> necessary information is exposed via QMP too?) like how QEMU does;
> 2. if that fails, try using the privileged /dev API;
Those steps need to be in the reverse order. /dev/kvm does not
give full MSR information - it only reports a subset of MSRs.
Got it. Thanks.
> 3. if that fails too, load the msr module and try again;
It seems like a modules-load file is simpler than having this manual
kmod load + repeat.
Is this modules-load file deployed by libvirt itself or are you thinking it
should be handled by the distro package ?
--
Hector CAO
Software Engineer – Partner Engineering Team
hector.cao(a)canonical.com
https://launc <
https://launchpad.net/~hectorcao>hpad.net/~hectorcao
<
https://launchpad.net/~hectorcao>
<
https://launchpad.net/~hectorcao>