diff mbox series

[2/2] pvpanic: implement crashloaded event handling

Message ID 20200114023102.612548-3-pizhenwei@bytedance.com (mailing list archive)
State New, archived
Headers show
Series pvpanic: implement crashloaded event for pvpanic | expand

Commit Message

zhenwei pi Jan. 14, 2020, 2:31 a.m. UTC
Handle bit 1 write, then post event to monitor.

Suggested by Paolo, declear a new event, using GUEST_PANICKED could
cause upper layers to react by shutting down or rebooting the guest.

In advance for extention, add GuestPanicInformation in event message.

Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
---
 hw/misc/pvpanic.c         | 11 +++++++++--
 include/sysemu/runstate.h |  1 +
 qapi/run-state.json       | 22 +++++++++++++++++++++-
 vl.c                      | 12 ++++++++++++
 4 files changed, 43 insertions(+), 3 deletions(-)

Comments

Paolo Bonzini Jan. 18, 2020, 8:52 p.m. UTC | #1
On 14/01/20 03:31, zhenwei pi wrote:
> +# @info: information about a panic (since 2.9)

Removed this "since 2.9" and queued both patches, thanks.

Paolo
Eric Blake Jan. 20, 2020, 7:12 p.m. UTC | #2
On 1/13/20 8:31 PM, zhenwei pi wrote:
> Handle bit 1 write, then post event to monitor.
> 
> Suggested by Paolo, declear a new event, using GUEST_PANICKED could
> cause upper layers to react by shutting down or rebooting the guest.
> 
> In advance for extention, add GuestPanicInformation in event message.
> 
> Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
> ---

> +++ b/qapi/run-state.json
> @@ -357,6 +357,26 @@
>     'data': { 'action': 'GuestPanicAction', '*info': 'GuestPanicInformation' } }
>   
>   ##
> +# @GUEST_CRASHLOADED:
> +#
> +# Emitted when guest OS crash loaded is detected
> +#
> +# @action: action that has been taken, currently always "run"
> +#
> +# @info: information about a panic (since 2.9)
> +#
> +# Since: 5.0

Paolo already caught that the 'since 2.9' makes no sense if the 
interface itself is since 5.0.

> +#
> +# Example:
> +#
> +# <- { "event": "GUEST_CRASHLOADED",
> +#      "data": { "action": "run" } }
> +#
> +##
> +{ 'event': 'GUEST_CRASHLOADED',
> +  'data': { 'action': 'GuestPanicAction', '*info': 'GuestPanicInformation' } }
> +
> +##
>   # @GuestPanicAction:
>   #
>   # An enumeration of the actions taken when guest OS panic is detected
> @@ -366,7 +386,7 @@
>   # Since: 2.1 (poweroff since 2.8)
>   ##
>   { 'enum': 'GuestPanicAction',
> -  'data': [ 'pause', 'poweroff' ] }
> +  'data': [ 'pause', 'poweroff', 'run' ] }

But the comment here could be updated to mention 'run' since 5.0, 
alongside poweroff since 2.8.  Not the end of the world if we don't 
annotate it, though, since instrospection still shows the difference.
Paolo Bonzini Jan. 21, 2020, 10:49 a.m. UTC | #3
On 20/01/20 20:12, Eric Blake wrote:
>> +#
>> +# Example:
>> +#
>> +# <- { "event": "GUEST_CRASHLOADED",
>> +#      "data": { "action": "run" } }
>> +#
>> +##
>> +{ 'event': 'GUEST_CRASHLOADED',
>> +  'data': { 'action': 'GuestPanicAction', '*info':
>> 'GuestPanicInformation' } }
>> +
>> +##
>>   # @GuestPanicAction:
>>   #
>>   # An enumeration of the actions taken when guest OS panic is detected
>> @@ -366,7 +386,7 @@
>>   # Since: 2.1 (poweroff since 2.8)
>>   ##
>>   { 'enum': 'GuestPanicAction',
>> -  'data': [ 'pause', 'poweroff' ] }
>> +  'data': [ 'pause', 'poweroff', 'run' ] }
> 
> But the comment here could be updated to mention 'run' since 5.0,
> alongside poweroff since 2.8.  Not the end of the world if we don't
> annotate it, though, since instrospection still shows the difference.

Done in my local branch.
diff mbox series

Patch

diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
index d65ac86478..4ebda7872a 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -21,11 +21,13 @@ 
 #include "hw/qdev-properties.h"
 #include "hw/misc/pvpanic.h"
 
-/* The bit of supported pv event */
+/* The bit of supported pv event, TODO: include uapi header and remove this */
 #define PVPANIC_F_PANICKED      0
+#define PVPANIC_F_CRASHLOADED   1
 
 /* The pv event value */
 #define PVPANIC_PANICKED        (1 << PVPANIC_F_PANICKED)
+#define PVPANIC_CRASHLOADED     (1 << PVPANIC_F_CRASHLOADED)
 
 #define ISA_PVPANIC_DEVICE(obj)    \
     OBJECT_CHECK(PVPanicState, (obj), TYPE_PVPANIC)
@@ -34,7 +36,7 @@  static void handle_event(int event)
 {
     static bool logged;
 
-    if (event & ~PVPANIC_PANICKED && !logged) {
+    if (event & ~(PVPANIC_PANICKED | PVPANIC_CRASHLOADED) && !logged) {
         qemu_log_mask(LOG_GUEST_ERROR, "pvpanic: unknown event %#x.\n", event);
         logged = true;
     }
@@ -43,6 +45,11 @@  static void handle_event(int event)
         qemu_system_guest_panicked(NULL);
         return;
     }
+
+    if (event & PVPANIC_CRASHLOADED) {
+        qemu_system_guest_crashloaded(NULL);
+        return;
+    }
 }
 
 #include "hw/isa/isa.h"
diff --git a/include/sysemu/runstate.h b/include/sysemu/runstate.h
index 0b41555609..f760094858 100644
--- a/include/sysemu/runstate.h
+++ b/include/sysemu/runstate.h
@@ -63,6 +63,7 @@  ShutdownCause qemu_reset_requested_get(void);
 void qemu_system_killed(int signal, pid_t pid);
 void qemu_system_reset(ShutdownCause reason);
 void qemu_system_guest_panicked(GuestPanicInformation *info);
+void qemu_system_guest_crashloaded(GuestPanicInformation *info);
 
 #endif
 
diff --git a/qapi/run-state.json b/qapi/run-state.json
index d7477cd715..b7a91f3125 100644
--- a/qapi/run-state.json
+++ b/qapi/run-state.json
@@ -357,6 +357,26 @@ 
   'data': { 'action': 'GuestPanicAction', '*info': 'GuestPanicInformation' } }
 
 ##
+# @GUEST_CRASHLOADED:
+#
+# Emitted when guest OS crash loaded is detected
+#
+# @action: action that has been taken, currently always "run"
+#
+# @info: information about a panic (since 2.9)
+#
+# Since: 5.0
+#
+# Example:
+#
+# <- { "event": "GUEST_CRASHLOADED",
+#      "data": { "action": "run" } }
+#
+##
+{ 'event': 'GUEST_CRASHLOADED',
+  'data': { 'action': 'GuestPanicAction', '*info': 'GuestPanicInformation' } }
+
+##
 # @GuestPanicAction:
 #
 # An enumeration of the actions taken when guest OS panic is detected
@@ -366,7 +386,7 @@ 
 # Since: 2.1 (poweroff since 2.8)
 ##
 { 'enum': 'GuestPanicAction',
-  'data': [ 'pause', 'poweroff' ] }
+  'data': [ 'pause', 'poweroff', 'run' ] }
 
 ##
 # @GuestPanicInformationType:
diff --git a/vl.c b/vl.c
index 86474a55c9..5b1b2ef095 100644
--- a/vl.c
+++ b/vl.c
@@ -1468,6 +1468,18 @@  void qemu_system_guest_panicked(GuestPanicInformation *info)
     }
 }
 
+void qemu_system_guest_crashloaded(GuestPanicInformation *info)
+{
+    qemu_log_mask(LOG_GUEST_ERROR, "Guest crash loaded");
+
+    qapi_event_send_guest_crashloaded(GUEST_PANIC_ACTION_RUN,
+                                   !!info, info);
+
+    if (info) {
+        qapi_free_GuestPanicInformation(info);
+    }
+}
+
 void qemu_system_reset_request(ShutdownCause reason)
 {
     if (no_reboot && reason != SHUTDOWN_CAUSE_SUBSYSTEM_RESET) {