From: Wanpeng Li <wanpengli@xxxxxxxxxxx> In case of undercomitted scenarios, vCPU can get scheduling easily, kvm_vcpu_yield_to adds extra overhead, we can observe a lot of race between vcpu->ready is true and yield fails due to p->state is TASK_RUNNING. Let's bail out is such scenarios by checking the length of current cpu runqueue. Signed-off-by: Wanpeng Li <wanpengli@xxxxxxxxxxx> --- arch/x86/kvm/x86.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 5bd550e..c0244a6 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -8358,6 +8358,9 @@ static void kvm_sched_yield(struct kvm_vcpu *vcpu, unsigned long dest_id) struct kvm_vcpu *target = NULL; struct kvm_apic_map *map; + if (single_task_running()) + goto no_yield; + vcpu->stat.directed_yield_attempted++; rcu_read_lock(); -- 2.7.4