Paolo Bonzini wrote on 2012-08-02: > The current RTC emulation has two timers firing every second, one > on each edge of the UIP bit. This will prevent CPUs from staying at > deep C-states. Intel's measurements from previous submissions show the > C6 residency reduced by 6% when running 64 idle guests. > > The following patches remove the two timers. The patches update the RTC > clock only when the guest tries to read it, and only set timers when > update or alarm is clear. Hence, a guest will typically fire the RTC > timer only twice, respectively one second after it starts and at the > next midnight. > > The patches are mostly the work of Yang Zhang. My contribution was > limited to reorganizing them for better bisectability, and cleaning > up the computation of UIP.
Thanks for your review and great effort to push those patches. > A qtest for this is not as reliable as a test that actually runs code > in a VM. A qtest is more deterministic, and the "wiggling" introduced > by running code in the VM is much more likely to find bugs. I'll post > the unit test separately. Because the patches also improve the quality > of the emulation, this test fails without the patches. > > The first four patches are simple preparatory changes. > > The fifth patch removes the timers, and replaces them with a single > timer that is fired every second until UF and AF. The update logic is > moved to the reading of the registers, and so is UIP. > > The sixth patch implements support for divider reset, which helps testing > the RTC because it places it in a known state. The seventh patch avoids > firing the timer every second until the next alarm. > > The next two patches clean up the state of the RTC to eliminate a useless > duplication, and the tenth completes migration support. Still, backwards > migration is broken because the algorithms in the new device model are > pretty much completely different. Downstreams that care should include > both device models and pick the old one for old machine types. > > v1->v2: annotate versions correctly in the vmstate, added new > patches to remove current_tm > Paolo Bonzini (4): > vmstate: add VMSTATE_TIMER_V > RTC: Do not fire timer periodically to catch next alarm > RTC: Get and set time without going through s->current_tm > RTC: Remove the current_tm field > Yang Zhang (6): > RTC: Remove the logic to update time format when DM bit changed > RTC: Rename rtc_timer_update > RTC: Update interrupt state when interrupts are masked/unmasked > RTC: Update the RTC clock only when reading it > RTC: Add divider reset support > RTC: Allow to migrate from old QEMU > hw/mc146818rtc.c | 540 > ++++++++++++++++++++++++++++++++++--------------- hw/mc146818rtc_regs.h > | 1 + vmstate.h | 5 +- 3 files changed, 377 > insertions(+), 169 deletions(-) > -- > 1.7.10.4 Best regards, Yang