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>