[PATCH] kvm: x86: emulate MSR_PLATFORM_INFO msr bits

Hao Xiang posted 1 patch 2 years, 3 months ago
There is a newer version of this series
arch/x86/include/asm/msr-index.h |  4 ++++
arch/x86/kvm/x86.c               | 25 ++++++++++++++++++++++++-
2 files changed, 28 insertions(+), 1 deletion(-)
[PATCH] kvm: x86: emulate MSR_PLATFORM_INFO msr bits
Posted by Hao Xiang 2 years, 3 months ago
For intel platform, The BzyMhz field of Turbostat shows zero
due to the missing of part msr bits of MSR_PLATFORM_INFO.

Acquire necessary msr bits, and expose following msr info to guest,
to make sure guest can get correct turbo frequency info.

MSR_PLATFORM_INFO bits
bit 15:8, Maximum Non-Turbo Ratio (MAX_NON_TURBO_LIM_RATIO)
bit 47:40, Maximum Efficiency Ratio (MAX_EFFICIENCY_RATIO)

Signed-off-by: Hao Xiang <hao.xiang@linux.alibaba.com>
---
 arch/x86/include/asm/msr-index.h |  4 ++++
 arch/x86/kvm/x86.c               | 25 ++++++++++++++++++++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
index 1d11135..1c8a276 100644
--- a/arch/x86/include/asm/msr-index.h
+++ b/arch/x86/include/asm/msr-index.h
@@ -68,6 +68,10 @@
 #define MSR_PLATFORM_INFO		0x000000ce
 #define MSR_PLATFORM_INFO_CPUID_FAULT_BIT	31
 #define MSR_PLATFORM_INFO_CPUID_FAULT		BIT_ULL(MSR_PLATFORM_INFO_CPUID_FAULT_BIT)
+/* MSR_PLATFORM_INFO bit 15:8, Maximum Non-Turbo Ratio (MAX_NON_TURBO_LIM_RATIO) */
+#define MSR_PLATFORM_INFO_MAX_NON_TURBO_LIM_RATIO	0x00000000ff00
+/* MSR_PLATFORM_INFO bit 47:40, Maximum Efficiency Ratio (MAX_EFFICIENCY_RATIO) */
+#define MSR_PLATFORM_INFO_MAX_EFFICIENCY_RATIO		0xff0000000000
 
 #define MSR_IA32_UMWAIT_CONTROL			0xe1
 #define MSR_IA32_UMWAIT_CONTROL_C02_DISABLE	BIT(0)
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index c381770..621c3e1 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1679,6 +1679,29 @@ static u64 kvm_get_arch_capabilities(void)
 	return data;
 }
 
+
+static u64 kvm_get_msr_platform_info(void)
+{
+	u64 msr_platform_info = 0;
+
+	rdmsrl_safe(MSR_PLATFORM_INFO, &msr_platform_info);
+	/*
+	 * MSR_PLATFORM_INFO bits:
+	 * bit 15:8, Maximum Non-Turbo Ratio (MAX_NON_TURBO_LIM_RATIO)
+	 * bit 31, CPUID Faulting Enabled (CPUID_FAULTING_EN)
+	 * bit 47:40, Maximum Efficiency Ratio (MAX_EFFICIENCY_RATIO)
+	 *
+	 * Emulate part msr bits, expose above msr info to guest,
+	 * to make sure guest can get correct turbo frequency info.
+	 */
+
+	msr_platform_info &= (MSR_PLATFORM_INFO_MAX_NON_TURBO_RATIO |
+			MSR_PLATFORM_INFO_MAX_EFFICIENCY_RATIO);
+	msr_platform_info |= MSR_PLATFORM_INFO_CPUID_FAULT;
+
+	return msr_platform_info;
+}
+
 static int kvm_get_msr_feature(struct kvm_msr_entry *msr)
 {
 	switch (msr->index) {
@@ -11919,7 +11942,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
 		goto free_guest_fpu;
 
 	vcpu->arch.arch_capabilities = kvm_get_arch_capabilities();
-	vcpu->arch.msr_platform_info = MSR_PLATFORM_INFO_CPUID_FAULT;
+	vcpu->arch.msr_platform_info = kvm_get_msr_platform_info();
 	kvm_xen_init_vcpu(vcpu);
 	kvm_vcpu_mtrr_init(vcpu);
 	vcpu_load(vcpu);
-- 
1.8.3.1
Re: [PATCH] kvm: x86: emulate MSR_PLATFORM_INFO msr bits
Posted by Xiaoyao Li 2 years, 3 months ago
On 8/21/2023 11:22 AM, Hao Xiang wrote:
> For intel platform, The BzyMhz field of Turbostat shows zero
> due to the missing of part msr bits of MSR_PLATFORM_INFO.
> 
> Acquire necessary msr bits, and expose following msr info to guest,
> to make sure guest can get correct turbo frequency info.
>
> MSR_PLATFORM_INFO bits
> bit 15:8, Maximum Non-Turbo Ratio (MAX_NON_TURBO_LIM_RATIO)
> bit 47:40, Maximum Efficiency Ratio (MAX_EFFICIENCY_RATIO)

I'm curious. How are they related to turbo frequency info?

bits 15:8, tell the Non-turbo frequency and bits 47:40 tells the min 
frequency.

> Signed-off-by: Hao Xiang <hao.xiang@linux.alibaba.com>
> ---
>   arch/x86/include/asm/msr-index.h |  4 ++++
>   arch/x86/kvm/x86.c               | 25 ++++++++++++++++++++++++-
>   2 files changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
> index 1d11135..1c8a276 100644
> --- a/arch/x86/include/asm/msr-index.h
> +++ b/arch/x86/include/asm/msr-index.h
> @@ -68,6 +68,10 @@
>   #define MSR_PLATFORM_INFO		0x000000ce
>   #define MSR_PLATFORM_INFO_CPUID_FAULT_BIT	31
>   #define MSR_PLATFORM_INFO_CPUID_FAULT		BIT_ULL(MSR_PLATFORM_INFO_CPUID_FAULT_BIT)
> +/* MSR_PLATFORM_INFO bit 15:8, Maximum Non-Turbo Ratio (MAX_NON_TURBO_LIM_RATIO) */
> +#define MSR_PLATFORM_INFO_MAX_NON_TURBO_LIM_RATIO	0x00000000ff00
> +/* MSR_PLATFORM_INFO bit 47:40, Maximum Efficiency Ratio (MAX_EFFICIENCY_RATIO) */
> +#define MSR_PLATFORM_INFO_MAX_EFFICIENCY_RATIO		0xff0000000000

They are mask not the value, please name them with _MASK suffix.

>   
>   #define MSR_IA32_UMWAIT_CONTROL			0xe1
>   #define MSR_IA32_UMWAIT_CONTROL_C02_DISABLE	BIT(0)
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index c381770..621c3e1 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -1679,6 +1679,29 @@ static u64 kvm_get_arch_capabilities(void)
>   	return data;
>   }
>   
> +
> +static u64 kvm_get_msr_platform_info(void)
> +{
> +	u64 msr_platform_info = 0;
> +
> +	rdmsrl_safe(MSR_PLATFORM_INFO, &msr_platform_info);
> +	/*
> +	 * MSR_PLATFORM_INFO bits:
> +	 * bit 15:8, Maximum Non-Turbo Ratio (MAX_NON_TURBO_LIM_RATIO)
> +	 * bit 31, CPUID Faulting Enabled (CPUID_FAULTING_EN)
> +	 * bit 47:40, Maximum Efficiency Ratio (MAX_EFFICIENCY_RATIO)
> +	 *
> +	 * Emulate part msr bits, expose above msr info to guest,
> +	 * to make sure guest can get correct turbo frequency info.
> +	 */
> +
> +	msr_platform_info &= (MSR_PLATFORM_INFO_MAX_NON_TURBO_RATIO |
> +			MSR_PLATFORM_INFO_MAX_EFFICIENCY_RATIO);
> +	msr_platform_info |= MSR_PLATFORM_INFO_CPUID_FAULT;
> +
> +	return msr_platform_info;
> +}
> +
>   static int kvm_get_msr_feature(struct kvm_msr_entry *msr)
>   {
>   	switch (msr->index) {
> @@ -11919,7 +11942,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
>   		goto free_guest_fpu;
>   
>   	vcpu->arch.arch_capabilities = kvm_get_arch_capabilities();
> -	vcpu->arch.msr_platform_info = MSR_PLATFORM_INFO_CPUID_FAULT;
> +	vcpu->arch.msr_platform_info = kvm_get_msr_platform_info();
>   	kvm_xen_init_vcpu(vcpu);
>   	kvm_vcpu_mtrr_init(vcpu);
>   	vcpu_load(vcpu);
Re: [PATCH] kvm: x86: emulate MSR_PLATFORM_INFO msr bits
Posted by kernel test robot 2 years, 3 months ago
Hi Hao,

kernel test robot noticed the following build errors:

[auto build test ERROR on kvm/queue]
[also build test ERROR on mst-vhost/linux-next tip/x86/core linus/master v6.5-rc7 next-20230822]
[cannot apply to kvm/linux-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Hao-Xiang/kvm-x86-emulate-MSR_PLATFORM_INFO-msr-bits/20230821-125755
base:   https://git.kernel.org/pub/scm/virt/kvm/kvm.git queue
patch link:    https://lore.kernel.org/r/1692588151-33716-1-git-send-email-hao.xiang%40linux.alibaba.com
patch subject: [PATCH] kvm: x86: emulate MSR_PLATFORM_INFO msr bits
config: i386-buildonly-randconfig-003-20230823 (https://download.01.org/0day-ci/archive/20230823/202308230803.qc3KTHx1-lkp@intel.com/config)
compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git ae42196bc493ffe877a7e3dff8be32035dea4d07)
reproduce: (https://download.01.org/0day-ci/archive/20230823/202308230803.qc3KTHx1-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202308230803.qc3KTHx1-lkp@intel.com/

All errors (new ones prefixed by >>):

>> arch/x86/kvm/x86.c:1695:24: error: use of undeclared identifier 'MSR_PLATFORM_INFO_MAX_NON_TURBO_RATIO'
           msr_platform_info &= (MSR_PLATFORM_INFO_MAX_NON_TURBO_RATIO |
                                 ^
   1 error generated.


vim +/MSR_PLATFORM_INFO_MAX_NON_TURBO_RATIO +1695 arch/x86/kvm/x86.c

  1678	
  1679	
  1680	static u64 kvm_get_msr_platform_info(void)
  1681	{
  1682		u64 msr_platform_info = 0;
  1683	
  1684		rdmsrl_safe(MSR_PLATFORM_INFO, &msr_platform_info);
  1685		/*
  1686		 * MSR_PLATFORM_INFO bits:
  1687		 * bit 15:8, Maximum Non-Turbo Ratio (MAX_NON_TURBO_LIM_RATIO)
  1688		 * bit 31, CPUID Faulting Enabled (CPUID_FAULTING_EN)
  1689		 * bit 47:40, Maximum Efficiency Ratio (MAX_EFFICIENCY_RATIO)
  1690		 *
  1691		 * Emulate part msr bits, expose above msr info to guest,
  1692		 * to make sure guest can get correct turbo frequency info.
  1693		 */
  1694	
> 1695		msr_platform_info &= (MSR_PLATFORM_INFO_MAX_NON_TURBO_RATIO |
  1696				MSR_PLATFORM_INFO_MAX_EFFICIENCY_RATIO);
  1697		msr_platform_info |= MSR_PLATFORM_INFO_CPUID_FAULT;
  1698	
  1699		return msr_platform_info;
  1700	}
  1701	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Re: [PATCH] kvm: x86: emulate MSR_PLATFORM_INFO msr bits
Posted by kernel test robot 2 years, 3 months ago
Hi Hao,

kernel test robot noticed the following build errors:

[auto build test ERROR on kvm/queue]
[also build test ERROR on mst-vhost/linux-next tip/x86/core linus/master v6.5-rc7 next-20230822]
[cannot apply to kvm/linux-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Hao-Xiang/kvm-x86-emulate-MSR_PLATFORM_INFO-msr-bits/20230821-125755
base:   https://git.kernel.org/pub/scm/virt/kvm/kvm.git queue
patch link:    https://lore.kernel.org/r/1692588151-33716-1-git-send-email-hao.xiang%40linux.alibaba.com
patch subject: [PATCH] kvm: x86: emulate MSR_PLATFORM_INFO msr bits
config: i386-randconfig-003-20230822 (https://download.01.org/0day-ci/archive/20230823/202308230059.Z4m5fuN7-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: (https://download.01.org/0day-ci/archive/20230823/202308230059.Z4m5fuN7-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202308230059.Z4m5fuN7-lkp@intel.com/

All errors (new ones prefixed by >>):

   arch/x86/kvm/x86.c: In function 'kvm_get_msr_platform_info':
>> arch/x86/kvm/x86.c:1695:31: error: 'MSR_PLATFORM_INFO_MAX_NON_TURBO_RATIO' undeclared (first use in this function); did you mean 'MSR_PLATFORM_INFO_MAX_NON_TURBO_LIM_RATIO'?
    1695 |         msr_platform_info &= (MSR_PLATFORM_INFO_MAX_NON_TURBO_RATIO |
         |                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         |                               MSR_PLATFORM_INFO_MAX_NON_TURBO_LIM_RATIO
   arch/x86/kvm/x86.c:1695:31: note: each undeclared identifier is reported only once for each function it appears in


vim +1695 arch/x86/kvm/x86.c

  1678	
  1679	
  1680	static u64 kvm_get_msr_platform_info(void)
  1681	{
  1682		u64 msr_platform_info = 0;
  1683	
  1684		rdmsrl_safe(MSR_PLATFORM_INFO, &msr_platform_info);
  1685		/*
  1686		 * MSR_PLATFORM_INFO bits:
  1687		 * bit 15:8, Maximum Non-Turbo Ratio (MAX_NON_TURBO_LIM_RATIO)
  1688		 * bit 31, CPUID Faulting Enabled (CPUID_FAULTING_EN)
  1689		 * bit 47:40, Maximum Efficiency Ratio (MAX_EFFICIENCY_RATIO)
  1690		 *
  1691		 * Emulate part msr bits, expose above msr info to guest,
  1692		 * to make sure guest can get correct turbo frequency info.
  1693		 */
  1694	
> 1695		msr_platform_info &= (MSR_PLATFORM_INFO_MAX_NON_TURBO_RATIO |
  1696				MSR_PLATFORM_INFO_MAX_EFFICIENCY_RATIO);
  1697		msr_platform_info |= MSR_PLATFORM_INFO_CPUID_FAULT;
  1698	
  1699		return msr_platform_info;
  1700	}
  1701	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki