qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Cleber Rosa" <crosa@redhat.com>,
	"Beraldo Leal" <bleal@redhat.com>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"John Snow" <jsnow@redhat.com>,
	"Pavel Dovgalyuk" <pavel.dovgaluk@ispras.ru>,
	"Alex Bennée" <alex.bennee@linaro.org>
Subject: [PATCH 08/11] replay: introduce a central report point for sync errors
Date: Tue,  5 Dec 2023 20:41:03 +0000	[thread overview]
Message-ID: <20231205204106.95531-9-alex.bennee@linaro.org> (raw)
In-Reply-To: <20231205204106.95531-1-alex.bennee@linaro.org>

Figuring out why replay has failed is tricky at the best of times.
Lets centralise the reporting of a replay sync error and add a little
bit of extra information to help with debugging.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 replay/replay-internal.h | 12 ++++++++++++
 replay/replay-char.c     |  6 ++----
 replay/replay-internal.c |  1 +
 replay/replay.c          |  9 +++++++++
 4 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/replay/replay-internal.h b/replay/replay-internal.h
index 1bc8fd5086..709e2eb4cb 100644
--- a/replay/replay-internal.h
+++ b/replay/replay-internal.h
@@ -74,6 +74,7 @@ enum ReplayEvents {
  * @cached_clock: Cached clocks values
  * @current_icount: number of processed instructions
  * @instruction_count: number of instructions until next event
+ * @current_event: current event index
  * @data_kind: current event
  * @has_unread_data: true if event not yet processed
  * @file_offset: offset into replay log at replay snapshot
@@ -84,6 +85,7 @@ typedef struct ReplayState {
     int64_t cached_clock[REPLAY_CLOCK_COUNT];
     uint64_t current_icount;
     int instruction_count;
+    unsigned int current_event;
     unsigned int data_kind;
     bool has_unread_data;
     uint64_t file_offset;
@@ -188,6 +190,16 @@ void replay_event_net_save(void *opaque);
 /*! Reads network from the file. */
 void *replay_event_net_load(void);
 
+/* Diagnostics */
+
+/**
+ * replay_sync_error(): report sync error and exit
+ *
+ * When we reach an error condition we want to report it centrally so
+ * we can also dump some useful information into the logs.
+ */
+G_NORETURN void replay_sync_error(const char *error);
+
 /* VMState-related functions */
 
 /* Registers replay VMState.
diff --git a/replay/replay-char.c b/replay/replay-char.c
index a31aded032..72b1f832dd 100644
--- a/replay/replay-char.c
+++ b/replay/replay-char.c
@@ -113,8 +113,7 @@ void replay_char_write_event_load(int *res, int *offset)
         *offset = replay_get_dword();
         replay_finish_event();
     } else {
-        error_report("Missing character write event in the replay log");
-        exit(1);
+        replay_sync_error("Missing character write event in the replay log");
     }
 }
 
@@ -135,8 +134,7 @@ int replay_char_read_all_load(uint8_t *buf)
         replay_finish_event();
         return res;
     } else {
-        error_report("Missing character read all event in the replay log");
-        exit(1);
+        replay_sync_error("Missing character read all event in the replay log");
     }
 }
 
diff --git a/replay/replay-internal.c b/replay/replay-internal.c
index 634025096e..654b99cfb5 100644
--- a/replay/replay-internal.c
+++ b/replay/replay-internal.c
@@ -175,6 +175,7 @@ void replay_fetch_data_kind(void)
     if (replay_file) {
         if (!replay_state.has_unread_data) {
             replay_state.data_kind = replay_get_byte();
+            replay_state.current_event++;
             if (replay_state.data_kind == EVENT_INSTRUCTION) {
                 replay_state.instruction_count = replay_get_dword();
             }
diff --git a/replay/replay.c b/replay/replay.c
index d729214197..e83c01285c 100644
--- a/replay/replay.c
+++ b/replay/replay.c
@@ -226,6 +226,14 @@ bool replay_has_event(void)
     return res;
 }
 
+G_NORETURN void replay_sync_error(const char *error)
+{
+    error_report("%s (insn total %"PRId64"/%d left, event %u/%u)", error,
+                 replay_state.current_icount, replay_state.instruction_count,
+                 replay_state.current_event, replay_state.data_kind);
+    abort();
+}
+
 static void replay_enable(const char *fname, int mode)
 {
     const char *fmode = NULL;
@@ -258,6 +266,7 @@ static void replay_enable(const char *fname, int mode)
     replay_state.data_kind = -1;
     replay_state.instruction_count = 0;
     replay_state.current_icount = 0;
+    replay_state.current_event = 0;
     replay_state.has_unread_data = false;
 
     /* skip file header for RECORD and check it for PLAY */
-- 
2.39.2



  parent reply	other threads:[~2023-12-05 20:43 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-05 20:40 [PATCH 00/11] record/replay fixes, maybe for 8.2 or for post release stable? Alex Bennée
2023-12-05 20:40 ` [PATCH 01/11] tests/avocado: add a simple i386 replay kernel test Alex Bennée
2023-12-06 16:21   ` Richard Henderson
2023-12-07  8:20   ` Pavel Dovgalyuk
2023-12-05 20:40 ` [PATCH 02/11] tests/avocado: fix typo in replay_linux Alex Bennée
2023-12-06 11:24   ` Philippe Mathieu-Daudé
2023-12-06 16:22   ` Richard Henderson
2023-12-07  8:20   ` Pavel Dovgalyuk
2023-12-05 20:40 ` [PATCH 03/11] scripts/replay-dump: update to latest format Alex Bennée
2023-12-06 16:29   ` Richard Henderson
2023-12-05 20:40 ` [PATCH 04/11] scripts/replay_dump: track total number of instructions Alex Bennée
2023-12-06 11:25   ` Philippe Mathieu-Daudé
2023-12-06 16:38   ` Richard Henderson
2023-12-07  8:26   ` Pavel Dovgalyuk
2023-12-05 20:41 ` [PATCH 05/11] replay: remove host_clock_last Alex Bennée
2023-12-06 11:33   ` Philippe Mathieu-Daudé
2023-12-06 16:39   ` Richard Henderson
2023-12-07  8:26   ` Pavel Dovgalyuk
2023-12-05 20:41 ` [PATCH 06/11] replay: add proper kdoc for ReplayState Alex Bennée
2023-12-06 11:27   ` Philippe Mathieu-Daudé
2023-12-06 11:56     ` Alex Bennée
2023-12-07  8:38   ` Pavel Dovgalyuk
2023-12-05 20:41 ` [PATCH 07/11] replay: make has_unread_data a bool Alex Bennée
2023-12-06 11:31   ` Philippe Mathieu-Daudé
2023-12-06 16:42   ` Richard Henderson
2023-12-07  8:39   ` Pavel Dovgalyuk
2023-12-05 20:41 ` Alex Bennée [this message]
2023-12-06 11:35   ` [PATCH 08/11] replay: introduce a central report point for sync errors Philippe Mathieu-Daudé
2023-12-06 16:48     ` Richard Henderson
2023-12-07  8:45       ` Pavel Dovgalyuk
2023-12-06 16:47   ` Richard Henderson
2023-12-05 20:41 ` [PATCH 09/11] replay: stop us hanging in rr_wait_io_event Alex Bennée
2023-12-06 16:51   ` Richard Henderson
2023-12-08  8:32   ` Pavel Dovgalyuk
2023-12-08  9:29     ` Alex Bennée
2023-12-05 20:41 ` [PATCH 10/11] chardev: force write all when recording replay logs Alex Bennée
2023-12-06 14:25   ` Philippe Mathieu-Daudé
2023-12-07  8:46   ` Pavel Dovgalyuk
2023-12-05 20:41 ` [PATCH 11/11] tests/avocado: remove skips from replay_kernel Alex Bennée
2023-12-07  8:46   ` Pavel Dovgalyuk

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=20231205204106.95531-9-alex.bennee@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=bleal@redhat.com \
    --cc=crosa@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=jsnow@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=pavel.dovgaluk@ispras.ru \
    --cc=pbonzini@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=wainersm@redhat.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).