• Christoffer Dall's avatar
    arm/arm64: KVM: arch_timer: Only schedule soft timer on vcpu_block · d35268da
    Christoffer Dall authored
    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: default avatarChristoffer Dall <christoffer.dall@linaro.org>
    d35268da
arch_timer.c 10.6 KB