]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: x86: Yield to IPI target vCPU only if it is busy
authorLi RongQing <lirongqing@baidu.com>
Wed, 9 Feb 2022 04:16:41 +0000 (12:16 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 25 Feb 2022 15:09:35 +0000 (10:09 -0500)
When sending a call-function IPI-many to vCPUs, yield to the
IPI target vCPU which is marked as preempted.

but when emulating HLT, an idling vCPU will be voluntarily
scheduled out and mark as preempted from the guest kernel
perspective. yielding to idle vCPU is pointless and increase
unnecessary vmexit, maybe miss the true preempted vCPU

so yield to IPI target vCPU only if vCPU is busy and preempted

Signed-off-by: Li RongQing <lirongqing@baidu.com>
Message-Id: <1644380201-29423-1-git-send-email-lirongqing@baidu.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kernel/kvm.c

index 491e1d9ca7504916fa5f040ae3c327059dbbb152..d77481ecb0d5f51fcdd17cd4d4f2c4d32242c05f 100644 (file)
@@ -624,7 +624,7 @@ static void kvm_smp_send_call_func_ipi(const struct cpumask *mask)
 
        /* Make sure other vCPUs get a chance to run if they need to. */
        for_each_cpu(cpu, mask) {
-               if (vcpu_is_preempted(cpu)) {
+               if (!idle_cpu(cpu) && vcpu_is_preempted(cpu)) {
                        kvm_hypercall1(KVM_HC_SCHED_YIELD, per_cpu(x86_cpu_to_apicid, cpu));
                        break;
                }