Re: [PATCH v6 8/8] kvm: vmx: virtualize split lock detection

From: Xiaoyao Li
Date: Thu Mar 26 2020 - 08:43:53 EST


On 3/26/2020 7:10 PM, Thomas Gleixner wrote:
Xiaoyao Li <xiaoyao.li@xxxxxxxxx> writes:
On 3/25/2020 8:40 AM, Thomas Gleixner wrote:
Xiaoyao Li <xiaoyao.li@xxxxxxxxx> writes:
static int handle_exception_nmi(struct kvm_vcpu *vcpu)
{
struct vcpu_vmx *vmx = to_vmx(vcpu);
@@ -4725,12 +4746,13 @@ static int handle_exception_nmi(struct kvm_vcpu *vcpu)
case AC_VECTOR:
/*
* Reflect #AC to the guest if it's expecting the #AC, i.e. has
- * legacy alignment check enabled. Pre-check host split lock
- * support to avoid the VMREADs needed to check legacy #AC,
- * i.e. reflect the #AC if the only possible source is legacy
- * alignment checks.
+ * legacy alignment check enabled or split lock detect enabled.
+ * Pre-check host split lock support to avoid further check of
+ * guest, i.e. reflect the #AC if host doesn't enable split lock
+ * detection.
*/
if (!split_lock_detect_on() ||
+ guest_cpu_split_lock_detect_on(vmx) ||
guest_cpu_alignment_check_enabled(vcpu)) {

If the host has split lock detection disabled then how is the guest
supposed to have it enabled in the first place?

It is ||

Again. If the host has it disabled, then the feature flag is OFF. So
how is the hypervisor exposing it in the first place?


So what's wrong with above code?

If the host has it disabled, !split_lock_detect_on() is true, it skips following check due to ||

I guess you want something like below?

if (!boot_cpu_has(X86_FEATURE_SPLIT_LOCK)) {
inject #AC back to guest
} else {
if (guest_alignment_check_enabled() || guest_sld_on())
inject #AC back to guest
}

BTW, there is an issue in my original patch that guest_sld_on() should be checked at last.