Paolo Bonzini <pbonz...@redhat.com> writes: > 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 > to reorganize them for better bisectability, and cleaning up migration > support as well as the computation of UIP. > > 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 five patches are simple preparatory changes. > > The sixth 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. With this in > place we can implement support for divider reset (patch 7), which helps > testing the RTC because it places it in a known state. > > The eighth patch avoids firing the timer every second until the next > alarm. The final two patches clean up the state of the RTC to eliminate > useless duplication. > > 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. > Forwards migration works, and I also tested migration (same version and > forward) with a unit test for alarms. > > v1->v2: annotate versions correctly in the vmstate, added new > patches to remove current_tm > > v2->v3: use gmtime_r [Anthony], compute exact UIP hold time [Anthony], > do not use load_old [Juan] so migration remains bisectable > > Paolo Bonzini (5): > RTC: introduce RTC_CLOCK_RATE > 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 (5): > 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 > > hw/mc146818rtc.c | 520 > +++++++++++++++++++++++++++++++++---------------- > hw/mc146818rtc_regs.h | 1 + > vmstate.h | 5 +- > 3 files changed, 354 insertions(+), 172 deletions(-)
Applied all. Thanks. Regards, Anthony Liguori > > -- > 1.7.10.4