From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Kxz6Y-0001Dt-7q for qemu-devel@nongnu.org; Thu, 06 Nov 2008 02:16:34 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Kxz6U-0001B8-DZ for qemu-devel@nongnu.org; Thu, 06 Nov 2008 02:16:33 -0500 Received: from [199.232.76.173] (port=33012 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Kxz6U-0001B5-8g for qemu-devel@nongnu.org; Thu, 06 Nov 2008 02:16:30 -0500 Received: from mx2.redhat.com ([66.187.237.31]:38821) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Kxz6U-0006KP-Dk for qemu-devel@nongnu.org; Thu, 06 Nov 2008 02:16:30 -0500 Date: Thu, 6 Nov 2008 09:16:24 +0200 From: Gleb Natapov Subject: Re: [Qemu-devel] [RESEND][PATCH 0/3] Fix guest time drift under heavy load. Message-ID: <20081106071624.GC3820@redhat.com> References: <20081029152236.14831.15193.stgit@dhcp-1-237.local> <490B59BF.3000205@codemonkey.ws> <20081102130441.GD16809@redhat.com> <49119551.2070704@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: andrzej zaborowski Cc: dlaor@redhat.com, qemu-devel@nongnu.org On Wed, Nov 05, 2008 at 04:48:32PM +0100, andrzej zaborowski wrote: > > Btw: I ack the whole thing, including the problem, the scenario and the > > solution. > > I don't, as far as I understand it's a -win2k-hack type of addition, > i.e. the hardware doesn't do this but we want to improve usability by > working around a bad guest behaviour. Modifying qemu_irq abstraction > doesn't sound like the right place for that, qemu_irq contrary to what > the name suggests doesn't have to be connected to any interrupt. > It is nothing like a -win2k-hack since there is no any guest "bad behaviour" that cause the problem. Yes real hardware doesn't do this, but real hardware also provides OS with enough CPU power to handle every single timer interrupt. And even if _some_ interrupts are dropped the drift is easily fixed with NTP. Try to run Windows XP on very slow machine and I am sure you'll see very noticeable time drift. > Instead you can have the interrupt sources register a callback in the > PIC that the PIC calls when the interrupt wasn't delivered. Or.. in It requires the mapping from interrupt vector inside the PIC to interrupt source. This approach was rejected long time ago. > the case of mc146818rtc.c wouldn't it be enough to check if the irq > has been acked by reading RTC_REG_C? e.g. > > static void rtc_periodic_timer(void *opaque) > { > RTCState *s = opaque; > > rtc_timer_update(s, s->next_periodic_time); > + if (s->cmos_data[RTC_REG_C] & 0xc0) > + s->irq_coalesced++; > s->cmos_data[RTC_REG_C] |= 0xc0; > qemu_irq_raise(s->irq); > } > PIC/APIC in effect has a queue of one interrupt. This means that if timer tick is still not acknowledged it doesn't mean that interrupt was not queued for delivery inside a PIC. With your suggestion more interrupt will be delivered to a guest that was actually issued. -- Gleb.