History

KVM: X86: Boost queue head vCPU to mitigate lock waiter preemption

Commit 11752adb (locking/pvqspinlock: Implement hybrid PV queued/unfair locks) introduces hybrid PV queued/unfair locks - queued mode (no starvation) - unfair mode (good performance on not heavily contended lock) The lock waiter goes into the unfair mode especially in VMs with over-commit vCPUs since increaing over-commitment increase the likehood that the queue head vCPU may have been preempted and not actively spinning. However, reschedule queue head vCPU timely to acquire the lock still can get better performance than just depending on lock stealing in over-subscribe scenario. Testing on 80 HT 2 socket Xeon Skylake server, with 80 vCPUs VM 80GB RAM: ebizzy -M vanilla boosting improved 1VM 23520 25040 6% 2VM 8000 13600 70% 3VM 3100 5400 74% The lock holder vCPU yields to the queue head vCPU when unlock, to boost queue head vCPU which is involuntary preemption or the one which is voluntary halt due to fail to acquire the lock after a short spin in the guest.

Wanpeng Li committed 7 years ago

Commit 266e85a1 parent 2f5947d1 file · +2 −1Browse files

Unified · Split

arch/x86/kvm/x86.c+2−1
@@ -7206,7 +7206,7 @@ static void kvm_sched_yield(struct kvm *kvm, unsigned long dest_id) · 7205 unmodified lines
72067206
72077207 rcu_read_unlock();
72087208
7209− if (target)
7209+ if (target && READ_ONCE(target->ready))
72107210 kvm_vcpu_yield_to(target);
72117211 }
72127212
@@ -7246,6 +7246,7 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) · 33 unmodified lines
72467246 break;
72477247 case KVM_HC_KICK_CPU:
72487248 kvm_pv_kick_cpu_op(vcpu->kvm, a0, a1);
7249+ kvm_sched_yield(vcpu->kvm, a1);
72497250 ret = 0;
72507251 break;
72517252 #ifdef CONFIG_X86_64