hrtimer: Tune hrtimer_interrupt hang logic
commit2605c157ed3bb18e66a6a08263448046f77ba5fb
authorThomas Gleixner <tglx@linutronix.de>
Fri, 13 Nov 2009 16:05:44 +0000 (13 17:05 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 1 Apr 2010 22:58:14 +0000 (1 15:58 -0700)
tree7edb829a2019f06b901070d292d001bd288cf43f
parent0192e1bfd9a979b014a59da0c32e50d4aa3f8f1d
hrtimer: Tune hrtimer_interrupt hang logic

commit 41d2e494937715d3150e5c75d01f0e75ae899337 upstream.

The hrtimer_interrupt hang logic adjusts min_delta_ns based on the
execution time of the hrtimer callbacks.

This is error-prone for virtual machines, where a guest vcpu can be
scheduled out during the execution of the callbacks (and the callbacks
themselves can do operations that translate to blocking operations in
the hypervisor), which in can lead to large min_delta_ns rendering the
system unusable.

Replace the current heuristics with something more reliable. Allow the
interrupt code to try 3 times to catch up with the lost time. If that
fails use the total time spent in the interrupt handler to defer the
next timer interrupt so the system can catch up with other things
which got delayed. Limit that deferment to 100ms.

The retry events and the maximum time spent in the interrupt handler
are recorded and exposed via /proc/timer_list

Inspired by a patch from Marcelo.

Reported-by: Michael Tokarev <mjt@tls.msk.ru>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Marcelo Tosatti <mtosatti@redhat.com>
Cc: kvm@vger.kernel.org
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
include/linux/hrtimer.h
kernel/hrtimer.c
kernel/time/timer_list.c