qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: yang.z.zhang@intel.com, aliguori@linux.vnet.ibm.com,
	mdroth@linux.vnet.ibm.com, quintela@redhat.com
Subject: [Qemu-devel] [PATCH v3 00/10] Remove periodic wakeup from RTC timer
Date: Thu,  2 Aug 2012 18:04:03 +0200	[thread overview]
Message-ID: <1343923453-13026-1-git-send-email-pbonzini@redhat.com> (raw)

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(-)

-- 
1.7.10.4

             reply	other threads:[~2012-08-02 16:04 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-02 16:04 Paolo Bonzini [this message]
2012-08-02 16:04 ` [Qemu-devel] [PATCH v3 01/10] RTC: Remove the logic to update time format when DM bit changed Paolo Bonzini
2012-08-02 16:04 ` [Qemu-devel] [PATCH v3 02/10] RTC: Rename rtc_timer_update Paolo Bonzini
2012-08-02 16:04 ` [Qemu-devel] [PATCH v3 03/10] RTC: introduce RTC_CLOCK_RATE Paolo Bonzini
2012-08-02 16:04 ` [Qemu-devel] [PATCH v3 04/10] RTC: Update interrupt state when interrupts are masked/unmasked Paolo Bonzini
2012-08-02 16:04 ` [Qemu-devel] [PATCH v3 05/10] vmstate: add VMSTATE_TIMER_V Paolo Bonzini
2012-08-02 16:04 ` [Qemu-devel] [PATCH v3 06/10] RTC: Update the RTC clock only when reading it Paolo Bonzini
2012-08-02 16:04 ` [Qemu-devel] [PATCH v3 07/10] RTC: Add divider reset support Paolo Bonzini
2012-08-02 16:04 ` [Qemu-devel] [PATCH v3 08/10] RTC: Do not fire timer periodically to catch next alarm Paolo Bonzini
2012-08-02 16:04 ` [Qemu-devel] [PATCH v3 09/10] RTC: Get and set time without going through s->current_tm Paolo Bonzini
2012-08-02 16:04 ` [Qemu-devel] [PATCH v3 10/10] RTC: Remove the current_tm field Paolo Bonzini
2012-09-10 17:05 ` [Qemu-devel] [PATCH v3 00/10] Remove periodic wakeup from RTC timer Paolo Bonzini
2012-09-10 23:00 ` Anthony Liguori

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=1343923453-13026-1-git-send-email-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=aliguori@linux.vnet.ibm.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=yang.z.zhang@intel.com \
    /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).