[Devel] [PATCH vz7.6 v2] kvm: x86: hyperv: avoid livelock in oneshot SynIC timers

Konstantin Khorenko khorenko at virtuozzo.com
Mon Jul 24 11:36:50 MSK 2017


Once more: need this in vz7 update 5 or later?

--
Best regards,

Konstantin Khorenko,
Virtuozzo Linux Kernel Team

On 07/24/2017 10:33 AM, Roman Kagan wrote:
> If the SynIC timer message delivery fails due to SINT message slot being
> busy, there's no point to attempt starting the timer again until we're
> notified of the slot being released by the guest (via EOM or EOI).
>
> Even worse, when a oneshot timer fails to deliver its message, its
> re-arming with an expiration time in the past leads to immediate retry
> of the delivery, and so on, without ever letting the guest vcpu to run
> and release the slot, which results in a livelock.
>
> To avoid that, only start the timer when there's no timer message
> pending delivery.  When there is, meaning the slot is busy, the
> processing will be restarted upon notification from the guest that the
> slot is released.
>
> Signed-off-by: Roman Kagan <rkagan at virtuozzo.com>
> Signed-off-by: Radim Krčmář <rkrcmar at redhat.com>
> (cherry picked from commit f1ff89ec4447c4e39d275a1ca3de43eed2a92745)
> ---
> v1 -> v2:
>  - actual cherry-pick from mainline kernel
>
>  arch/x86/kvm/hyperv.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
> index c8efdce3e702..ab9501c2f32c 100644
> --- a/arch/x86/kvm/hyperv.c
> +++ b/arch/x86/kvm/hyperv.c
> @@ -632,9 +632,10 @@ void kvm_hv_process_stimers(struct kvm_vcpu *vcpu)
>  				}
>
>  				if ((stimer->config & HV_STIMER_ENABLE) &&
> -				    stimer->count)
> -					stimer_start(stimer);
> -				else
> +				    stimer->count) {
> +					if (!stimer->msg_pending)
> +						stimer_start(stimer);
> +				} else
>  					stimer_cleanup(stimer);
>  			}
>  		}
>


More information about the Devel mailing list