linux/arch/arm/kvm
Christoffer Dall d35268da66 arm/arm64: KVM: arch_timer: Only schedule soft timer on vcpu_block
We currently schedule a soft timer every time we exit the guest if the
timer did not expire while running the guest.  This is really not
necessary, because the only work we do in the timer work function is to
kick the vcpu.

Kicking the vcpu does two things:
(1) If the vpcu thread is on a waitqueue, make it runnable and remove it
from the waitqueue.
(2) If the vcpu is running on a different physical CPU from the one
doing the kick, it sends a reschedule IPI.

The second case cannot happen, because the soft timer is only ever
scheduled when the vcpu is not running.  The first case is only relevant
when the vcpu thread is on a waitqueue, which is only the case when the
vcpu thread has called kvm_vcpu_block().

Therefore, we only need to make sure a timer is scheduled for
kvm_vcpu_block(), which we do by encapsulating all calls to
kvm_vcpu_block() with kvm_timer_{un}schedule calls.

Additionally, we only schedule a soft timer if the timer is enabled and
unmasked, since it is useless otherwise.

Note that theoretically userspace can use the SET_ONE_REG interface to
change registers that should cause the timer to fire, even if the vcpu
is blocked without a scheduled timer, but this case was not supported
before this patch and we leave it for future work for now.

Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
2015-10-22 23:01:42 +02:00
..
arm.c arm/arm64: KVM: arch_timer: Only schedule soft timer on vcpu_block 2015-10-22 23:01:42 +02:00
coproc_a7.c arm/arm64: KVM: Use set/way op trapping to track the state of the caches 2015-01-29 23:24:56 +01:00
coproc_a15.c arm/arm64: KVM: Use set/way op trapping to track the state of the caches 2015-01-29 23:24:56 +01:00
coproc.c arm/arm64: KVM: Use set/way op trapping to track the state of the caches 2015-01-29 23:24:56 +01:00
coproc.h arm/arm64: KVM: Use set/way op trapping to track the state of the caches 2015-01-29 23:24:56 +01:00
emulate.c KVM: ARM: Fix typo in comments of inject_abt() 2013-10-02 17:29:19 +01:00
guest.c KVM: arm: guest debug, add stub KVM_SET_GUEST_DEBUG ioctl 2015-07-21 12:47:08 +01:00
handle_exit.c ARM: KVM: extend WFI tracepoint to differentiate between wfi and wfe 2015-01-15 13:12:27 +01:00
init.S ARM: kvm: round HYP section to page size instead of log2 upper bound 2015-03-27 12:21:27 +00:00
interrupts_head.S arm: KVM: Disable virtual timer even if the guest is not using it 2015-09-17 13:11:48 +01:00
interrupts.S arm: KVM: keep arm vfp/simd exit handling consistent with arm64 2015-08-19 22:27:58 +01:00
Kconfig KVM: arm: use GIC support unconditionally 2015-10-20 18:04:49 +02:00
Makefile KVM: arm/arm64: Enable the KVM-VFIO device 2015-06-17 09:46:29 +01:00
mmio.c KVM: arm/arm64: rework MMIO abort handling to use KVM MMIO bus 2015-03-30 17:07:19 +01:00
mmu.c arm: KVM: Fix incorrect device to IPA mapping 2015-09-16 14:50:45 +01:00
perf.c ARM: KVM: add support for minimal host vs guest profiling 2013-04-28 21:44:01 -07:00
psci.c arm/arm64: KVM: Fix PSCI affinity info return value for non valid cores 2015-09-04 17:02:48 +01:00
reset.c KVM: arm/arm64: timer: Allow the timer to control the active state 2015-08-12 11:28:26 +01:00
trace.h arm/arm64: KVM: Optimize handling of Access Flag faults 2015-03-12 22:34:49 +01:00