| From 217050052dc8c7e3b35a37c6dbcf0adeaaba3c77 Mon Sep 17 00:00:00 2001 |
| From: Wanpeng Li <wanpengli@tencent.com> |
| Date: Mon, 9 Sep 2019 09:40:28 +0800 |
| Subject: [PATCH] Revert "locking/pvqspinlock: Don't wait if vCPU is preempted" |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit 89340d0935c9296c7b8222b6eab30e67cb57ab82 upstream. |
| |
| This patch reverts commit 75437bb304b20 (locking/pvqspinlock: Don't |
| wait if vCPU is preempted). A large performance regression was caused |
| by this commit. on over-subscription scenarios. |
| |
| The test was run on a Xeon Skylake box, 2 sockets, 40 cores, 80 threads, |
| with three VMs of 80 vCPUs each. The score of ebizzy -M is reduced from |
| 13000-14000 records/s to 1700-1800 records/s: |
| |
| Host Guest score |
| |
| vanilla w/o kvm optimizations upstream 1700-1800 records/s |
| vanilla w/o kvm optimizations revert 13000-14000 records/s |
| vanilla w/ kvm optimizations upstream 4500-5000 records/s |
| vanilla w/ kvm optimizations revert 14000-15500 records/s |
| |
| Exit from aggressive wait-early mechanism can result in premature yield |
| and extra scheduling latency. |
| |
| Actually, only 6% of wait_early events are caused by vcpu_is_preempted() |
| being true. However, when one vCPU voluntarily releases its vCPU, all |
| the subsequently waiters in the queue will do the same and the cascading |
| effect leads to bad performance. |
| |
| kvm optimizations: |
| [1] commit d73eb57b80b (KVM: Boost vCPUs that are delivering interrupts) |
| [2] commit 266e85a5ec9 (KVM: X86: Boost queue head vCPU to mitigate lock waiter preemption) |
| |
| Tested-by: loobinliu@tencent.com |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Ingo Molnar <mingo@kernel.org> |
| Cc: Waiman Long <longman@redhat.com> |
| Cc: Paolo Bonzini <pbonzini@redhat.com> |
| Cc: Radim Krčmář <rkrcmar@redhat.com> |
| Cc: loobinliu@tencent.com |
| Cc: stable@vger.kernel.org |
| Fixes: 75437bb304b20 (locking/pvqspinlock: Don't wait if vCPU is preempted) |
| Signed-off-by: Wanpeng Li <wanpengli@tencent.com> |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/kernel/locking/qspinlock_paravirt.h b/kernel/locking/qspinlock_paravirt.h |
| index 89bab079e7a4..e84d21aa0722 100644 |
| --- a/kernel/locking/qspinlock_paravirt.h |
| +++ b/kernel/locking/qspinlock_paravirt.h |
| @@ -269,7 +269,7 @@ pv_wait_early(struct pv_node *prev, int loop) |
| if ((loop & PV_PREV_CHECK_MASK) != 0) |
| return false; |
| |
| - return READ_ONCE(prev->state) != vcpu_running || vcpu_is_preempted(prev->cpu); |
| + return READ_ONCE(prev->state) != vcpu_running; |
| } |
| |
| /* |
| -- |
| 2.7.4 |
| |