From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55235) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XF3pv-0002gF-LO for qemu-devel@nongnu.org; Wed, 06 Aug 2014 12:13:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XF3pp-0005ZK-LJ for qemu-devel@nongnu.org; Wed, 06 Aug 2014 12:13:11 -0400 Received: from mail-wi0-x22f.google.com ([2a00:1450:400c:c05::22f]:52945) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XF3pp-0005Z2-9s for qemu-devel@nongnu.org; Wed, 06 Aug 2014 12:13:05 -0400 Received: by mail-wi0-f175.google.com with SMTP id ho1so9156068wib.8 for ; Wed, 06 Aug 2014 09:13:04 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Wed, 6 Aug 2014 18:12:33 +0200 Message-Id: <1407341555-13173-10-git-send-email-pbonzini@redhat.com> In-Reply-To: <1407341555-13173-1-git-send-email-pbonzini@redhat.com> References: <1407341555-13173-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PULL 09/11] cpu-exec: Print to console if the guest is late List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Sebastian Tanase From: Sebastian Tanase If the align option is enabled, we print to the user whenever the guest clock is behind the host clock in order for he/she to have a hint about the actual performance. The maximum print interval is 2s and we limit the number of messages to 100. If desired, this can be changed in cpu-exec.c Signed-off-by: Sebastian Tanase Tested-by: Camille Bégué Signed-off-by: Paolo Bonzini --- cpu-exec.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/cpu-exec.c b/cpu-exec.c index 68f82b6..3c14502 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -29,6 +29,7 @@ typedef struct SyncClocks { int64_t diff_clk; int64_t last_cpu_icount; + int64_t realtime_clock; } SyncClocks; #if !defined(CONFIG_USER_ONLY) @@ -37,6 +38,9 @@ typedef struct SyncClocks { * oscillate around 0. */ #define VM_CLOCK_ADVANCE 3000000 +#define THRESHOLD_REDUCE 1.5 +#define MAX_DELAY_PRINT_RATE 2000000000LL +#define MAX_NB_PRINTS 100 static void align_clocks(SyncClocks *sc, const CPUState *cpu) { @@ -68,16 +72,43 @@ static void align_clocks(SyncClocks *sc, const CPUState *cpu) } } +static void print_delay(const SyncClocks *sc) +{ + static float threshold_delay; + static int64_t last_realtime_clock; + static int nb_prints; + + if (icount_align_option && + sc->realtime_clock - last_realtime_clock >= MAX_DELAY_PRINT_RATE && + nb_prints < MAX_NB_PRINTS) { + if ((-sc->diff_clk / (float)1000000000LL > threshold_delay) || + (-sc->diff_clk / (float)1000000000LL < + (threshold_delay - THRESHOLD_REDUCE))) { + threshold_delay = (-sc->diff_clk / 1000000000LL) + 1; + printf("Warning: The guest is now late by %.1f to %.1f seconds\n", + threshold_delay - 1, + threshold_delay); + nb_prints++; + last_realtime_clock = sc->realtime_clock; + } + } +} + static void init_delay_params(SyncClocks *sc, const CPUState *cpu) { if (!icount_align_option) { return; } + sc->realtime_clock = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); sc->diff_clk = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) - - qemu_clock_get_ns(QEMU_CLOCK_REALTIME) + + sc->realtime_clock + cpu_get_clock_offset(); sc->last_cpu_icount = cpu->icount_extra + cpu->icount_decr.u16.low; + + /* Print every 2s max if the guest is late. We limit the number + of printed messages to NB_PRINT_MAX(currently 100) */ + print_delay(sc); } #else static void align_clocks(SyncClocks *sc, const CPUState *cpu) -- 1.9.3