Thanks Daniel,

On Wed, Jul 9, 2025 at 10:17 AM Daniel P. Berrangé <berra...@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....@canonical.com
https://launc <https://launchpad.net/~hectorcao>hpad.net/~hectorcao
<https://launchpad.net/~hectorcao>

<https://launchpad.net/~hectorcao>

Reply via email to