![Marc Zyngier](/assets/img/avatar_default.png)
On an (even slightly) oversubscribed system, spinlocks are quickly becoming a bottleneck, as some vcpus are spinning, waiting for a lock to be released, while the vcpu holding the lock may not be running at all. This creates contention, and the observed slowdown is 40x for hackbench. No, this isn't a typo. The solution is to trap blocking WFEs and tell KVM that we're now spinning. This ensures that other vpus will get a scheduling boost, allowing the lock to be released more quickly. Also, using CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT slightly improves the performance when the VM is severely overcommited. Quick test to estimate the performance: hackbench 1 process 1000 2xA15 host (baseline): 1.843s 2xA15 guest w/o patch: 2.083s 4xA15 guest w/o patch: 80.212s 8xA15 guest w/o patch: Could not be bothered to find out 2xA15 guest w/ patch: 2.102s 4xA15 guest w/ patch: 3.205s 8xA15 guest w/ patch: 6.887s So we go from a 40x degradation to 1.5x in the 2x overcommit case, which is vaguely more acceptable. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
72 lines
1.8 KiB
Plaintext
72 lines
1.8 KiB
Plaintext
#
|
|
# KVM configuration
|
|
#
|
|
|
|
source "virt/kvm/Kconfig"
|
|
|
|
menuconfig VIRTUALIZATION
|
|
bool "Virtualization"
|
|
---help---
|
|
Say Y here to get to see options for using your Linux host to run
|
|
other operating systems inside virtual machines (guests).
|
|
This option alone does not add any kernel code.
|
|
|
|
If you say N, all options in this submenu will be skipped and
|
|
disabled.
|
|
|
|
if VIRTUALIZATION
|
|
|
|
config KVM
|
|
bool "Kernel-based Virtual Machine (KVM) support"
|
|
select PREEMPT_NOTIFIERS
|
|
select ANON_INODES
|
|
select HAVE_KVM_CPU_RELAX_INTERCEPT
|
|
select KVM_MMIO
|
|
select KVM_ARM_HOST
|
|
depends on ARM_VIRT_EXT && ARM_LPAE
|
|
---help---
|
|
Support hosting virtualized guest machines. You will also
|
|
need to select one or more of the processor modules below.
|
|
|
|
This module provides access to the hardware capabilities through
|
|
a character device node named /dev/kvm.
|
|
|
|
If unsure, say N.
|
|
|
|
config KVM_ARM_HOST
|
|
bool "KVM host support for ARM cpus."
|
|
depends on KVM
|
|
depends on MMU
|
|
select MMU_NOTIFIER
|
|
---help---
|
|
Provides host support for ARM processors.
|
|
|
|
config KVM_ARM_MAX_VCPUS
|
|
int "Number maximum supported virtual CPUs per VM"
|
|
depends on KVM_ARM_HOST
|
|
default 4
|
|
help
|
|
Static number of max supported virtual CPUs per VM.
|
|
|
|
If you choose a high number, the vcpu structures will be quite
|
|
large, so only choose a reasonable number that you expect to
|
|
actually use.
|
|
|
|
config KVM_ARM_VGIC
|
|
bool "KVM support for Virtual GIC"
|
|
depends on KVM_ARM_HOST && OF
|
|
select HAVE_KVM_IRQCHIP
|
|
default y
|
|
---help---
|
|
Adds support for a hardware assisted, in-kernel GIC emulation.
|
|
|
|
config KVM_ARM_TIMER
|
|
bool "KVM support for Architected Timers"
|
|
depends on KVM_ARM_VGIC && ARM_ARCH_TIMER
|
|
select HAVE_KVM_IRQCHIP
|
|
default y
|
|
---help---
|
|
Adds support for the Architected Timers in virtual machines
|
|
|
|
endif # VIRTUALIZATION
|