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, 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 the guest releases the slot, the processing is
resumed so the timer will be started then.

Signed-off-by: Roman Kagan <rka...@virtuozzo.com>
---
 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);
                        }
                }
-- 
2.13.3

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to