yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
76daa3
From 42b5017297d569a4b1e015b5398488bec24f09da Mon Sep 17 00:00:00 2001
76daa3
From: Eric Blake <eblake@redhat.com>
76daa3
Date: Thu, 1 Jun 2017 16:58:19 +0200
76daa3
Subject: [PATCH 03/17] shutdown: Preserve shutdown cause through replay
76daa3
76daa3
RH-Author: Eric Blake <eblake@redhat.com>
76daa3
Message-id: <20170601165821.26810-4-eblake@redhat.com>
76daa3
Patchwork-id: 75468
76daa3
O-Subject: [RHEL-7.4 qemu-kvm-rhev PATCH v2 3/5] shutdown: Preserve shutdown cause through replay
76daa3
Bugzilla: 1418927
76daa3
RH-Acked-by: John Snow <jsnow@redhat.com>
76daa3
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
76daa3
RH-Acked-by: Thomas Huth <thuth@redhat.com>
76daa3
76daa3
With the recent addition of ShutdownCause, we want to be able to pass
76daa3
a cause through any shutdown request, and then faithfully replay that
76daa3
cause when later replaying the same sequence.  The easiest way is to
76daa3
expand the reply event mechanism to track a series of values for
76daa3
EVENT_SHUTDOWN, one corresponding to each value of ShutdownCause.
76daa3
76daa3
We are free to change the replay stream as needed, since there are
76daa3
already no guarantees about being able to use a replay stream by
76daa3
any other version of qemu than the one that generated it.
76daa3
76daa3
The cause is not actually fed back until the next patch changes the
76daa3
signature for requesting a shutdown; a TODO marks that upcoming change.
76daa3
76daa3
Yes, this uses the gcc/clang extension of a ranged case label,
76daa3
but this is not the first time we've used non-C99 constructs.
76daa3
76daa3
Signed-off-by: Eric Blake <eblake@redhat.com>
76daa3
Reviewed-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
76daa3
Message-Id: <20170515214114.15442-4-eblake@redhat.com>
76daa3
Reviewed-by: Markus Armbruster <armbru@redhat.com>
76daa3
Signed-off-by: Markus Armbruster <armbru@redhat.com>
76daa3
(cherry picked from commit 802f045a5f61b781df55e4492d896b4d20503ba7)
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
---
76daa3
 include/sysemu/replay.h  | 3 ++-
76daa3
 replay/replay-internal.h | 3 ++-
76daa3
 replay/replay.c          | 7 ++++---
76daa3
 vl.c                     | 2 +-
76daa3
 4 files changed, 9 insertions(+), 6 deletions(-)
76daa3
76daa3
diff --git a/include/sysemu/replay.h b/include/sysemu/replay.h
76daa3
index f1c0712..fa14d0e 100644
76daa3
--- a/include/sysemu/replay.h
76daa3
+++ b/include/sysemu/replay.h
76daa3
@@ -13,6 +13,7 @@
76daa3
  */
76daa3
 
76daa3
 #include "qapi-types.h"
76daa3
+#include "sysemu.h"
76daa3
 
76daa3
 /* replay clock kinds */
76daa3
 enum ReplayClockKind {
76daa3
@@ -98,7 +99,7 @@ int64_t replay_read_clock(ReplayClockKind kind);
76daa3
 /* Events */
76daa3
 
76daa3
 /*! Called when qemu shutdown is requested. */
76daa3
-void replay_shutdown_request(void);
76daa3
+void replay_shutdown_request(ShutdownCause cause);
76daa3
 /*! Should be called at check points in the execution.
76daa3
     These check points are skipped, if they were not met.
76daa3
     Saves checkpoint in the SAVE mode and validates in the PLAY mode.
76daa3
diff --git a/replay/replay-internal.h b/replay/replay-internal.h
76daa3
index ed66ed8..3ebb199 100644
76daa3
--- a/replay/replay-internal.h
76daa3
+++ b/replay/replay-internal.h
76daa3
@@ -22,8 +22,9 @@ enum ReplayEvents {
76daa3
     EVENT_EXCEPTION,
76daa3
     /* for async events */
76daa3
     EVENT_ASYNC,
76daa3
-    /* for shutdown request */
76daa3
+    /* for shutdown requests, range allows recovery of ShutdownCause */
76daa3
     EVENT_SHUTDOWN,
76daa3
+    EVENT_SHUTDOWN_LAST = EVENT_SHUTDOWN + SHUTDOWN_CAUSE__MAX,
76daa3
     /* for character device write event */
76daa3
     EVENT_CHAR_WRITE,
76daa3
     /* for character device read all event */
76daa3
diff --git a/replay/replay.c b/replay/replay.c
76daa3
index f810628..bf94e81 100644
76daa3
--- a/replay/replay.c
76daa3
+++ b/replay/replay.c
76daa3
@@ -49,8 +49,9 @@ bool replay_next_event_is(int event)
76daa3
             res = true;
76daa3
         }
76daa3
         switch (replay_state.data_kind) {
76daa3
-        case EVENT_SHUTDOWN:
76daa3
+        case EVENT_SHUTDOWN ... EVENT_SHUTDOWN_LAST:
76daa3
             replay_finish_event();
76daa3
+            /* TODO - pass replay_state.data_kind - EVENT_SHUTDOWN as cause */
76daa3
             qemu_system_shutdown_request();
76daa3
             break;
76daa3
         default:
76daa3
@@ -170,11 +171,11 @@ bool replay_has_interrupt(void)
76daa3
     return res;
76daa3
 }
76daa3
 
76daa3
-void replay_shutdown_request(void)
76daa3
+void replay_shutdown_request(ShutdownCause cause)
76daa3
 {
76daa3
     if (replay_mode == REPLAY_MODE_RECORD) {
76daa3
         replay_mutex_lock();
76daa3
-        replay_put_event(EVENT_SHUTDOWN);
76daa3
+        replay_put_event(EVENT_SHUTDOWN + cause);
76daa3
         replay_mutex_unlock();
76daa3
     }
76daa3
 }
76daa3
diff --git a/vl.c b/vl.c
76daa3
index ea181c6..18fdef2 100644
76daa3
--- a/vl.c
76daa3
+++ b/vl.c
76daa3
@@ -1820,8 +1820,8 @@ void qemu_system_killed(int signal, pid_t pid)
76daa3
 void qemu_system_shutdown_request(void)
76daa3
 {
76daa3
     trace_qemu_system_shutdown_request();
76daa3
-    replay_shutdown_request();
76daa3
     /* TODO - add a parameter to allow callers to specify reason */
76daa3
+    replay_shutdown_request(SHUTDOWN_CAUSE_HOST_ERROR);
76daa3
     shutdown_requested = SHUTDOWN_CAUSE_HOST_ERROR;
76daa3
     qemu_notify_event();
76daa3
 }
76daa3
-- 
76daa3
1.8.3.1
76daa3