From patchwork Sat Oct 3 23:12:05 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcelo Tosatti X-Patchwork-Id: 51561 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n93NFTL4001920 for ; Sat, 3 Oct 2009 23:15:29 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752257AbZJCXOD (ORCPT ); Sat, 3 Oct 2009 19:14:03 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752190AbZJCXOD (ORCPT ); Sat, 3 Oct 2009 19:14:03 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47682 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751331AbZJCXOC (ORCPT ); Sat, 3 Oct 2009 19:14:02 -0400 Received: from int-mx05.intmail.prod.int.phx2.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.18]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n93NCtqT025397; Sat, 3 Oct 2009 19:12:55 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx05.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id n93NCr4G019761; Sat, 3 Oct 2009 19:12:54 -0400 Received: from amt.cnet (vpn-10-15.str.redhat.com [10.32.10.15]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n93NCjk4028592; Sat, 3 Oct 2009 19:12:47 -0400 Received: from amt.cnet (amt.cnet [127.0.0.1]) by amt.cnet (Postfix) with ESMTP id 6152258806F; Sat, 3 Oct 2009 20:12:09 -0300 (BRT) Received: (from marcelo@localhost) by amt.cnet (8.14.3/8.14.3/Submit) id n93NC66N015352; Sat, 3 Oct 2009 20:12:06 -0300 Date: Sat, 3 Oct 2009 20:12:05 -0300 From: Marcelo Tosatti To: Michael Tokarev Cc: kvm , Frederic Weisbecker , Ingo Molnar Subject: Re: kvm guest: hrtimer: interrupt too slow Message-ID: <20091003231205.GA15015@amt.cnet> References: <4AC207B1.7020901@msgid.tls.msk.ru> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <4AC207B1.7020901@msgid.tls.msk.ru> User-Agent: Mutt/1.5.19 (2009-01-05) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.18 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 49da79a..8997978 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c @@ -1234,28 +1234,20 @@ static void __run_hrtimer(struct hrtimer *timer) #ifdef CONFIG_HIGH_RES_TIMERS -static int force_clock_reprogram; - /* * After 5 iteration's attempts, we consider that hrtimer_interrupt() * is hanging, which could happen with something that slows the interrupt - * such as the tracing. Then we force the clock reprogramming for each future - * hrtimer interrupts to avoid infinite loops and use the min_delta_ns - * threshold that we will overwrite. - * The next tick event will be scheduled to 3 times we currently spend on - * hrtimer_interrupt(). This gives a good compromise, the cpus will spend - * 1/4 of their time to process the hrtimer interrupts. This is enough to - * let it running without serious starvation. + * such as the tracing, so we increase min_delta_ns. */ static inline void -hrtimer_interrupt_hanging(struct clock_event_device *dev, - ktime_t try_time) +hrtimer_interrupt_hanging(struct clock_event_device *dev) { - force_clock_reprogram = 1; - dev->min_delta_ns = (unsigned long)try_time.tv64 * 3; - printk(KERN_WARNING "hrtimer: interrupt too slow, " - "forcing clock min delta to %lu ns\n", dev->min_delta_ns); + dev->min_delta_ns += dev->min_delta_ns >> 1; + if (printk_ratelimit()) + printk(KERN_WARNING "hrtimer: interrupt too slow, " + "forcing clock min delta to %lu ns\n", + dev->min_delta_ns); } /* * High resolution timer interrupt @@ -1276,7 +1268,7 @@ void hrtimer_interrupt(struct clock_event_device *dev) retry: /* 5 retries is enough to notice a hang */ if (!(++nr_retries % 5)) - hrtimer_interrupt_hanging(dev, ktime_sub(ktime_get(), now)); + hrtimer_interrupt_hanging(dev); now = ktime_get(); @@ -1342,7 +1334,7 @@ void hrtimer_interrupt(struct clock_event_device *dev) /* Reprogramming necessary ? */ if (expires_next.tv64 != KTIME_MAX) { - if (tick_program_event(expires_next, force_clock_reprogram)) + if (tick_program_event(expires_next, 0)) goto retry; } }