linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Xiaoyao Li <xiaoyao.li@linux.intel.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: linux-kernel <linux-kernel@vger.kernel.org>, x86 <x86@kernel.org>,
	kvm@vger.kernel.org
Subject: Re: [PATCH v4 17/17] kvm: vmx: Emulate TEST_CTL MSR
Date: Sat, 09 Mar 2019 10:31:57 +0800	[thread overview]
Message-ID: <58653d477d78b2a69927d8707522d91f091bcb52.camel@linux.intel.com> (raw)
In-Reply-To: <1551494711-213533-18-git-send-email-fenghua.yu@intel.com>

Hi, Paolo,

Do you have any comments on this patch?

We are preparing v5 patches for split lock detection, if you have any comments
about this one, please let me know.

Thanks,
Xiaoyao

On Fri, 2019-03-01 at 18:45 -0800, Fenghua Yu wrote:
> From: Xiaoyao Li <xiaoyao.li@linux.intel.com>
> 
> A control bit (bit 29) in TEST_CTL MSR 0x33 will be introduced in
> future x86 processors. When bit 29 is set, the processor causes #AC
> exception for split locked accesses at all CPL.
> 
> Please check the latest Intel Software Developer's Manual
> for more detailed information on the MSR and the split lock bit.
> 
> 1. Since the kernel chooses to enable AC split lock by default, which
> means if we don't emulate TEST_CTL MSR for guest, guest will run with
> this feature enable while does not known it. Thus existing guests with
> buggy firmware (like OVMF) and old kernels having the cross cache line
> issues will fail the boot due to #AC.
> 
> So we should emulate TEST_CTL MSR, and set it zero to disable AC split
> lock by default. Whether and when to enable it is left to guest firmware
> and guest kernel.
> 
> 2. Host and guest can enable AC split lock independently, so using
> msr autoload to switch it during VM entry/exit.
> 
> Signed-off-by: Xiaoyao Li <xiaoyao.li@linux.intel.com>
> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
> ---
>  arch/x86/kvm/vmx/vmx.c | 35 +++++++++++++++++++++++++++++++++++
>  arch/x86/kvm/vmx/vmx.h |  1 +
>  2 files changed, 36 insertions(+)
> 
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index 3e03c6e1e558..c0c5e8621afa 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -1659,6 +1659,12 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct
> msr_data *msr_info)
>  	u32 index;
>  
>  	switch (msr_info->index) {
> +	case MSR_TEST_CTL:
> +		if (!msr_info->host_initiated &&
> +		    !(vmx->core_capability & CORE_CAP_SPLIT_LOCK_DETECT))
> +			return 1;
> +		msr_info->data = vmx->msr_test_ctl;
> +		break;
>  #ifdef CONFIG_X86_64
>  	case MSR_FS_BASE:
>  		msr_info->data = vmcs_readl(GUEST_FS_BASE);
> @@ -1805,6 +1811,14 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct
> msr_data *msr_info)
>  	u32 index;
>  
>  	switch (msr_index) {
> +	case MSR_TEST_CTL:
> +		if (!(vmx->core_capability & CORE_CAP_SPLIT_LOCK_DETECT))
> +			return 1;
> +
> +		if (data & ~TEST_CTL_ENABLE_SPLIT_LOCK_DETECT)
> +			return 1;
> +		vmx->msr_test_ctl = data;
> +		break;
>  	case MSR_EFER:
>  		ret = kvm_set_msr_common(vcpu, msr_info);
>  		break;
> @@ -4108,6 +4122,9 @@ static void vmx_vcpu_setup(struct vcpu_vmx *vmx)
>  
>  	vmx->arch_capabilities = kvm_get_arch_capabilities();
>  
> +	/* disable AC split lock by default */
> +	vmx->msr_test_ctl = 0;
> +
>  	vm_exit_controls_init(vmx, vmx_vmexit_ctrl());
>  
>  	/* 22.2.1, 20.8.1 */
> @@ -4145,6 +4162,7 @@ static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool
> init_event)
>  
>  	vmx->rmode.vm86_active = 0;
>  	vmx->spec_ctrl = 0;
> +	vmx->msr_test_ctl = 0;
>  
>  	vcpu->arch.microcode_version = 0x100000000ULL;
>  	vmx->vcpu.arch.regs[VCPU_REGS_RDX] = get_rdx_init_val();
> @@ -6344,6 +6362,21 @@ static void atomic_switch_perf_msrs(struct vcpu_vmx
> *vmx)
>  					msrs[i].host, false);
>  }
>  
> +static void atomic_switch_msr_test_ctl(struct vcpu_vmx *vmx)
> +{
> +	u64 host_msr_test_ctl;
> +
> +	if (!boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT))
> +		return;
> +
> +	rdmsrl(MSR_TEST_CTL, host_msr_test_ctl);
> +	if (host_msr_test_ctl == vmx->msr_test_ctl)
> +		clear_atomic_switch_msr(vmx, MSR_TEST_CTL);
> +	else
> +		add_atomic_switch_msr(vmx, MSR_TEST_CTL, vmx->msr_test_ctl,
> +				      host_msr_test_ctl, false);
> +}
> +
>  static void vmx_arm_hv_timer(struct vcpu_vmx *vmx, u32 val)
>  {
>  	vmcs_write32(VMX_PREEMPTION_TIMER_VALUE, val);
> @@ -6585,6 +6618,8 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu)
>  
>  	atomic_switch_perf_msrs(vmx);
>  
> +	atomic_switch_msr_test_ctl(vmx);
> +
>  	vmx_update_hv_timer(vcpu);
>  
>  	/*
> diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h
> index cc22379991f3..e8831609c6c3 100644
> --- a/arch/x86/kvm/vmx/vmx.h
> +++ b/arch/x86/kvm/vmx/vmx.h
> @@ -191,6 +191,7 @@ struct vcpu_vmx {
>  	u64		      msr_guest_kernel_gs_base;
>  #endif
>  
> +	u64		      msr_test_ctl;
>  	u64		      core_capability;
>  	u64		      arch_capabilities;
>  	u64		      spec_ctrl;


  reply	other threads:[~2019-03-09  2:35 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-02  2:44 [PATCH v4 00/17] x86/split_lock: Enable #AC exception for split locked accesses Fenghua Yu
2019-03-02  2:44 ` [PATCH v4 01/17] x86/common: Align cpu_caps_cleared and cpu_caps_set to unsigned long Fenghua Yu
2019-03-04  8:33   ` Paolo Bonzini
2019-03-04 10:17     ` Peter Zijlstra
2019-03-04 10:48       ` Paolo Bonzini
2019-03-04 12:44         ` Peter Zijlstra
2019-03-04 13:13           ` Paolo Bonzini
2019-03-02  2:44 ` [PATCH v4 02/17] drivers/net/b44: Align pwol_mask to unsigned long for better performance Fenghua Yu
2019-03-04 10:00   ` Peter Zijlstra
2019-03-04 14:45     ` Fenghua Yu
2019-03-04 15:27       ` Peter Zijlstra
2019-03-02  2:44 ` [PATCH v4 03/17] wlcore: Align reg_ch_conf_pending and tmp_ch_bitmap " Fenghua Yu
2019-03-04 10:11   ` Peter Zijlstra
2019-03-04 10:46     ` Paolo Bonzini
2019-03-04 12:41       ` Peter Zijlstra
2019-03-04 13:09         ` Paolo Bonzini
2019-03-04 13:30           ` Peter Zijlstra
2019-03-04 14:40       ` Fenghua Yu
2019-03-04 15:54         ` Paolo Bonzini
2019-03-02  2:44 ` [PATCH v4 04/17] x86/split_lock: Align x86_capability to unsigned long to avoid split locked access Fenghua Yu
2019-03-04 18:52   ` Dave Hansen
2019-03-04 19:15     ` Fenghua Yu
2019-03-04 19:29       ` Dave Hansen
2019-03-04 20:08       ` Peter Zijlstra
2019-03-04 20:12     ` Peter Zijlstra
2019-03-02  2:44 ` [PATCH v4 05/17] x86/cpufeatures: Enumerate IA32_CORE_CAPABILITIES MSR Fenghua Yu
2019-03-04 18:53   ` Dave Hansen
2019-03-04 18:55     ` Yu, Fenghua
2019-03-04 19:01       ` Dave Hansen
2019-03-02  2:45 ` [PATCH v4 06/17] x86/msr-index: Define IA32_CORE_CAPABILITY MSR and #AC exception for split lock bit Fenghua Yu
2019-03-02  2:45 ` [PATCH v4 07/17] x86/split_lock: Enumerate #AC for split lock by MSR IA32_CORE_CAPABILITY Fenghua Yu
2019-03-04 18:58   ` Dave Hansen
2019-03-04 18:59     ` Fenghua Yu
2019-03-04 19:19       ` Dave Hansen
2019-03-02  2:45 ` [PATCH v4 08/17] x86/clearcpuid: Support multiple clearcpuid options Fenghua Yu
2019-03-02  2:45 ` [PATCH v4 09/17] x86/clearcpuid: Support feature flag string in kernel option clearcpuid Fenghua Yu
2019-03-02  2:45 ` [PATCH v4 10/17] x86/clearcpuid: Apply cleared feature bits that are forced set before Fenghua Yu
2019-03-02  2:45 ` [PATCH v4 11/17] x86/clearcpuid: Clear CPUID bit in CPUID faulting Fenghua Yu
2019-03-04 22:04   ` kbuild test robot
2019-03-05  7:27   ` kbuild test robot
2019-03-02  2:45 ` [PATCH v4 12/17] Change document for kernel option clearcpuid Fenghua Yu
2019-03-02  2:45 ` [PATCH v4 13/17] x86/split_lock: Handle #AC exception for split lock Fenghua Yu
2019-03-02  2:45 ` [PATCH v4 14/17] x86/split_lock: Add a sysfs interface to allow user to enable or disable split lock detection on all CPUs during run time Fenghua Yu
2019-03-02  2:45 ` [PATCH v4 15/17] kvm: x86: Report CORE_CAPABILITY on GET_SUPPORTED_CPUID Fenghua Yu
2019-03-04  8:38   ` Paolo Bonzini
2019-03-04 10:47     ` Xiaoyao Li
2019-03-04 10:49       ` Paolo Bonzini
2019-03-04 11:10         ` Xiaoyao Li
2019-03-04 11:14           ` Paolo Bonzini
2019-03-04 11:21             ` Xiaoyao Li
2019-03-05  7:03             ` Xiaoyao Li
2019-03-02  2:45 ` [PATCH v4 16/17] kvm: x86: Add support IA32_CORE_CAPABILITY MSR Fenghua Yu
2019-03-04  8:42   ` Paolo Bonzini
2019-03-04 12:32     ` Xiaoyao Li
2019-03-08  6:10     ` Xiaoyao Li
2019-03-08  7:54       ` Paolo Bonzini
2019-03-08  8:03         ` Xiaoyao Li
2019-03-02  2:45 ` [PATCH v4 17/17] kvm: vmx: Emulate TEST_CTL MSR Fenghua Yu
2019-03-09  2:31   ` Xiaoyao Li [this message]
2019-03-11 13:31     ` Paolo Bonzini
2019-03-11 15:10       ` Xiaoyao Li
2019-03-11 15:21         ` Paolo Bonzini
2019-03-11 16:58           ` Xiaoyao Li
2019-03-04 21:55 ` [PATCH v4 00/17] x86/split_lock: Enable #AC exception for split locked accesses Konrad Rzeszutek Wilk
2019-03-05  0:06   ` Fenghua Yu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=58653d477d78b2a69927d8707522d91f091bcb52.camel@linux.intel.com \
    --to=xiaoyao.li@linux.intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).