On 9/28/21 02:27, Li RongQing wrote:
directly call wbinvd for local pCPU, which can avoid ipi for
itself and calling of get_cpu/on_each_cpu_mask/etc.
Why is this an improvement? Trading get_cpu() vs preempt_disable()
seems like a negligible difference, and it makes the code more complicated.
In fact, This change reverts commit 2eec73437487 ("KVM: x86: Avoid
issuing wbinvd twice"), since smp_call_function_many is skiping the
local cpu (as description of c2162e13d6e2f), wbinvd is not issued
twice
and reverts commit c2162e13d6e2f ("KVM: X86: Fix missing local pCPU
when executing wbinvd on all dirty pCPUs") too, which fixed the
previous patch, when revert previous patch, it is not needed.
Signed-off-by: Li RongQing <lirongqing@xxxxxxxxx>
---
arch/x86/kvm/x86.c | 13 ++++++-------
1 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 28ef141..ee65941 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -6984,15 +6984,14 @@ static int kvm_emulate_wbinvd_noskip(struct kvm_vcpu *vcpu)
return X86EMUL_CONTINUE;
if (static_call(kvm_x86_has_wbinvd_exit)()) {
- int cpu = get_cpu();
-
- cpumask_set_cpu(cpu, vcpu->arch.wbinvd_dirty_mask);
- on_each_cpu_mask(vcpu->arch.wbinvd_dirty_mask,
+ preempt_disable();
+ smp_call_function_many(vcpu->arch.wbinvd_dirty_mask,
wbinvd_ipi, NULL, 1);
- put_cpu();
+ preempt_enable();
cpumask_clear(vcpu->arch.wbinvd_dirty_mask);
- } else
- wbinvd();
+ }
+
+ wbinvd();
return X86EMUL_CONTINUE;
}