From: Gleb Natapov <gleb@redhat.com>
To: andrzej zaborowski <balrogg@gmail.com>
Cc: dlaor@redhat.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [RESEND][PATCH 0/3] Fix guest time drift under heavy load.
Date: Thu, 6 Nov 2008 12:08:22 +0200 [thread overview]
Message-ID: <20081106100821.GF3820@redhat.com> (raw)
In-Reply-To: <fb249edb0811060137m20e9ac75we6c7fdd38b8796d5@mail.gmail.com>
On Thu, Nov 06, 2008 at 10:37:43AM +0100, andrzej zaborowski wrote:
> 2008/11/6 Gleb Natapov <gleb@redhat.com>:
> > 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.
>
> A guest that counts on having enough CPU for something is
> timing-depenent (buggy).
>
Tell this to RT developers who count each CPU cycle.
> > 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.
>
> Exactly. You'll find the drift on real hardware, so you should find
> it in the emulator too. You're trying to hack around it.
>
If I'll try to run windows XP on 486 then yes, I'll see the time drift.
After analyzing the problem I, most certainly, will decide that HW is
too old will buy modern CPU and will solve the time drift problem. What do
you propose for QEMU users? To use real HW?
> Linux doesn't see this because the clocksource and the
> clockevents-device come from separate clks there. It is a windows'
> problem. It *is* "bad behaviour".
OK we will call the flag -win-time-drift-hack.
>
> >
> >> 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.
>
> Of course.
>
> > This approach was rejected long time ago.
>
> Then you'll have to find a different one.
>
I found one. Here it is, implemented by this patch series.
> qemu_irq is the wrong place.
Why? Don't give me "that is not how real HW works". Real HW, if properly
configured, will behave more or less deterministically. I.e if timer
interrupt is configured to generate highest priority interrupt vector
and IRQ handler is fast enough (can be calculated knowing CPU freq) the
chances of loosing interrupt will be minimal. And those few that are
lost due to SMM or NMI can be compensated by NTP.
> >
> >> 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.
>
> This doesn't matter, the tick that arrived while a previous interrupt
> was not acked yet, is lost anyway,
Not it is not. Not necessary. It can be queued inside PIC and delivered
by PIC itself immediately after interrupt acknowledgement.
> i.e. had been coalesced. So
> this'll give you the right number of interrupts to re-inject.
No it will not. You'll inject more interrupt then needed and clock will
drift forwards.
>
> Ofcourse this, as well as your approach are both wrong because the
> guest may be intentionally ignoring the irq and expecting the
> interrupts to coalesce. Once it starts processing the RTC interrupts
> it will get an unexpected storm.
>
This is one more thing which is broken in your suggestion, not mine. If a
guest wants to ignore interrupt it will mask it and my patch don't report
interrupts delivered while masked as been coalesced.
--
Gleb.
next prev parent reply other threads:[~2008-11-06 10:08 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-29 15:22 [Qemu-devel] [RESEND][PATCH 0/3] Fix guest time drift under heavy load Gleb Natapov
2008-10-29 15:22 ` [Qemu-devel] [PATCH 1/3] Change qemu_set_irq() to return status information Gleb Natapov
2008-10-29 15:22 ` [Qemu-devel] [PATCH 2/3] Fix time drift problem under high load when PIT is in use Gleb Natapov
2008-10-29 15:22 ` [Qemu-devel] [PATCH 3/3] Fix time drift problem under high load when RTC " Gleb Natapov
2008-11-05 12:46 ` Dor Laor
2008-10-31 19:17 ` [Qemu-devel] [RESEND][PATCH 0/3] Fix guest time drift under heavy load Anthony Liguori
2008-11-02 13:04 ` Gleb Natapov
2008-11-05 12:45 ` Dor Laor
2008-11-05 15:48 ` andrzej zaborowski
2008-11-05 16:33 ` Anthony Liguori
2008-11-06 7:16 ` Gleb Natapov
2008-11-06 9:37 ` andrzej zaborowski
2008-11-06 10:08 ` Gleb Natapov [this message]
2008-11-06 13:21 ` andrzej zaborowski
2008-11-06 14:18 ` Gleb Natapov
2008-11-06 14:35 ` andrzej zaborowski
2008-11-06 15:04 ` Gleb Natapov
2008-11-06 15:41 ` Anthony Liguori
2008-11-07 23:18 ` andrzej zaborowski
2008-11-08 8:23 ` Gleb Natapov
2008-11-06 13:44 ` Paul Brook
2008-11-05 17:43 ` Gleb Natapov
2008-11-06 17:28 ` David S. Ahern
2008-11-05 16:43 ` Anthony Liguori
2008-11-06 3:55 ` Jamie Lokier
2008-11-06 8:12 ` Gleb Natapov
2008-11-06 14:10 ` Anthony Liguori
2008-11-06 14:24 ` Paul Brook
2008-11-06 14:40 ` Anthony Liguori
2008-11-06 14:51 ` Gleb Natapov
2008-11-06 15:37 ` Anthony Liguori
2008-11-08 8:36 ` Gleb Natapov
2008-11-08 22:14 ` Dor Laor
2008-11-09 7:40 ` Gleb Natapov
2008-11-09 16:38 ` Anthony Liguori
2008-11-09 21:00 ` Avi Kivity
2008-11-09 16:36 ` Anthony Liguori
2008-11-10 14:37 ` Gleb Natapov
2008-11-10 15:24 ` Anthony Liguori
2008-11-10 15:29 ` Gleb Natapov
2008-11-10 15:46 ` Anthony Liguori
2008-11-10 15:51 ` Gleb Natapov
2008-11-11 14:43 ` Gleb Natapov
2008-11-11 17:26 ` Anthony Liguori
2008-11-11 20:17 ` Anthony Liguori
2008-11-12 11:42 ` Gleb Natapov
2008-11-12 11:54 ` Glauber Costa
2008-11-12 12:38 ` Dor Laor
2008-11-06 3:41 ` Jamie Lokier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081106100821.GF3820@redhat.com \
--to=gleb@redhat.com \
--cc=balrogg@gmail.com \
--cc=dlaor@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).