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
7206 7206
7207 rcu_read_unlock();7207 rcu_read_unlock();
7208 7208
7209 if (target)7209 if (target && READ_ONCE(target->ready))
7210 kvm_vcpu_yield_to(target);7210 kvm_vcpu_yield_to(target);
7211}7211}
7212 7212
@@ -7246,6 +7246,7 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) · 33 unmodified lines
7246 break;7246 break;
7247 case KVM_HC_KICK_CPU:7247 case KVM_HC_KICK_CPU:
7248 kvm_pv_kick_cpu_op(vcpu->kvm, a0, a1);7248 kvm_pv_kick_cpu_op(vcpu->kvm, a0, a1);
7249 kvm_sched_yield(vcpu->kvm, a1);
7249 ret = 0;7250 ret = 0;
7250 break;7251 break;
7251#ifdef CONFIG_X86_647252#ifdef CONFIG_X86_64