All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] Add a new -action parameter
@ 2020-12-08 19:14 Alejandro Jimenez
  2020-12-08 19:14 ` [PATCH 1/4] vl: Add an -action option to respond to guest events Alejandro Jimenez
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Alejandro Jimenez @ 2020-12-08 19:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini

This is a follow up to the proposal to add a "-no-panicstop" option to QEMU that would allow us to
control whether the VM is paused or allowed to continue running without intervention from a management layer
when a guest panic occurs. See the inital thread and replies for details:

https://lore.kernel.org/qemu-devel/1601606494-1154-1-git-send-email-alejandro.j.jimenez@oracle.com/

From that discussion came a request for a generic mechanism to group options like -no-shutdown, -no-reboot, etc,
that specify an action taken by QEMU in response to a guest event (reboot, shutdown, panic, and watchdog
expiration are the current options). The existing options would translate to the new option, like:

* -no-reboot --> "-action reboot=shutdown"
* -no-shutdown --> "-action shutdown=pause"

Please share any questions or comments.

Regards,
Alejandro

Alejandro Jimenez (4):
  vl: Add an -action option to respond to guest events
  vl: Add option to avoid stopping VM upon guest panic
  qmp: Allow setting -action parameters on the fly
  qtest/pvpanic: Test panic option that allows VM to continue

 MAINTAINERS                      |   2 +
 include/sysemu/runstate-action.h |  16 ++++
 include/sysemu/sysemu.h          |   2 +
 qapi/run-state.json              | 140 +++++++++++++++++++++++++++++++++++
 qemu-options.hx                  |  25 +++++++
 softmmu/meson.build              |   1 +
 softmmu/runstate-action.c        | 153 +++++++++++++++++++++++++++++++++++++++
 softmmu/vl.c                     |  44 ++++++++++-
 tests/qtest/pvpanic-test.c       |  26 ++++++-
 9 files changed, 404 insertions(+), 5 deletions(-)
 create mode 100644 include/sysemu/runstate-action.h
 create mode 100644 softmmu/runstate-action.c

-- 
1.8.3.1



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/4] vl: Add an -action option to respond to guest events
  2020-12-08 19:14 [PATCH 0/4] Add a new -action parameter Alejandro Jimenez
@ 2020-12-08 19:14 ` Alejandro Jimenez
  2020-12-08 19:14 ` [PATCH 2/4] vl: Add option to avoid stopping VM upon guest panic Alejandro Jimenez
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: Alejandro Jimenez @ 2020-12-08 19:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini

Several command line options currently in use are meant to modify
the behavior of QEMU in response to certain guest events like:
-no-reboot, -no-shutdown, -watchdog-action.

These can be grouped into a single option of the form:

-action event=action

Which can be used to specify the existing options above in the
following format:

-action reboot=none|shutdown
-action shutdown=poweroff|pause
-action watchdog=reset|shutdown|poweroff|pause|debug|none|inject-nmi

This is done in preparation for adding yet another option of this
type, which modifies the QEMU behavior when a guest panic occurs.

Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
Reviewed-by: David Edmondson <david.edmondson@oracle.com>
Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
---
 MAINTAINERS                      |   2 +
 include/sysemu/runstate-action.h |  16 +++++
 include/sysemu/sysemu.h          |   1 +
 qapi/run-state.json              |  88 ++++++++++++++++++++++++++
 qemu-options.hx                  |  22 +++++++
 softmmu/meson.build              |   1 +
 softmmu/runstate-action.c        | 131 +++++++++++++++++++++++++++++++++++++++
 softmmu/vl.c                     |  30 ++++++++-
 8 files changed, 290 insertions(+), 1 deletion(-)
 create mode 100644 include/sysemu/runstate-action.h
 create mode 100644 softmmu/runstate-action.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 68bc160..7dcc4bd 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2332,6 +2332,7 @@ M: Paolo Bonzini <pbonzini@redhat.com>
 S: Maintained
 F: include/qemu/main-loop.h
 F: include/sysemu/runstate.h
+F: include/sysemu/runstate-action.h
 F: util/main-loop.c
 F: util/qemu-timer.c
 F: softmmu/vl.c
@@ -2340,6 +2341,7 @@ F: softmmu/cpus.c
 F: softmmu/cpu-throttle.c
 F: softmmu/cpu-timers.c
 F: softmmu/icount.c
+F: softmmu/runstate-action.c
 F: qapi/run-state.json
 
 Read, Copy, Update (RCU)
diff --git a/include/sysemu/runstate-action.h b/include/sysemu/runstate-action.h
new file mode 100644
index 0000000..f545ab3
--- /dev/null
+++ b/include/sysemu/runstate-action.h
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2020 Oracle and/or its affiliates.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef RUNSTATE_ACTION_H
+#define RUNSTATE_ACTION_H
+
+/* in softmmu/runstate-action.c */
+int process_runstate_actions(void *opaque, QemuOpts *opts, Error **errp);
+int runstate_action_parse(QemuOptsList *opts_list, const char *optarg);
+
+#endif /* RUNSTATE_ACTION_H */
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 817ff4c..5480e61 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -43,6 +43,7 @@ extern int win2k_install_hack;
 extern int alt_grab;
 extern int ctrl_grab;
 extern int graphic_rotate;
+extern int no_reboot;
 extern int no_shutdown;
 extern int old_param;
 extern int boot_menu;
diff --git a/qapi/run-state.json b/qapi/run-state.json
index 964c8ef..6b033c1 100644
--- a/qapi/run-state.json
+++ b/qapi/run-state.json
@@ -329,6 +329,94 @@
             'inject-nmi' ] }
 
 ##
+# @RunStateEventType:
+#
+# An enumeration of Run State event types
+#
+# @reboot: Guest reboot
+#
+# @shutdown: Guest shutdown
+#
+# @watchdog: A watchdog device's timer has expired
+#
+# Since: 6.0
+##
+{ 'enum': 'RunStateEventType',
+  'data': [ 'reboot', 'shutdown', 'watchdog' ] }
+
+##
+# @RunStateAction:
+#
+# Describes a guest event and the subsequent action that is taken
+# by QEMU when such event takes place.
+#
+# Since: 6.0
+##
+{ 'union': 'RunStateAction',
+  'base': { 'event': 'RunStateEventType' },
+  'discriminator': 'event',
+  'data': {
+    'reboot': 'RunStateRebootAction',
+    'shutdown': 'RunStateShutdownAction',
+    'watchdog': 'RunStateWatchdogAction' } }
+
+##
+# @RunStateRebootAction:
+#
+# @action: Action taken by QEMU when guest reboots
+#
+# Since: 6.0
+##
+{ 'struct': 'RunStateRebootAction',
+  'data': { 'action': 'RebootAction' } }
+
+##
+# @RebootAction:
+#
+# Possible QEMU actions upon guest reboot
+#
+# @none: Reset the VM
+#
+# @shutdown: Shutdown the VM and exit
+#
+# Since: 6.0
+##
+{ 'enum': 'RebootAction',
+  'data': [ 'none', 'shutdown' ] }
+
+##
+# @RunStateShutdownAction:
+#
+# @action: Action taken by QEMU when guest shuts down
+#
+# Since: 6.0
+##
+{ 'struct': 'RunStateShutdownAction',
+  'data': { 'action': 'ShutdownAction' } }
+
+##
+# @ShutdownAction:
+#
+# @pause: pause the VM
+#
+# @poweroff: Shutdown the VM and exit
+#
+# Since: 6.0
+##
+{ 'enum': 'ShutdownAction',
+  'data': [ 'pause', 'poweroff' ] }
+
+##
+# @RunStateWatchdogAction:
+#
+# @action: Action taken by QEMU when watchdog device timer expires
+#
+# Since: 6.0
+##
+{ 'struct': 'RunStateWatchdogAction',
+  'data': { 'action': 'WatchdogAction' } }
+
+##
 # @watchdog-set-action:
 #
 # Set watchdog action
diff --git a/qemu-options.hx b/qemu-options.hx
index 104632e..a0d50f0 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -3894,6 +3894,28 @@ SRST
     changes to the disk image.
 ERST
 
+DEF("action", HAS_ARG, QEMU_OPTION_action,
+    "-action reboot=none|shutdown\n"
+    "                   action when guest reboots [default=none]\n"
+    "-action shutdown=poweroff|pause\n"
+    "                   action when guest shuts down [default=poweroff]\n"
+    "-action watchdog=reset|shutdown|poweroff|inject-nmi|pause|debug|none\n"
+    "                   action when watchdog fires [default=reset]\n",
+    QEMU_ARCH_ALL)
+SRST
+``-action event=action``
+    The action parameter serves to modify QEMU's default behavior when
+    certain guest events occur. It provides a generic method for specifying the
+    same behaviors that are modified by the ``-no-reboot`` and ``-no-shutdown``
+    parameters.
+
+    Examples:
+
+    ``-action reboot=shutdown,shutdown=pause``
+    ``-watchdog i6300esb -action watchdog=pause``
+
+ERST
+
 DEF("loadvm", HAS_ARG, QEMU_OPTION_loadvm, \
     "-loadvm [tag|id]\n" \
     "                start right away with a saved state (loadvm in monitor)\n",
diff --git a/softmmu/meson.build b/softmmu/meson.build
index 8f7210b..8ad586e 100644
--- a/softmmu/meson.build
+++ b/softmmu/meson.build
@@ -10,6 +10,7 @@ specific_ss.add(when: 'CONFIG_SOFTMMU', if_true: [files(
   'qtest.c',
   'vl.c',
   'cpu-timers.c',
+  'runstate-action.c',
 )])
 
 specific_ss.add(when: ['CONFIG_SOFTMMU', 'CONFIG_TCG'], if_true: [files(
diff --git a/softmmu/runstate-action.c b/softmmu/runstate-action.c
new file mode 100644
index 0000000..bbbbc07
--- /dev/null
+++ b/softmmu/runstate-action.c
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2020 Oracle and/or its affiliates.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu/osdep.h"
+#include "sysemu/runstate-action.h"
+#include "sysemu/sysemu.h"
+#include "sysemu/watchdog.h"
+#include "qemu/config-file.h"
+#include "qapi/error.h"
+#include "qemu/option_int.h"
+#include "qapi/qapi-commands-run-state.h"
+
+static void runstate_action_help(void)
+{
+    int idx;
+
+    printf("Events for which an action can be specified:\n");
+    for (idx = 0; idx < RUN_STATE_EVENT_TYPE__MAX; idx++) {
+        printf("%10s\n", RunStateEventType_str(idx));
+    }
+}
+
+/*
+ * Set the internal state to react to a guest reboot event
+ * as specified by the action parameter.
+ */
+static void qmp_reboot_set_action(RebootAction act, Error **errp)
+{
+    switch (act) {
+    case REBOOT_ACTION_NONE:
+        no_reboot = 0;
+        break;
+    case REBOOT_ACTION_SHUTDOWN:
+        no_reboot = 1;
+        break;
+    default:
+        g_assert_not_reached();
+    }
+}
+
+/*
+ * Set the internal state to react to a guest shutdown event
+ * as specified by the action parameter.
+ */
+static void qmp_shutdown_set_action(ShutdownAction act, Error **errp)
+{
+    switch (act) {
+    case SHUTDOWN_ACTION_PAUSE:
+        no_shutdown = 1;
+        break;
+    case SHUTDOWN_ACTION_POWEROFF:
+        no_shutdown = 0;
+        break;
+    default:
+        g_assert_not_reached();
+    }
+}
+
+/*
+ * Process an event|action pair and set the appropriate internal
+ * state if event and action are valid.
+ */
+static int set_runstate_action(void *opaque, const char *event,
+                                const char *action, Error **errp)
+{
+    int event_idx, act_idx;
+
+    event_idx = qapi_enum_parse(&RunStateEventType_lookup, event, -1, errp);
+
+    switch (event_idx) {
+    case RUN_STATE_EVENT_TYPE_REBOOT:
+        act_idx = qapi_enum_parse(&RebootAction_lookup, action, -1, errp);
+        qmp_reboot_set_action(act_idx, NULL);
+        break;
+    case RUN_STATE_EVENT_TYPE_SHUTDOWN:
+        act_idx = qapi_enum_parse(&ShutdownAction_lookup, action, -1, errp);
+        qmp_shutdown_set_action(act_idx, NULL);
+        break;
+    case RUN_STATE_EVENT_TYPE_WATCHDOG:
+        if (select_watchdog_action(action) == -1) {
+            error_report("unknown watchdog action parameter");
+            exit(1);
+        }
+        break;
+    default:
+        /*
+         * The event and action types are checked for validity in the calls to
+         * qapi_enum_parse(), which will cause an exit if the requested event or
+         * action are invalid, since error_fatal is used as the error parameter.
+         * This case is unreachable unless those conditions change.
+         */
+        g_assert_not_reached();
+    }
+
+    return 0;
+}
+
+/*
+ * Parse provided -action arguments from cmdline.
+ */
+int runstate_action_parse(QemuOptsList *opts_list, const char *optarg)
+{
+    QemuOpts *opts;
+
+    if (!strcmp(optarg, "help")) {
+        runstate_action_help();
+        return -1;
+    }
+
+    opts = qemu_opts_parse_noisily(opts_list, optarg, false);
+    if (!opts) {
+        return -1;
+    }
+    return 0;
+}
+
+/*
+ * Process all the -action parameters parsed from cmdline.
+ */
+int process_runstate_actions(void *opaque, QemuOpts *opts, Error **errp)
+{
+    if (qemu_opt_foreach(opts, set_runstate_action, NULL, errp)) {
+        return -1;
+    }
+    return 0;
+}
diff --git a/softmmu/vl.c b/softmmu/vl.c
index e6e0ad5..2b1583e 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -34,6 +34,7 @@
 #include "qemu/uuid.h"
 #include "sysemu/reset.h"
 #include "sysemu/runstate.h"
+#include "sysemu/runstate-action.h"
 #include "sysemu/seccomp.h"
 #include "sysemu/tcg.h"
 #include "sysemu/xen.h"
@@ -147,7 +148,7 @@ Chardev *parallel_hds[MAX_PARALLEL_PORTS];
 int win2k_install_hack = 0;
 int singlestep = 0;
 int fd_bootchk = 1;
-static int no_reboot;
+int no_reboot;
 int no_shutdown = 0;
 int graphic_rotate = 0;
 const char *watchdog;
@@ -506,6 +507,21 @@ static QemuOptsList qemu_fw_cfg_opts = {
     },
 };
 
+static QemuOptsList qemu_action_opts = {
+    .name = "action",
+    /*
+     * When lists are merged, the location is set to the first use of the
+     * option. If a subsequent option has an invalid parameter, the error msg
+     * will display the wrong location. Avoid this by not merging the lists.
+     */
+    .merge_lists = false,
+    .head = QTAILQ_HEAD_INITIALIZER(qemu_action_opts.head),
+    .desc = {
+        /* Validation is done when processing the runstate actions */
+        { }
+    },
+};
+
 /**
  * Get machine options
  *
@@ -2948,6 +2964,7 @@ void qemu_init(int argc, char **argv, char **envp)
     qemu_add_opts(&qemu_icount_opts);
     qemu_add_opts(&qemu_semihosting_config_opts);
     qemu_add_opts(&qemu_fw_cfg_opts);
+    qemu_add_opts(&qemu_action_opts);
     module_call_init(MODULE_INIT_OPTS);
 
     runstate_init();
@@ -3420,6 +3437,12 @@ void qemu_init(int argc, char **argv, char **envp)
                 }
                 watchdog = optarg;
                 break;
+            case QEMU_OPTION_action:
+                if (runstate_action_parse(qemu_find_opts("action"),
+                                            optarg) < 0) {
+                    exit(1);
+                }
+                break;
             case QEMU_OPTION_watchdog_action:
                 if (select_watchdog_action(optarg) == -1) {
                     error_report("unknown -watchdog-action parameter");
@@ -3902,6 +3925,11 @@ void qemu_init(int argc, char **argv, char **envp)
     qemu_opts_foreach(qemu_find_opts("name"),
                       parse_name, NULL, &error_fatal);
 
+    if (qemu_opts_foreach(qemu_find_opts("action"),
+                        process_runstate_actions, NULL, &error_fatal)) {
+        exit(1);
+    }
+
 #ifndef _WIN32
     qemu_opts_foreach(qemu_find_opts("add-fd"),
                       parse_add_fd, NULL, &error_fatal);
-- 
1.8.3.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/4] vl: Add option to avoid stopping VM upon guest panic
  2020-12-08 19:14 [PATCH 0/4] Add a new -action parameter Alejandro Jimenez
  2020-12-08 19:14 ` [PATCH 1/4] vl: Add an -action option to respond to guest events Alejandro Jimenez
@ 2020-12-08 19:14 ` Alejandro Jimenez
  2020-12-08 19:14 ` [PATCH 3/4] qmp: Allow setting -action parameters on the fly Alejandro Jimenez
  2020-12-08 19:14 ` [PATCH 4/4] qtest/pvpanic: Test panic option that allows VM to continue Alejandro Jimenez
  3 siblings, 0 replies; 8+ messages in thread
From: Alejandro Jimenez @ 2020-12-08 19:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini

The current default action of pausing a guest after a panic event
is received leaves the responsibility to resume guest execution to the
management layer. The reasons for this behavior are discussed here:
https://lore.kernel.org/qemu-devel/52148F88.5000509@redhat.com/

However, in instances like the case of older guests (Linux and
Windows) using a pvpanic device but missing support for the
PVPANIC_CRASHLOADED event, and Windows guests using the hv-crash
enlightenment, it is desirable to allow the guests to continue
running after sending a PVPANIC_PANICKED event. This allows such
guests to proceed to capture a crash dump and automatically reboot
without intervention of a management layer.

Add an option to avoid stopping a VM after a panic event is received,
by passing:

-action panic=none

in the command line arguments, or during runtime by using an upcoming
QMP command.

Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
Reviewed-by: David Edmondson <david.edmondson@oracle.com>
Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
---
 include/sysemu/sysemu.h   |  1 +
 qapi/run-state.json       | 27 ++++++++++++++++++++++++++-
 qemu-options.hx           |  3 +++
 softmmu/runstate-action.c | 22 ++++++++++++++++++++++
 softmmu/vl.c              | 14 +++++++++++---
 5 files changed, 63 insertions(+), 4 deletions(-)

diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 5480e61..863142e 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -45,6 +45,7 @@ extern int ctrl_grab;
 extern int graphic_rotate;
 extern int no_reboot;
 extern int no_shutdown;
+extern int pause_on_panic;
 extern int old_param;
 extern int boot_menu;
 extern bool boot_strict;
diff --git a/qapi/run-state.json b/qapi/run-state.json
index 6b033c1..27b62ce 100644
--- a/qapi/run-state.json
+++ b/qapi/run-state.json
@@ -337,12 +337,14 @@
 #
 # @shutdown: Guest shutdown
 #
+# @panic: Guest has panicked
+#
 # @watchdog: A watchdog device's timer has expired
 #
 # Since: 6.0
 ##
 { 'enum': 'RunStateEventType',
-  'data': [ 'reboot', 'shutdown', 'watchdog' ] }
+  'data': [ 'reboot', 'shutdown', 'panic', 'watchdog' ] }
 
 ##
 # @RunStateAction:
@@ -358,6 +360,7 @@
   'data': {
     'reboot': 'RunStateRebootAction',
     'shutdown': 'RunStateShutdownAction',
+    'panic': 'RunStatePanicAction',
     'watchdog': 'RunStateWatchdogAction' } }
 
 ##
@@ -407,6 +410,28 @@
   'data': [ 'pause', 'poweroff' ] }
 
 ##
+# @RunStatePanicAction:
+#
+# @action: Action taken by QEMU when guest panicks
+#
+# Since: 6.0
+##
+{ 'struct': 'RunStatePanicAction',
+  'data': { 'action': 'PanicAction' } }
+
+##
+# @PanicAction:
+#
+# @none: Continue VM execution
+#
+# @pause: Pause the VM
+#
+# Since: 6.0
+##
+{ 'enum': 'PanicAction',
+  'data': [ 'none', 'pause' ] }
+
+##
 # @RunStateWatchdogAction:
 #
 # @action: Action taken by QEMU when watchdog device timer expires
diff --git a/qemu-options.hx b/qemu-options.hx
index a0d50f0..8b7d8bb 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -3899,6 +3899,8 @@ DEF("action", HAS_ARG, QEMU_OPTION_action,
     "                   action when guest reboots [default=none]\n"
     "-action shutdown=poweroff|pause\n"
     "                   action when guest shuts down [default=poweroff]\n"
+    "-action panic=pause|none\n"
+    "                   action when guest panics [default=pause]\n"
     "-action watchdog=reset|shutdown|poweroff|inject-nmi|pause|debug|none\n"
     "                   action when watchdog fires [default=reset]\n",
     QEMU_ARCH_ALL)
@@ -3911,6 +3913,7 @@ SRST
 
     Examples:
 
+    ``-action panic=none``
     ``-action reboot=shutdown,shutdown=pause``
     ``-watchdog i6300esb -action watchdog=pause``
 
diff --git a/softmmu/runstate-action.c b/softmmu/runstate-action.c
index bbbbc07..9c92595 100644
--- a/softmmu/runstate-action.c
+++ b/softmmu/runstate-action.c
@@ -62,6 +62,24 @@ static void qmp_shutdown_set_action(ShutdownAction act, Error **errp)
 }
 
 /*
+ * Set the internal state to react to a guest panic event
+ * as specified by the action parameter.
+ */
+static void qmp_panic_set_action(PanicAction action, Error **errp)
+{
+    switch (action) {
+    case PANIC_ACTION_NONE:
+        pause_on_panic = 0;
+        break;
+    case PANIC_ACTION_PAUSE:
+        pause_on_panic = 1;
+        break;
+    default:
+        g_assert_not_reached();
+    }
+}
+
+/*
  * Process an event|action pair and set the appropriate internal
  * state if event and action are valid.
  */
@@ -81,6 +99,10 @@ static int set_runstate_action(void *opaque, const char *event,
         act_idx = qapi_enum_parse(&ShutdownAction_lookup, action, -1, errp);
         qmp_shutdown_set_action(act_idx, NULL);
         break;
+    case RUN_STATE_EVENT_TYPE_PANIC:
+        act_idx = qapi_enum_parse(&PanicAction_lookup, action, -1, errp);
+        qmp_panic_set_action(act_idx, NULL);
+        break;
     case RUN_STATE_EVENT_TYPE_WATCHDOG:
         if (select_watchdog_action(action) == -1) {
             error_report("unknown watchdog action parameter");
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 2b1583e..20f89cb 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -150,6 +150,7 @@ int singlestep = 0;
 int fd_bootchk = 1;
 int no_reboot;
 int no_shutdown = 0;
+int pause_on_panic = 1;
 int graphic_rotate = 0;
 const char *watchdog;
 QEMUOptionRom option_rom[MAX_OPTION_ROMS];
@@ -1449,9 +1450,16 @@ void qemu_system_guest_panicked(GuestPanicInformation *info)
     if (current_cpu) {
         current_cpu->crash_occurred = true;
     }
-    qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE,
-                                   !!info, info);
-    vm_stop(RUN_STATE_GUEST_PANICKED);
+
+    if (pause_on_panic) {
+        qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE,
+                                        !!info, info);
+        vm_stop(RUN_STATE_GUEST_PANICKED);
+    } else {
+        qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_RUN,
+                                        !!info, info);
+    }
+
     if (!no_shutdown) {
         qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_POWEROFF,
                                        !!info, info);
-- 
1.8.3.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/4] qmp: Allow setting -action parameters on the fly
  2020-12-08 19:14 [PATCH 0/4] Add a new -action parameter Alejandro Jimenez
  2020-12-08 19:14 ` [PATCH 1/4] vl: Add an -action option to respond to guest events Alejandro Jimenez
  2020-12-08 19:14 ` [PATCH 2/4] vl: Add option to avoid stopping VM upon guest panic Alejandro Jimenez
@ 2020-12-08 19:14 ` Alejandro Jimenez
  2020-12-08 19:57   ` Paolo Bonzini
  2020-12-08 19:14 ` [PATCH 4/4] qtest/pvpanic: Test panic option that allows VM to continue Alejandro Jimenez
  3 siblings, 1 reply; 8+ messages in thread
From: Alejandro Jimenez @ 2020-12-08 19:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini

Add QMP commands to allow for the behaviors specified by the
-action event=action command line option to be set at runtime,
mimicking the watchdog-set-action QMP command.

Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
Reviewed-by: David Edmondson <david.edmondson@oracle.com>
Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
---
 qapi/run-state.json       | 27 +++++++++++++++++++++++++++
 softmmu/runstate-action.c |  6 +++---
 2 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/qapi/run-state.json b/qapi/run-state.json
index 27b62ce..de27516 100644
--- a/qapi/run-state.json
+++ b/qapi/run-state.json
@@ -451,6 +451,33 @@
 { 'command': 'watchdog-set-action', 'data' : {'action': 'WatchdogAction'} }
 
 ##
+# @reboot-set-action:
+#
+# Set reboot action
+#
+# Since: 6.0
+##
+{ 'command': 'reboot-set-action', 'data' : {'action': 'RebootAction'} }
+
+##
+# @shutdown-set-action:
+#
+# Set shutdown action
+#
+# Since: 6.0
+##
+{ 'command': 'shutdown-set-action', 'data' : {'action': 'ShutdownAction'} }
+
+##
+# @panic-set-action:
+#
+# Set panic action
+#
+# Since: 6.0
+##
+{ 'command': 'panic-set-action', 'data' : {'action': 'PanicAction'} }
+
+##
 # @GUEST_PANICKED:
 #
 # Emitted when guest OS panic is detected
diff --git a/softmmu/runstate-action.c b/softmmu/runstate-action.c
index 9c92595..aef23b8 100644
--- a/softmmu/runstate-action.c
+++ b/softmmu/runstate-action.c
@@ -29,7 +29,7 @@ static void runstate_action_help(void)
  * Set the internal state to react to a guest reboot event
  * as specified by the action parameter.
  */
-static void qmp_reboot_set_action(RebootAction act, Error **errp)
+void qmp_reboot_set_action(RebootAction act, Error **errp)
 {
     switch (act) {
     case REBOOT_ACTION_NONE:
@@ -47,7 +47,7 @@ static void qmp_reboot_set_action(RebootAction act, Error **errp)
  * Set the internal state to react to a guest shutdown event
  * as specified by the action parameter.
  */
-static void qmp_shutdown_set_action(ShutdownAction act, Error **errp)
+void qmp_shutdown_set_action(ShutdownAction act, Error **errp)
 {
     switch (act) {
     case SHUTDOWN_ACTION_PAUSE:
@@ -65,7 +65,7 @@ static void qmp_shutdown_set_action(ShutdownAction act, Error **errp)
  * Set the internal state to react to a guest panic event
  * as specified by the action parameter.
  */
-static void qmp_panic_set_action(PanicAction action, Error **errp)
+void qmp_panic_set_action(PanicAction action, Error **errp)
 {
     switch (action) {
     case PANIC_ACTION_NONE:
-- 
1.8.3.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/4] qtest/pvpanic: Test panic option that allows VM to continue
  2020-12-08 19:14 [PATCH 0/4] Add a new -action parameter Alejandro Jimenez
                   ` (2 preceding siblings ...)
  2020-12-08 19:14 ` [PATCH 3/4] qmp: Allow setting -action parameters on the fly Alejandro Jimenez
@ 2020-12-08 19:14 ` Alejandro Jimenez
  3 siblings, 0 replies; 8+ messages in thread
From: Alejandro Jimenez @ 2020-12-08 19:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini

Test the scenario where the -action panic=none parameter is used to
signal that the VM must continue executing after a guest panic
occurs.

Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
Reviewed-by: David Edmondson <david.edmondson@oracle.com>
Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
---
 tests/qtest/pvpanic-test.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/tests/qtest/pvpanic-test.c b/tests/qtest/pvpanic-test.c
index 016b32e..6dcad2d 100644
--- a/tests/qtest/pvpanic-test.c
+++ b/tests/qtest/pvpanic-test.c
@@ -11,13 +11,36 @@
 #include "libqos/libqtest.h"
 #include "qapi/qmp/qdict.h"
 
+static void test_panic_nopause(void)
+{
+    uint8_t val;
+    QDict *response, *data;
+    QTestState *qts;
+
+    qts = qtest_init("-device pvpanic -action panic=none");
+
+    val = qtest_inb(qts, 0x505);
+    g_assert_cmpuint(val, ==, 3);
+
+    qtest_outb(qts, 0x505, 0x1);
+
+    response = qtest_qmp_eventwait_ref(qts, "GUEST_PANICKED");
+    g_assert(qdict_haskey(response, "data"));
+    data = qdict_get_qdict(response, "data");
+    g_assert(qdict_haskey(data, "action"));
+    g_assert_cmpstr(qdict_get_str(data, "action"), ==, "run");
+    qobject_unref(response);
+
+    qtest_quit(qts);
+}
+
 static void test_panic(void)
 {
     uint8_t val;
     QDict *response, *data;
     QTestState *qts;
 
-    qts = qtest_init("-device pvpanic");
+    qts = qtest_init("-device pvpanic -action panic=pause");
 
     val = qtest_inb(qts, 0x505);
     g_assert_cmpuint(val, ==, 3);
@@ -40,6 +63,7 @@ int main(int argc, char **argv)
 
     g_test_init(&argc, &argv, NULL);
     qtest_add_func("/pvpanic/panic", test_panic);
+    qtest_add_func("/pvpanic/panic-nopause", test_panic_nopause);
 
     ret = g_test_run();
 
-- 
1.8.3.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/4] qmp: Allow setting -action parameters on the fly
  2020-12-08 19:14 ` [PATCH 3/4] qmp: Allow setting -action parameters on the fly Alejandro Jimenez
@ 2020-12-08 19:57   ` Paolo Bonzini
  2020-12-08 19:58     ` Paolo Bonzini
  0 siblings, 1 reply; 8+ messages in thread
From: Paolo Bonzini @ 2020-12-08 19:57 UTC (permalink / raw)
  To: Alejandro Jimenez, qemu-devel

On 08/12/20 20:14, Alejandro Jimenez wrote:
>   ##
> +# @reboot-set-action:
> +#
> +# Set reboot action
> +#
> +# Since: 6.0
> +##
> +{ 'command': 'reboot-set-action', 'data' : {'action': 'RebootAction'} }
> +
> +##
> +# @shutdown-set-action:
> +#
> +# Set shutdown action
> +#
> +# Since: 6.0
> +##
> +{ 'command': 'shutdown-set-action', 'data' : {'action': 'ShutdownAction'} }
> +
> +##
> +# @panic-set-action:
> +#
> +# Set panic action
> +#
> +# Since: 6.0
> +##
> +{ 'command': 'panic-set-action', 'data' : {'action': 'PanicAction'} }
> +
> +##

What about a single action-set command with arguments reboot, shutdown 
and panic?

Paolo



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/4] qmp: Allow setting -action parameters on the fly
  2020-12-08 19:57   ` Paolo Bonzini
@ 2020-12-08 19:58     ` Paolo Bonzini
  2020-12-08 20:59       ` Alejandro Jimenez
  0 siblings, 1 reply; 8+ messages in thread
From: Paolo Bonzini @ 2020-12-08 19:58 UTC (permalink / raw)
  To: Alejandro Jimenez, qemu-devel

On 08/12/20 20:57, Paolo Bonzini wrote:
> On 08/12/20 20:14, Alejandro Jimenez wrote:
>>   ##
>> +# @reboot-set-action:
>> +#
>> +# Set reboot action
>> +#
>> +# Since: 6.0
>> +##
>> +{ 'command': 'reboot-set-action', 'data' : {'action': 'RebootAction'} }
>> +
>> +##
>> +# @shutdown-set-action:
>> +#
>> +# Set shutdown action
>> +#
>> +# Since: 6.0
>> +##
>> +{ 'command': 'shutdown-set-action', 'data' : {'action': 
>> 'ShutdownAction'} }
>> +
>> +##
>> +# @panic-set-action:
>> +#
>> +# Set panic action
>> +#
>> +# Since: 6.0
>> +##
>> +{ 'command': 'panic-set-action', 'data' : {'action': 'PanicAction'} }
>> +
>> +##
> 
> What about a single action-set command with arguments reboot, shutdown 
> and panic?

(and watchdog, of course)?

Paolo


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/4] qmp: Allow setting -action parameters on the fly
  2020-12-08 19:58     ` Paolo Bonzini
@ 2020-12-08 20:59       ` Alejandro Jimenez
  0 siblings, 0 replies; 8+ messages in thread
From: Alejandro Jimenez @ 2020-12-08 20:59 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel



On 12/8/2020 2:58 PM, Paolo Bonzini wrote:
> On 08/12/20 20:57, Paolo Bonzini wrote:
>> On 08/12/20 20:14, Alejandro Jimenez wrote:
>>>   ##
>>> +# @reboot-set-action:
>>> +#
>>> +# Set reboot action
>>> +#
>>> +# Since: 6.0
>>> +##
>>> +{ 'command': 'reboot-set-action', 'data' : {'action': 
>>> 'RebootAction'} }
>>> +
>>> +##
>>> +# @shutdown-set-action:
>>> +#
>>> +# Set shutdown action
>>> +#
>>> +# Since: 6.0
>>> +##
>>> +{ 'command': 'shutdown-set-action', 'data' : {'action': 
>>> 'ShutdownAction'} }
>>> +
>>> +##
>>> +# @panic-set-action:
>>> +#
>>> +# Set panic action
>>> +#
>>> +# Since: 6.0
>>> +##
>>> +{ 'command': 'panic-set-action', 'data' : {'action': 'PanicAction'} }
>>> +
>>> +##
>>
>> What about a single action-set command with arguments reboot, 
>> shutdown and panic?
>
> (and watchdog, of course)?
Just to make sure I understand the request: an action-set QMP command 
would need to take two arguments: an event 
(reboot|shutdown|panic|watchdog), and a valid action for that event 
type, akin to what set_runstate_action() does. I'll work on it.

Alejandro
>
> Paolo



^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-12-08 22:13 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-08 19:14 [PATCH 0/4] Add a new -action parameter Alejandro Jimenez
2020-12-08 19:14 ` [PATCH 1/4] vl: Add an -action option to respond to guest events Alejandro Jimenez
2020-12-08 19:14 ` [PATCH 2/4] vl: Add option to avoid stopping VM upon guest panic Alejandro Jimenez
2020-12-08 19:14 ` [PATCH 3/4] qmp: Allow setting -action parameters on the fly Alejandro Jimenez
2020-12-08 19:57   ` Paolo Bonzini
2020-12-08 19:58     ` Paolo Bonzini
2020-12-08 20:59       ` Alejandro Jimenez
2020-12-08 19:14 ` [PATCH 4/4] qtest/pvpanic: Test panic option that allows VM to continue Alejandro Jimenez

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.