linux/arch/arm/include/asm
Paolo Bonzini f781951299 kvm: add halt_poll_ns module parameter
This patch introduces a new module parameter for the KVM module; when it
is present, KVM attempts a bit of polling on every HLT before scheduling
itself out via kvm_vcpu_block.

This parameter helps a lot for latency-bound workloads---in particular
I tested it with O_DSYNC writes with a battery-backed disk in the host.
In this case, writes are fast (because the data doesn't have to go all
the way to the platters) but they cannot be merged by either the host or
the guest.  KVM's performance here is usually around 30% of bare metal,
or 50% if you use cache=directsync or cache=writethrough (these
parameters avoid that the guest sends pointless flush requests, and
at the same time they are not slow because of the battery-backed cache).
The bad performance happens because on every halt the host CPU decides
to halt itself too.  When the interrupt comes, the vCPU thread is then
migrated to a new physical CPU, and in general the latency is horrible
because the vCPU thread has to be scheduled back in.

With this patch performance reaches 60-65% of bare metal and, more
important, 99% of what you get if you use idle=poll in the guest.  This
means that the tunable gets rid of this particular bottleneck, and more
work can be done to improve performance in the kernel or QEMU.

Of course there is some price to pay; every time an otherwise idle vCPUs
is interrupted by an interrupt, it will poll unnecessarily and thus
impose a little load on the host.  The above results were obtained with
a mostly random value of the parameter (500000), and the load was around
1.5-2.5% CPU usage on one of the host's core for each idle guest vCPU.

The patch also adds a new stat, /sys/kernel/debug/kvm/halt_successful_poll,
that can be used to tune the parameter.  It counts how many HLT
instructions received an interrupt during the polling period; each
successful poll avoids that Linux schedules the VCPU thread out and back
in, and may also avoid a likely trip to C1 and back for the physical CPU.

While the VM is idle, a Linux 4 VCPU VM halts around 10 times per second.
Of these halts, almost all are failed polls.  During the benchmark,
instead, basically all halts end within the polling period, except a more
or less constant stream of 50 per second coming from vCPUs that are not
running the benchmark.  The wasted time is thus very low.  Things may
be slightly different for Windows VMs, which have a ~10 ms timer tick.

The effect is also visible on Marcelo's recently-introduced latency
test for the TSC deadline timer.  Though of course a non-RT kernel has
awful latency bounds, the latency of the timer is around 8000-10000 clock
cycles compared to 20000-120000 without setting halt_poll_ns.  For the TSC
deadline timer, thus, the effect is both a smaller average latency and
a smaller variance.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2015-02-06 13:08:37 +01:00
..
crypto ARM: 8119/1: crypto: sha1: add ARM NEON implementation 2014-08-02 08:51:47 +01:00
hardware ARM: removing support for etb/etm in "arch/arm/kernel/" 2014-11-07 15:19:33 -08:00
mach ARM/PCI: Remove unused pcibios_add_bus() and pcibios_remove_bus() 2014-11-21 09:34:29 -07:00
xen xen/arm/arm64: introduce xen_arch_need_swiotlb 2014-12-04 12:41:54 +00:00
arch_timer.h clocksource: arch_timer: Fix code to use physical timers when requested 2014-12-04 23:30:26 -08:00
asm-offsets.h
assembler.h ARM: convert all "mov.* pc, reg" to "bx reg" for ARMv6+ 2014-07-18 12:29:04 +01:00
atomic.h locking,arch: Use ACCESS_ONCE() instead of cast to volatile in atomic_read() 2014-10-03 06:06:23 +02:00
barrier.h arch: Add lightweight memory barriers dma_rmb() and dma_wmb() 2014-12-11 21:15:06 -05:00
bitops.h arch,arm: Convert smp_mb__*() 2014-04-18 11:40:32 +02:00
bL_switcher.h ARM: bL_switcher: Add query interface to discover CPU affinities 2013-09-23 18:47:31 -04:00
bug.h ARM: Correct BUG() assembly to ensure it is endian-agnostic 2013-10-19 20:46:35 +01:00
bugs.h
cache.h
cacheflush.h ARM: mm: allow text and rodata sections to be read-only 2014-10-16 14:38:54 -07:00
cachetype.h
checksum.h ARM: fix csum_tcpudp_magic() miscompilation 2013-12-29 12:32:41 +00:00
clkdev.h clk: Add common __clk_get(), __clk_put() implementations 2013-12-04 17:19:44 +01:00
cmpxchg.h ARM: 7984/1: prefetch: add prefetchw invocations for barriered atomics 2014-02-25 11:30:20 +00:00
compiler.h
cp15.h ARM: remove global cr_no_alignment 2014-06-02 09:20:18 +01:00
cpu.h
cpuidle.h cpuidle: Invert CPUIDLE_FLAG_TIME_VALID logic 2014-11-12 21:17:27 +01:00
cputype.h ARM: 8130/1: cpuidle/cpuidle-big_little: fix reading cpu id part number 2014-08-27 15:40:45 +01:00
cti.h
dcc.h ARM: tty: Move HVC DCC assembly to arch/arm 2014-05-28 13:33:18 -07:00
delay.h ARM: 7685/1: delay: use private ticks_per_jiffy field for timer-based delay ops 2013-04-03 16:45:50 +01:00
device.h arm: introduce is_device_dma_coherent 2014-12-04 12:41:50 +00:00
div64.h ARM: 8027/1: fix do_div() bug in big-endian systems 2014-04-22 22:23:57 +01:00
dma-contiguous.h drivers: dma-contiguous: clean source code and prepare for device tree 2013-08-27 09:18:29 +02:00
dma-iommu.h arm: dma-iommu: Clean up redundant variable 2014-05-20 13:43:26 +02:00
dma-mapping.h ARM: SoC/iommu configuration for 3.19 2014-12-16 14:53:01 -08:00
dma.h mm/memblock: add memblock memory allocation apis 2014-01-21 16:19:46 -08:00
domain.h
ecard.h
edac.h
elf.h ARM: 8127/1: module: add support for R_ARM_TARGET1 relocations 2014-08-27 15:40:11 +01:00
entry-macro-multi.S ARM: convert all "mov.* pc, reg" to "bx reg" for ARMv6+ 2014-07-18 12:29:04 +01:00
exception.h
fb.h
fiq.h
firmware.h ARM: firmware: add AFTR mode support to firmware do_idle method 2014-10-21 00:06:35 +09:00
fixmap.h arm: use fixmap for text patching when text is RO 2014-10-16 14:38:53 -07:00
flat.h
floppy.h ARM: 7996/1: floppy.h: remove deprecated IRQF_DISABLED 2014-03-12 10:32:29 +00:00
fncpy.h
fpstate.h
ftrace.h ARM: 8158/1: LLVMLinux: use static inline in ARM ftrace.h 2014-09-26 14:40:03 +01:00
futex.h ARM: 7984/1: prefetch: add prefetchw invocations for barriered atomics 2014-02-25 11:30:20 +00:00
glue-cache.h ARM: LLVMLinux: Change "extern inline" to "static inline" in glue-cache.h 2014-06-07 11:44:39 -07:00
glue-df.h ARM: 8065/1: remove last use of CONFIG_CPU_ARM710 2014-05-30 01:12:30 +01:00
glue-pf.h
glue-proc.h ARM: 8103/1: save/restore Cortex-A9 CP15 registers on suspend/resume 2014-07-18 12:29:37 +01:00
glue.h
gpio.h ARM: delete old reference to ARM_GPIOLIB_COMPLEX 2014-06-30 21:37:39 +02:00
hardirq.h Merge branch 'devel-stable' into for-next 2013-11-12 10:58:59 +00:00
highmem.h ARM: 8031/2: change fixmap mapping region to support 32 CPUs 2014-04-23 11:09:42 +01:00
hugetlb-3level.h ARM: mm: HugeTLB support for LPAE systems. 2013-06-04 16:52:37 +01:00
hugetlb.h ARM: mm: HugeTLB support for LPAE systems. 2013-06-04 16:52:37 +01:00
hw_breakpoint.h ARM: 7948/1: hw_breakpoint: Add ARMv8 support 2014-02-10 11:48:05 +00:00
hw_irq.h ARM: 8218/1: warn if bad IRQ was scheduled 2014-11-27 16:15:33 +00:00
hwcap.h ARM: 7981/1: add support for AT_HWCAP2 ELF auxv entry 2014-02-25 11:40:48 +00:00
hypervisor.h
ide.h
idmap.h ARM: KVM: move to a KVM provided HYP idmap 2013-04-28 22:23:08 -07:00
io.h ARM: Use include/asm-generic/io.h 2014-11-10 15:59:23 +01:00
irq_work.h arm: Tell irq work about self IPI support 2014-09-13 18:38:39 +02:00
irq.h arm: Move the set_handle_irq and handle_arch_irq declarations to asm/irq.h 2013-03-26 16:11:20 +00:00
irqflags.h ARM: Add base support for ARMv7-M 2013-04-17 21:38:10 +02:00
jump_label.h ARM: 7989/1: Delete asm/system.h 2014-02-25 11:33:37 +00:00
Kbuild net, lib: kill arch_fast_hash library bits 2014-12-10 15:17:46 -05:00
kexec.h
kgdb.h ARM: kdgb: use <asm/opcodes.h> for data to be assembled as intruction 2013-10-19 20:46:35 +01:00
kmap_types.h
kprobes.h ARM: Make arch_specific_insn a define for new arch_probes_insn structure 2014-03-18 16:39:40 -04:00
kvm_arm.h ARM: KVM: trap VM system registers until MMU and caches are ON 2014-03-03 01:15:24 +00:00
kvm_asm.h KVM: arm: Add ARMv7 API to flush TLBs 2015-01-16 14:40:14 +01:00
kvm_coproc.h
kvm_emulate.h arm/arm64: KVM: rework MPIDR assignment and add accessors 2015-01-20 18:25:17 +01:00
kvm_host.h kvm: add halt_poll_ns module parameter 2015-02-06 13:08:37 +01:00
kvm_mmio.h arm/arm64: KVM: add opaque private pointer to MMIO data 2015-01-20 18:25:30 +01:00
kvm_mmu.h KVM: arm: Add initial dirty page locking support 2015-01-16 14:40:14 +01:00
kvm_psci.h ARM/ARM64: KVM: Make kvm_psci_call() return convention more flexible 2014-04-30 04:18:57 -07:00
limits.h
linkage.h
mach-types.h
mc146818rtc.h
mcpm.h ARM: 8240/1: MCPM: document mcpm_sync_init() 2014-12-03 16:00:06 +00:00
mcs_spinlock.h ARM: 8098/1: mcs lock: implement wfe-based polling for MCS locking 2014-07-18 12:29:35 +01:00
memblock.h ARM: 8025/1: Get rid of meminfo 2014-06-01 01:17:12 +01:00
memory.h ARM: Use include/asm-generic/io.h 2014-11-10 15:59:23 +01:00
mmu_context.h ARM: 7790/1: Fix deferred mm switch on VIVT processors 2013-07-26 12:02:09 +01:00
mmu.h ARM: tlb: ASID macro should give 32bit result for BE correct operation 2013-10-19 20:46:36 +01:00
module.h ARM: 7829/1: Add ".text.unlikely" and ".text.hot" to arm unwind tables 2013-09-02 13:49:47 +01:00
mpu.h ARM: mpu: protect the vectors page with an MPU region 2013-06-17 15:13:18 +01:00
mtd-xip.h
mutex.h
neon.h ARM: add support for kernel mode NEON 2013-07-08 22:08:51 +01:00
nwflash.h
opcodes-sec.h
opcodes-virt.h
opcodes.h
outercache.h ARM: l2c: remove old .set_debug method 2014-05-30 00:50:35 +01:00
page-nommu.h
page.h ARM: make vectors page inaccessible from userspace 2013-08-01 14:31:58 +01:00
pci.h PCI: Turn pcibios_penalize_isa_irq() into a weak function 2014-05-27 16:23:58 -06:00
percpu.h ARM: 8174/1: Use global stack register variable for percpu 2014-11-13 23:58:06 +00:00
perf_event.h arm: perf: factor out callchain code 2014-10-30 12:16:58 +00:00
pgalloc.h ARM: 8235/1: Support for the PXN CPU feature on ARMv7 2014-12-03 15:57:45 +00:00
pgtable-2level-hwdef.h ARM: 8235/1: Support for the PXN CPU feature on ARMv7 2014-12-03 15:57:45 +00:00
pgtable-2level-types.h
pgtable-2level.h arm: mm: introduce special ptes for LPAE 2014-10-09 22:26:00 -04:00
pgtable-3level-hwdef.h ARM: 8235/1: Support for the PXN CPU feature on ARMv7 2014-12-03 15:57:45 +00:00
pgtable-3level-types.h
pgtable-3level.h KVM: arm: Add initial dirty page locking support 2015-01-16 14:40:14 +01:00
pgtable-hwdef.h
pgtable-nommu.h consolidate io_remap_pfn_range definitions 2013-06-29 12:46:35 +04:00
pgtable.h ARM: 8239/1: Introduce {set,clear}_pte_bit 2014-12-03 16:00:06 +00:00
pmu.h arm: perf: fold hotplug notifier into arm_pmu 2014-10-30 12:17:01 +00:00
probes.h ARM: Make arch_specific_insn a define for new arch_probes_insn structure 2014-03-18 16:39:40 -04:00
proc-fns.h Merge branch 'for-rmk/lpae' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux into devel-stable 2013-06-18 20:11:32 +01:00
processor.h arch, locking: Ciao arch_mutex_cpu_relax() 2014-07-17 12:32:47 +02:00
procinfo.h
prom.h of/fdt: move memreserve and dtb memory reservations into core 2014-04-30 00:59:17 -05:00
psci.h arm: Fix compile warning for psci 2014-05-27 15:58:49 +02:00
ptrace.h ARM: 8175/1: Use current_stack_pointer to calculate pt_regs address 2014-11-13 23:58:07 +00:00
seccomp.h
setup.h ARM: 8025/1: Get rid of meminfo 2014-06-01 01:17:12 +01:00
shmparam.h
signal.h
smp_plat.h ARM: 8130/1: cpuidle/cpuidle-big_little: fix reading cpu id part number 2014-08-27 15:40:45 +01:00
smp_scu.h ARM: make it easier to check the CPU part number correctly 2014-07-18 12:29:02 +01:00
smp_twd.h ARM: smp_twd: convert to use CLKSRC_OF init 2013-03-11 08:42:08 -05:00
smp.h ARM: 8131/1: arm/smp: Absorb boot_secondary() 2014-08-27 15:44:13 +01:00
sparsemem.h
spinlock_types.h ARM: locks: prefetch the destination word for write prior to strex 2013-09-30 16:42:55 +01:00
spinlock.h arm/spinlock: Replace ACCESS_ONCE with READ_ONCE 2014-12-18 09:54:40 +01:00
stackprotector.h
stacktrace.h ARM: 8070/1: Introduce arm_get_current_stack_frame() 2014-07-18 12:29:11 +01:00
string.h
suspend.h ARM: kernel: implement stack pointer save array through MPIDR hashing 2013-06-20 11:24:11 +01:00
swab.h
switch_to.h ARM: spinlock: use inner-shareable dsb variant prior to sev instruction 2013-08-12 12:25:45 +01:00
sync_bitops.h ARM: 7989/1: Delete asm/system.h 2014-02-25 11:33:37 +00:00
syscall.h ARM: 8152/1: Convert pr_warning to pr_warn 2014-09-26 14:39:53 +01:00
system_info.h ARM: Add base support for ARMv7-M 2013-04-17 21:38:10 +02:00
system_misc.h reboot: arm: change reboot_mode to use enum reboot_mode 2013-07-09 10:33:29 -07:00
tcm.h
therm.h
thread_info.h Merge branches 'fixes', 'misc', 'pm' and 'sa1100' into for-next 2014-12-05 16:30:47 +00:00
thread_notify.h
timex.h ARM: drop <mach/timex.h> for !ARCH_MULTIPLATFORM, too 2013-12-20 17:17:16 +01:00
tlb.h arm: mm: enable HAVE_RCU_TABLE_FREE logic 2014-10-09 22:26:01 -04:00
tlbflush.h ARM: 7855/1: Add check for Cortex-A15 errata 798181 ECO 2013-10-29 11:06:13 +00:00
tls.h ARM: 8178/1: fix set_tls for !CONFIG_KUSER_HELPERS 2014-09-30 16:55:23 +01:00
topology.h sched: Remove unused mc_capable() and smt_capable() 2014-03-11 12:05:45 +01:00
traps.h
trusted_foundations.h ARM: trusted_foundations: fix compile error on non-SMP 2014-05-23 21:28:11 +02:00
types.h ARM: 7822/1: add workaround for ambiguous C99 stdint.h types 2013-08-25 17:09:46 +01:00
uaccess.h ARM: 8137/1: fix get_user BE behavior for target variable with size of 8 bytes 2014-09-12 17:38:59 +01:00
ucontext.h
unified.h ARM: smp_on_up: move inline asm ALT_SMP patching macro out of spinlock.h 2013-09-30 16:42:55 +01:00
unistd.h ARM: wire up getrandom syscall 2014-08-09 14:07:53 +01:00
unwind.h
uprobes.h ARM: add uprobes support 2014-03-18 16:39:40 -04:00
user.h
v7m.h ARM: 7828/1: ARMv7-M: implement restart routine common to all v7-M machines 2013-09-02 13:49:29 +01:00
vfp.h ARM: 8197/1: vfp: Fix VFPv3 hwcap detection on CPUID based cpus 2014-11-21 15:24:43 +00:00
vfpmacros.h
vga.h
virt.h ARM: 7787/1: virt: ensure visibility of __boot_cpu_mode 2013-07-26 12:01:17 +01:00
word-at-a-time.h ARM: 7927/1: dcache: select DCACHE_WORD_ACCESS for big-endian CPUs 2013-12-29 12:46:50 +00:00
xor.h ARM: crypto: add NEON accelerated XOR implementation 2013-07-08 22:09:06 +01:00