KVM: x86: add a stub for MSR_PLATFORM_INFO

Submitted by Denis Plotnikov on June 6, 2019, 8:36 a.m.

Details

Message ID 20190606083645.28717-1-dplotnikov@virtuozzo.com
State New
Series "KVM: x86: add a stub for MSR_PLATFORM_INFO"
Headers show

Commit Message

Denis Plotnikov June 6, 2019, 8:36 a.m.
This is done to prevent windows guest crashing while running
PassMark benchmark which calls rdmsr(0xce) - MSR_PLATFORM_INFO
from PassMark driver.

The reason why the test driver does so is unclear, since
MSR_PLATFORM_INFO is used to calibrate tsc for certain Intel Atom
cpus (please, refer to try_msr_calibrate_tsc in arch/x86/kernel/tsc_msr.c).

Anyway, KVM so far didn't have MSR_PLATFORM_INFO MSR implemented and
this didn't cause any problems with guest crashes on both Linux and Windows
platforms. So, the only reason why the crashes started now is that
the customer started using PassMark test on KVM platform recently.

https://jira.sw.ru/browse/PSBM-95187

Signed-off-by: Denis Plotnikov <dplotnikov@virtuozzo.com>
---
 arch/x86/kvm/cpuid.h | 1 -
 arch/x86/kvm/x86.c   | 7 +++++++
 2 files changed, 7 insertions(+), 1 deletion(-)

Patch hide | download patch | download mbox

diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index c4996e57d10c..fb0c6ab257cf 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -121,5 +121,4 @@  static inline bool guest_cpuid_is_amd(struct kvm_vcpu *vcpu)
 	best = kvm_find_cpuid_entry(vcpu, 0, 0);
 	return best && best->ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx;
 }
-
 #endif
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index f1230a251add..b855f03477f4 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1018,6 +1018,7 @@  static u32 emulated_msrs[] = {
 	MSR_IA32_MCG_EXT_CTL,
 	MSR_IA32_SMBASE,
 	MSR_AMD64_VIRT_SPEC_CTRL,
+	MSR_PLATFORM_INFO,
 };
 
 static unsigned num_emulated_msrs;
@@ -2300,6 +2301,9 @@  int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
 			return 1;
 		vcpu->arch.osvw.status = data;
 		break;
+	case MSR_PLATFORM_INFO:
+		return 1;
+		break;
 	default:
 		if (msr && (msr == vcpu->kvm->arch.xen_hvm_config.msr))
 			return xen_hvm_config(vcpu, data);
@@ -2517,6 +2521,9 @@  int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
 			return 1;
 		msr_info->data = vcpu->arch.osvw.status;
 		break;
+	case MSR_PLATFORM_INFO:
+		msr_info->data = 0;
+		break;
 	default:
 		if (kvm_pmu_is_valid_msr(vcpu, msr_info->index))
 			return kvm_pmu_get_msr(vcpu, msr_info->index, &msr_info->data);

Comments

Roman Kagan June 6, 2019, 11:31 a.m.
On Thu, Jun 06, 2019 at 11:36:45AM +0300, Denis Plotnikov wrote:
> This is done to prevent windows guest crashing while running
> PassMark benchmark which calls rdmsr(0xce) - MSR_PLATFORM_INFO
> from PassMark driver.
> 
> The reason why the test driver does so is unclear, since
> MSR_PLATFORM_INFO is used to calibrate tsc for certain Intel Atom
> cpus (please, refer to try_msr_calibrate_tsc in arch/x86/kernel/tsc_msr.c).
> 
> Anyway, KVM so far didn't have MSR_PLATFORM_INFO MSR implemented and

KVM has it implemented since 4.12.  Why not just backport it?

Roman.

> this didn't cause any problems with guest crashes on both Linux and Windows
> platforms. So, the only reason why the crashes started now is that
> the customer started using PassMark test on KVM platform recently.
> 
> https://jira.sw.ru/browse/PSBM-95187
> 
> Signed-off-by: Denis Plotnikov <dplotnikov@virtuozzo.com>
> ---
>  arch/x86/kvm/cpuid.h | 1 -
>  arch/x86/kvm/x86.c   | 7 +++++++
>  2 files changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
> index c4996e57d10c..fb0c6ab257cf 100644
> --- a/arch/x86/kvm/cpuid.h
> +++ b/arch/x86/kvm/cpuid.h
> @@ -121,5 +121,4 @@ static inline bool guest_cpuid_is_amd(struct kvm_vcpu *vcpu)
>  	best = kvm_find_cpuid_entry(vcpu, 0, 0);
>  	return best && best->ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx;
>  }
> -
>  #endif
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index f1230a251add..b855f03477f4 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -1018,6 +1018,7 @@ static u32 emulated_msrs[] = {
>  	MSR_IA32_MCG_EXT_CTL,
>  	MSR_IA32_SMBASE,
>  	MSR_AMD64_VIRT_SPEC_CTRL,
> +	MSR_PLATFORM_INFO,
>  };
>  
>  static unsigned num_emulated_msrs;
> @@ -2300,6 +2301,9 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>  			return 1;
>  		vcpu->arch.osvw.status = data;
>  		break;
> +	case MSR_PLATFORM_INFO:
> +		return 1;
> +		break;
>  	default:
>  		if (msr && (msr == vcpu->kvm->arch.xen_hvm_config.msr))
>  			return xen_hvm_config(vcpu, data);
> @@ -2517,6 +2521,9 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>  			return 1;
>  		msr_info->data = vcpu->arch.osvw.status;
>  		break;
> +	case MSR_PLATFORM_INFO:
> +		msr_info->data = 0;
> +		break;
>  	default:
>  		if (kvm_pmu_is_valid_msr(vcpu, msr_info->index))
>  			return kvm_pmu_get_msr(vcpu, msr_info->index, &msr_info->data);
> -- 
> 2.17.0
>
Denis Plotnikov June 6, 2019, 12:11 p.m.
On 06.06.2019 14:31, Roman Kagan wrote:
> On Thu, Jun 06, 2019 at 11:36:45AM +0300, Denis Plotnikov wrote:
>> This is done to prevent windows guest crashing while running
>> PassMark benchmark which calls rdmsr(0xce) - MSR_PLATFORM_INFO
>> from PassMark driver.
>>
>> The reason why the test driver does so is unclear, since
>> MSR_PLATFORM_INFO is used to calibrate tsc for certain Intel Atom
>> cpus (please, refer to try_msr_calibrate_tsc in arch/x86/kernel/tsc_msr.c).
>>
>> Anyway, KVM so far didn't have MSR_PLATFORM_INFO MSR implemented and
> 
> KVM has it implemented since 4.12.  Why not just backport it?
But for another purpose: "KVM: x86: virtualize cpuid faulting"
Isn't worth to backport now. Will get that functionality later while 
rebasing to newer RHEL

Denis
> 
> Roman.
> 
>> this didn't cause any problems with guest crashes on both Linux and Windows
>> platforms. So, the only reason why the crashes started now is that
>> the customer started using PassMark test on KVM platform recently.
>>
>> https://jira.sw.ru/browse/PSBM-95187
>>
>> Signed-off-by: Denis Plotnikov <dplotnikov@virtuozzo.com>
>> ---
>>   arch/x86/kvm/cpuid.h | 1 -
>>   arch/x86/kvm/x86.c   | 7 +++++++
>>   2 files changed, 7 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
>> index c4996e57d10c..fb0c6ab257cf 100644
>> --- a/arch/x86/kvm/cpuid.h
>> +++ b/arch/x86/kvm/cpuid.h
>> @@ -121,5 +121,4 @@ static inline bool guest_cpuid_is_amd(struct kvm_vcpu *vcpu)
>>   	best = kvm_find_cpuid_entry(vcpu, 0, 0);
>>   	return best && best->ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx;
>>   }
>> -
>>   #endif
>> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
>> index f1230a251add..b855f03477f4 100644
>> --- a/arch/x86/kvm/x86.c
>> +++ b/arch/x86/kvm/x86.c
>> @@ -1018,6 +1018,7 @@ static u32 emulated_msrs[] = {
>>   	MSR_IA32_MCG_EXT_CTL,
>>   	MSR_IA32_SMBASE,
>>   	MSR_AMD64_VIRT_SPEC_CTRL,
>> +	MSR_PLATFORM_INFO,
>>   };
>>   
>>   static unsigned num_emulated_msrs;
>> @@ -2300,6 +2301,9 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>>   			return 1;
>>   		vcpu->arch.osvw.status = data;
>>   		break;
>> +	case MSR_PLATFORM_INFO:
>> +		return 1;
>> +		break;
>>   	default:
>>   		if (msr && (msr == vcpu->kvm->arch.xen_hvm_config.msr))
>>   			return xen_hvm_config(vcpu, data);
>> @@ -2517,6 +2521,9 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>>   			return 1;
>>   		msr_info->data = vcpu->arch.osvw.status;
>>   		break;
>> +	case MSR_PLATFORM_INFO:
>> +		msr_info->data = 0;
>> +		break;
>>   	default:
>>   		if (kvm_pmu_is_valid_msr(vcpu, msr_info->index))
>>   			return kvm_pmu_get_msr(vcpu, msr_info->index, &msr_info->data);
>> -- 
>> 2.17.0
>>
Roman Kagan June 6, 2019, 12:40 p.m.
On Thu, Jun 06, 2019 at 03:11:10PM +0300, Denis Plotnikov wrote:
> 
> 
> On 06.06.2019 14:31, Roman Kagan wrote:
> > On Thu, Jun 06, 2019 at 11:36:45AM +0300, Denis Plotnikov wrote:
> >> This is done to prevent windows guest crashing while running
> >> PassMark benchmark which calls rdmsr(0xce) - MSR_PLATFORM_INFO
> >> from PassMark driver.
> >>
> >> The reason why the test driver does so is unclear, since
> >> MSR_PLATFORM_INFO is used to calibrate tsc for certain Intel Atom
> >> cpus (please, refer to try_msr_calibrate_tsc in arch/x86/kernel/tsc_msr.c).
> >>
> >> Anyway, KVM so far didn't have MSR_PLATFORM_INFO MSR implemented and
> > 
> > KVM has it implemented since 4.12.  Why not just backport it?
> But for another purpose: "KVM: x86: virtualize cpuid faulting"
> Isn't worth to backport now. Will get that functionality later while 
> rebasing to newer RHEL

Doesn't it apply cleanly?  The rebase is easier if you don't need to
modify the patch.

Roman.

> >> this didn't cause any problems with guest crashes on both Linux and Windows
> >> platforms. So, the only reason why the crashes started now is that
> >> the customer started using PassMark test on KVM platform recently.
> >>
> >> https://jira.sw.ru/browse/PSBM-95187
> >>
> >> Signed-off-by: Denis Plotnikov <dplotnikov@virtuozzo.com>
> >> ---
> >>   arch/x86/kvm/cpuid.h | 1 -
> >>   arch/x86/kvm/x86.c   | 7 +++++++
> >>   2 files changed, 7 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
> >> index c4996e57d10c..fb0c6ab257cf 100644
> >> --- a/arch/x86/kvm/cpuid.h
> >> +++ b/arch/x86/kvm/cpuid.h
> >> @@ -121,5 +121,4 @@ static inline bool guest_cpuid_is_amd(struct kvm_vcpu *vcpu)
> >>   	best = kvm_find_cpuid_entry(vcpu, 0, 0);
> >>   	return best && best->ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx;
> >>   }
> >> -
> >>   #endif
> >> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> >> index f1230a251add..b855f03477f4 100644
> >> --- a/arch/x86/kvm/x86.c
> >> +++ b/arch/x86/kvm/x86.c
> >> @@ -1018,6 +1018,7 @@ static u32 emulated_msrs[] = {
> >>   	MSR_IA32_MCG_EXT_CTL,
> >>   	MSR_IA32_SMBASE,
> >>   	MSR_AMD64_VIRT_SPEC_CTRL,
> >> +	MSR_PLATFORM_INFO,
> >>   };
> >>   
> >>   static unsigned num_emulated_msrs;
> >> @@ -2300,6 +2301,9 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
> >>   			return 1;
> >>   		vcpu->arch.osvw.status = data;
> >>   		break;
> >> +	case MSR_PLATFORM_INFO:
> >> +		return 1;
> >> +		break;
> >>   	default:
> >>   		if (msr && (msr == vcpu->kvm->arch.xen_hvm_config.msr))
> >>   			return xen_hvm_config(vcpu, data);
> >> @@ -2517,6 +2521,9 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
> >>   			return 1;
> >>   		msr_info->data = vcpu->arch.osvw.status;
> >>   		break;
> >> +	case MSR_PLATFORM_INFO:
> >> +		msr_info->data = 0;
> >> +		break;
> >>   	default:
> >>   		if (kvm_pmu_is_valid_msr(vcpu, msr_info->index))
> >>   			return kvm_pmu_get_msr(vcpu, msr_info->index, &msr_info->data);
> >> -- 
> >> 2.17.0
> >>
> 
> -- 
> Best,
> Denis
Denis Plotnikov June 6, 2019, 12:49 p.m.
On 06.06.2019 15:40, Roman Kagan wrote:
> On Thu, Jun 06, 2019 at 03:11:10PM +0300, Denis Plotnikov wrote:
>>
>>
>> On 06.06.2019 14:31, Roman Kagan wrote:
>>> On Thu, Jun 06, 2019 at 11:36:45AM +0300, Denis Plotnikov wrote:
>>>> This is done to prevent windows guest crashing while running
>>>> PassMark benchmark which calls rdmsr(0xce) - MSR_PLATFORM_INFO
>>>> from PassMark driver.
>>>>
>>>> The reason why the test driver does so is unclear, since
>>>> MSR_PLATFORM_INFO is used to calibrate tsc for certain Intel Atom
>>>> cpus (please, refer to try_msr_calibrate_tsc in arch/x86/kernel/tsc_msr.c).
>>>>
>>>> Anyway, KVM so far didn't have MSR_PLATFORM_INFO MSR implemented and
>>>
>>> KVM has it implemented since 4.12.  Why not just backport it?
>> But for another purpose: "KVM: x86: virtualize cpuid faulting"
>> Isn't worth to backport now. Will get that functionality later while
>> rebasing to newer RHEL
> 
> Doesn't it apply cleanly?  The rebase is easier if you don't need to
> modify the patch.
> 
> Roman.
No, it doesn't. That's why I decided to it that way.

Denis
> 
>>>> this didn't cause any problems with guest crashes on both Linux and Windows
>>>> platforms. So, the only reason why the crashes started now is that
>>>> the customer started using PassMark test on KVM platform recently.
>>>>
>>>> https://jira.sw.ru/browse/PSBM-95187
>>>>
>>>> Signed-off-by: Denis Plotnikov <dplotnikov@virtuozzo.com>
>>>> ---
>>>>    arch/x86/kvm/cpuid.h | 1 -
>>>>    arch/x86/kvm/x86.c   | 7 +++++++
>>>>    2 files changed, 7 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
>>>> index c4996e57d10c..fb0c6ab257cf 100644
>>>> --- a/arch/x86/kvm/cpuid.h
>>>> +++ b/arch/x86/kvm/cpuid.h
>>>> @@ -121,5 +121,4 @@ static inline bool guest_cpuid_is_amd(struct kvm_vcpu *vcpu)
>>>>    	best = kvm_find_cpuid_entry(vcpu, 0, 0);
>>>>    	return best && best->ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx;
>>>>    }
>>>> -
>>>>    #endif
>>>> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
>>>> index f1230a251add..b855f03477f4 100644
>>>> --- a/arch/x86/kvm/x86.c
>>>> +++ b/arch/x86/kvm/x86.c
>>>> @@ -1018,6 +1018,7 @@ static u32 emulated_msrs[] = {
>>>>    	MSR_IA32_MCG_EXT_CTL,
>>>>    	MSR_IA32_SMBASE,
>>>>    	MSR_AMD64_VIRT_SPEC_CTRL,
>>>> +	MSR_PLATFORM_INFO,
>>>>    };
>>>>    
>>>>    static unsigned num_emulated_msrs;
>>>> @@ -2300,6 +2301,9 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>>>>    			return 1;
>>>>    		vcpu->arch.osvw.status = data;
>>>>    		break;
>>>> +	case MSR_PLATFORM_INFO:
>>>> +		return 1;
>>>> +		break;
>>>>    	default:
>>>>    		if (msr && (msr == vcpu->kvm->arch.xen_hvm_config.msr))
>>>>    			return xen_hvm_config(vcpu, data);
>>>> @@ -2517,6 +2521,9 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
>>>>    			return 1;
>>>>    		msr_info->data = vcpu->arch.osvw.status;
>>>>    		break;
>>>> +	case MSR_PLATFORM_INFO:
>>>> +		msr_info->data = 0;
>>>> +		break;
>>>>    	default:
>>>>    		if (kvm_pmu_is_valid_msr(vcpu, msr_info->index))
>>>>    			return kvm_pmu_get_msr(vcpu, msr_info->index, &msr_info->data);
>>>> -- 
>>>> 2.17.0
>>>>
>>
>> -- 
>> Best,
>> Denis