Thanks Daniel,

On Wed, Jul 9, 2025 at 10:17 AM Daniel P. Berrangé <berrange@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 ?
 

With regards,
Daniel
--
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



--
Hector CAO
Software Engineer – Partner Engineering Team
hector.cao@canonical.com
https://launchpad.net/~hectorcao