From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:56176) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ROE4h-0003NQ-VO for qemu-devel@nongnu.org; Wed, 09 Nov 2011 14:44:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ROE4g-0000ZB-66 for qemu-devel@nongnu.org; Wed, 09 Nov 2011 14:44:43 -0500 Received: from mail-yx0-f173.google.com ([209.85.213.173]:63880) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ROE4f-0000Z6-Rg for qemu-devel@nongnu.org; Wed, 09 Nov 2011 14:44:42 -0500 Received: by yenr8 with SMTP id r8so1194122yen.4 for ; Wed, 09 Nov 2011 11:44:41 -0800 (PST) Message-ID: <4EBAD826.1060400@codemonkey.ws> Date: Wed, 09 Nov 2011 13:44:38 -0600 From: Anthony Liguori MIME-Version: 1.0 References: <1320801489-18193-1-git-send-email-jcmvbkbc@gmail.com> In-Reply-To: <1320801489-18193-1-git-send-email-jcmvbkbc@gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH] hpet: fix infinite loop in qemu_run_timers with -icount enabled List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Filippov Cc: Blue Swirl , qemu-devel@nongnu.org, Alexander Graf On 11/08/2011 07:18 PM, Max Filippov wrote: > hpet_timer timer callback rearms itself based on difference between > current HPET tick counter and comparator value. Difference calculated by > the hpet_calculate_diff function is limited to non-negative values. > > cur_tick is calculated via hpet_get_ticks that uses qemu_get_clock_ns(vm_clock). > > With -icount enabled vm_clock doesn't advance during qemu_run_timers > loop thus once difference is zero, qemu_run_timers loops forever > handling hpet_timer. > > Limit hpet_calculate_diff results to positive only values to avoid that > infinite loop. > > This fixes the following qemu-system-x86_64 hang when it reaches > timer_irq_works() in the linux bootup: > > [ 0.000000] Fast TSC calibration using PIT > [ 0.000000] Detected 1000.054 MHz processor. > [ 0.000031] Calibrating delay loop (skipped), value calculated using timer frequency.. 2000.10 BogoMIPS (lpj=10000540) > [ 0.000404] pid_max: default: 32768 minimum: 301 > [ 0.001138] Mount-cache hash table entries: 256 > [ 0.003883] Initializing cgroup subsys ns > [ 0.004035] Initializing cgroup subsys cpuacct > [ 0.004280] Initializing cgroup subsys freezer > [ 0.004790] Performance Events: AMD PMU driver. > [ 0.004985] ... version: 0 > [ 0.005134] ... bit width: 48 > [ 0.005285] ... generic registers: 4 > [ 0.005437] ... value mask: 0000ffffffffffff > [ 0.005625] ... max period: 00007fffffffffff > [ 0.005807] ... fixed-purpose events: 0 > [ 0.005957] ... event mask: 000000000000000f > [ 0.006275] SMP alternatives: switching to UP code > > Signed-off-by: Max Filippov Applied. Thanks. Regards, Anthony Liguori > --- > hw/hpet.c | 4 ++-- > 1 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/hw/hpet.c b/hw/hpet.c > index 12bd64d..6e6ea52 100644 > --- a/hw/hpet.c > +++ b/hw/hpet.c > @@ -157,14 +157,14 @@ static inline uint64_t hpet_calculate_diff(HPETTimer *t, uint64_t current) > > cmp = (uint32_t)t->cmp; > diff = cmp - (uint32_t)current; > - diff = (int32_t)diff> 0 ? diff : (uint32_t)0; > + diff = (int32_t)diff> 0 ? diff : (uint32_t)1; > return (uint64_t)diff; > } else { > uint64_t diff, cmp; > > cmp = t->cmp; > diff = cmp - current; > - diff = (int64_t)diff> 0 ? diff : (uint64_t)0; > + diff = (int64_t)diff> 0 ? diff : (uint64_t)1; > return diff; > } > }