linux/arch/powerpc/kvm
Suraj Jitindar Singh 0cda69dd7c KVM: PPC: Book3S HV: Implement halt polling
This patch introduces new halt polling functionality into the kvm_hv kernel
module. When a vcore is idle it will poll for some period of time before
scheduling itself out.

When all of the runnable vcpus on a vcore have ceded (and thus the vcore is
idle) we schedule ourselves out to allow something else to run. In the
event that we need to wake up very quickly (for example an interrupt
arrives), we are required to wait until we get scheduled again.

Implement halt polling so that when a vcore is idle, and before scheduling
ourselves, we poll for vcpus in the runnable_threads list which have
pending exceptions or which leave the ceded state. If we poll successfully
then we can get back into the guest very quickly without ever scheduling
ourselves, otherwise we schedule ourselves out as before.

There exists generic halt_polling code in virt/kvm_main.c, however on
powerpc the polling conditions are different to the generic case. It would
be nice if we could just implement an arch specific kvm_check_block()
function, but there is still other arch specific things which need to be
done for kvm_hv (for example manipulating vcore states) which means that a
separate implementation is the best option.

Testing of this patch with a TCP round robin test between two guests with
virtio network interfaces has found a decrease in round trip time of ~15us
on average. A performance gain is only seen when going out of and
back into the guest often and quickly, otherwise there is no net benefit
from the polling. The polling interval is adjusted such that when we are
often scheduled out for long periods of time it is reduced, and when we
often poll successfully it is increased. The rate at which the polling
interval increases or decreases, and the maximum polling interval, can
be set through module parameters.

Based on the implementation in the generic kvm module by Wanpeng Li and
Paolo Bonzini, and on direction from Paul Mackerras.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
2016-09-08 12:21:45 +10:00
..
book3s_32_mmu_host.c powerpc/mm: Move hash related mmu-*.h headers to book3s/ 2016-03-03 21:19:21 +11:00
book3s_32_mmu.c arch: powerpc: kvm: book3s_32_mmu.c: Remove unused function 2014-12-17 13:12:25 +01:00
book3s_32_sr.S KVM: PPC: book3s_pr: Simplify transitions between virtual and real mode 2011-09-25 19:52:29 +03:00
book3s_64_mmu_host.c powerpc/mm: Move hash table ops to a separate structure 2016-07-21 18:59:09 +10:00
book3s_64_mmu_hv.c powerpc/mm: Drop WIMG in favour of new constants 2016-05-01 18:32:33 +10:00
book3s_64_mmu.c powerpc/mm: Move hash related mmu-*.h headers to book3s/ 2016-03-03 21:19:21 +11:00
book3s_64_slb.S KVM: PPC: Book3S PR: Rework SLB switching code 2014-05-30 14:26:30 +02:00
book3s_64_vio_hv.c KVM: PPC: Create a virtual-mode only TCE table handlers 2016-03-22 12:02:51 +01:00
book3s_64_vio.c powerpc/kvm: Clarify __user annotations 2016-07-14 20:43:50 +10:00
book3s_emulate.c KVM: PPC: Fix warnings from sparse 2015-08-22 11:16:16 +02:00
book3s_exports.c KVM: PPC: Make shared struct aka magic page guest endian 2014-05-30 14:26:21 +02:00
book3s_hv_builtin.c KVM: PPC: Book3S HV: Host-side RM data structures 2016-02-29 16:25:06 +11:00
book3s_hv_interrupts.S powerpc/kvm: Create proper names for the kvm_host_state PMU fields 2014-12-29 15:45:55 +11:00
book3s_hv_ras.c KVM: PPC: Book3S HV: Fix TB corruption in guest exit path on HMI interrupt 2016-06-20 14:11:25 +10:00
book3s_hv_rm_mmu.c powerpc/mm: Drop WIMG in favour of new constants 2016-05-01 18:32:33 +10:00
book3s_hv_rm_xics.c KVM: PPC: Book3S HV: Add tunable to control H_IPI redirection 2016-02-29 16:25:06 +11:00
book3s_hv_rmhandlers.S - ARM: GICv3 ITS emulation and various fixes. Removal of the old 2016-08-02 16:11:27 -04:00
book3s_hv.c KVM: PPC: Book3S HV: Implement halt polling 2016-09-08 12:21:45 +10:00
book3s_interrupts.S powerpc: Define and use PPC64_ELF_ABI_v2/v1 2016-06-14 13:58:27 +10:00
book3s_mmu_hpte.c kvm: powerpc: book3s: pr: move PR related tracepoints to a separate header 2013-10-17 15:36:22 +02:00
book3s_paired_singles.c powerpc: Create disable_kernel_{fp,altivec,vsx,spe}() 2015-12-01 13:52:25 +11:00
book3s_pr_papr.c KVM: PPC: Add support for multiple-TCE hcalls 2016-02-16 13:44:26 +11:00
book3s_pr.c - ARM: GICv3 ITS emulation and various fixes. Removal of the old 2016-08-02 16:11:27 -04:00
book3s_rmhandlers.S powerpc: Define and use PPC64_ELF_ABI_v2/v1 2016-06-14 13:58:27 +10:00
book3s_rtas.c KVM: PPC: RTAS: Do byte swaps explicitly 2014-07-07 23:17:20 +02:00
book3s_segment.S KVM: PPC: Book3S: correct width in XER handling 2015-08-22 11:16:19 +02:00
book3s_xics.c KVM: PPC: Book3S: Don't crash if irqfd used with no in-kernel XICS emulation 2016-08-19 13:00:06 +10:00
book3s_xics.h KVM: PPC: Book3S HV: Re-enable XICS fast path for irqfd-generated interrupts 2016-05-12 16:40:55 +10:00
book3s.c KVM: halt_polling: provide a way to qualify wakeups during poll 2016-05-13 17:29:23 +02:00
book3s.h kvm: Fix page ageing bugs 2014-09-24 14:07:58 +02:00
booke_emulate.c KVM: PPC: BOOKE: Emulate debug registers and exception 2014-09-22 10:11:33 +02:00
booke_interrupts.S KVM: PPC: Remove 440 support 2014-07-28 15:23:15 +02:00
booke.c KVM: remove kvm_guest_enter/exit wrappers 2016-07-01 11:03:21 +02:00
booke.h KVM: PPC: Book3e: Add AltiVec support 2014-09-22 10:11:32 +02:00
bookehv_interrupts.S powerpc/kvm: common sw breakpoint instr across ppc 2014-09-22 10:11:36 +02:00
e500_emulate.c KVM: PPC: e500: Emulate TMCFG0 TMRN register 2015-10-15 15:58:16 +11:00
e500_mmu_host.c kvm: rename pfn_t to kvm_pfn_t 2016-01-15 17:56:32 -08:00
e500_mmu_host.h KVM: PPC: E500: Make clear_tlb_refs and clear_tlb1_bitmap static 2013-01-24 19:23:33 +01:00
e500_mmu.c KVM: PPC: fix suspicious use of conditional operator 2015-08-22 11:16:16 +02:00
e500.c KVM: PPC: e500: fix handling local_sid_lookup result 2015-10-15 15:58:16 +11:00
e500.h kvm: rename pfn_t to kvm_pfn_t 2016-01-15 17:56:32 -08:00
e500mc.c powerpc: Fix misspellings in comments. 2016-03-01 19:27:20 +11:00
emulate_loadstore.c KVM: PPC: Pass enum to kvmppc_get_last_inst 2014-09-22 10:11:36 +02:00
emulate.c KVM: PPC: Book3S PR: Fix illegal opcode emulation 2016-06-20 14:11:25 +10:00
fpu.S
irq.h KVM: PPC: Book3S: Add API for in-kernel XICS emulation 2013-05-02 15:28:36 +02:00
Kconfig KVM: PPC: Always select KVM_VFIO, plus Makefile cleanup 2016-08-25 22:25:49 +10:00
Makefile KVM: PPC: Always select KVM_VFIO, plus Makefile cleanup 2016-08-25 22:25:49 +10:00
mpic.c KVM: pass struct kvm to kvm_set_routing_entry 2016-07-14 09:03:56 +02:00
powerpc.c KVM: PPC: Implement kvm_arch_intc_initialized() for PPC 2016-08-19 13:00:06 +10:00
timing.c KVM: PPC: Remove DCR handling 2014-07-28 19:29:15 +02:00
timing.h KVM: PPC: Remove DCR handling 2014-07-28 19:29:15 +02:00
trace_book3s.h KVM: PPC: Book3S HV: Tracepoints for KVM HV guest interactions 2014-12-17 13:29:27 +01:00
trace_booke.h KVM: PPC: BookE: Improve irq inject tracepoint 2014-12-15 13:27:23 +01:00
trace_hv.h KVM: PPC: Book3S HV: Implement halt polling 2016-09-08 12:21:45 +10:00
trace_pr.h kvm: rename pfn_t to kvm_pfn_t 2016-01-15 17:56:32 -08:00
trace.h kvm: powerpc: booke: Move booke related tracepoints to separate header 2013-10-17 15:37:16 +02:00