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

v2:
- Replaced the individual qmp commands in patch 3/4 for a generic set-action
command that takes a RunStateAction parameter, specifying an event|action pair.
- Removed qmp_ prefix from X_set_action() functions in runstate-action.c

***

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              | 135 +++++++++++++++++++++++++++++
 qemu-options.hx                  |  25 ++++++
 softmmu/meson.build              |   1 +
 softmmu/runstate-action.c        | 182 +++++++++++++++++++++++++++++++++++++++
 softmmu/vl.c                     |  44 +++++++++-
 tests/qtest/pvpanic-test.c       |  26 +++++-
 9 files changed, 428 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] 10+ messages in thread

* [PATCH v2 1/4] vl: Add an -action option to respond to guest events
  2020-12-09 17:52 [PATCH v2 0/4] Add a new -action parameter Alejandro Jimenez
@ 2020-12-09 17:52 ` Alejandro Jimenez
  2020-12-09 21:44   ` Paolo Bonzini
  2020-12-09 17:52 ` [PATCH v2 2/4] vl: Add option to avoid stopping VM upon guest panic Alejandro Jimenez
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: Alejandro Jimenez @ 2020-12-09 17:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: david.edmondson, 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>
---
 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..f1fd457
--- /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 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 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);
+        reboot_set_action(act_idx, NULL);
+        break;
+    case RUN_STATE_EVENT_TYPE_SHUTDOWN:
+        act_idx = qapi_enum_parse(&ShutdownAction_lookup, action, -1, errp);
+        shutdown_set_action(act_idx, NULL);
+        break;
+    case RUN_STATE_EVENT_TYPE_WATCHDOG:
+        if (select_watchdog_action(action) == -1) {
+            error_report("invalid parameter value: %s", action);
+            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] 10+ messages in thread

* [PATCH v2 2/4] vl: Add option to avoid stopping VM upon guest panic
  2020-12-09 17:52 [PATCH v2 0/4] Add a new -action parameter Alejandro Jimenez
  2020-12-09 17:52 ` [PATCH v2 1/4] vl: Add an -action option to respond to guest events Alejandro Jimenez
@ 2020-12-09 17:52 ` Alejandro Jimenez
  2020-12-10  2:43   ` Paolo Bonzini
  2020-12-09 17:52 ` [PATCH v2 3/4] qmp: Allow setting -action parameters on the fly Alejandro Jimenez
  2020-12-09 17:52 ` [PATCH v2 4/4] qtest/pvpanic: Test panic option that allows VM to continue Alejandro Jimenez
  3 siblings, 1 reply; 10+ messages in thread
From: Alejandro Jimenez @ 2020-12-09 17:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: david.edmondson, 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>
---
 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 f1fd457..a644d80 100644
--- a/softmmu/runstate-action.c
+++ b/softmmu/runstate-action.c
@@ -62,6 +62,24 @@ static void 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 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);
         shutdown_set_action(act_idx, NULL);
         break;
+    case RUN_STATE_EVENT_TYPE_PANIC:
+        act_idx = qapi_enum_parse(&PanicAction_lookup, action, -1, errp);
+        panic_set_action(act_idx, NULL);
+        break;
     case RUN_STATE_EVENT_TYPE_WATCHDOG:
         if (select_watchdog_action(action) == -1) {
             error_report("invalid parameter value: %s", action);
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] 10+ messages in thread

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

Add a QMP command to allow for the behaviors specified by the
-action event=action command line option to be set at runtime.
The new command is named set-action, and takes a single argument
of type RunStateAction, which contains an event|action pair.

Example:

-> { "execute": "set-action",
     "arguments": { "pair": {
         "event": "shutdown",
	  "action": "pause" } } }
<- { "return": {} }

Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
---
 qapi/run-state.json       | 22 ++++++++++++++++++++++
 softmmu/runstate-action.c | 29 +++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+)

diff --git a/qapi/run-state.json b/qapi/run-state.json
index 27b62ce..ead9dab 100644
--- a/qapi/run-state.json
+++ b/qapi/run-state.json
@@ -451,6 +451,28 @@
 { 'command': 'watchdog-set-action', 'data' : {'action': 'WatchdogAction'} }
 
 ##
+# @set-action:
+#
+# Set the action that will be taken by the emulator in response to a guest
+# event.
+#
+# @pair: a @RunStateAction type that describes an event|action pair.
+#
+# Returns: Nothing on success.
+#
+# Since: 6.0
+#
+# Example:
+#
+# -> { "execute": "set-action",
+#         "arguments": { "pair": {
+#             "event": "shutdown",
+#             "action": "pause" } } }
+# <- { "return": {} }
+##
+{ 'command': 'set-action', 'data' : {'pair': 'RunStateAction'} }
+
+##
 # @GUEST_PANICKED:
 #
 # Emitted when guest OS panic is detected
diff --git a/softmmu/runstate-action.c b/softmmu/runstate-action.c
index a644d80..7877e7e 100644
--- a/softmmu/runstate-action.c
+++ b/softmmu/runstate-action.c
@@ -80,6 +80,35 @@ static void panic_set_action(PanicAction action, Error **errp)
 }
 
 /*
+ * Receives a RunStateAction type which represents an event|action pair
+ * and sets the internal state as requested.
+ */
+void qmp_set_action(RunStateAction *pair, Error **errp)
+{
+    switch (pair->event) {
+    case RUN_STATE_EVENT_TYPE_REBOOT:
+        reboot_set_action(pair->u.reboot.action, NULL);
+        break;
+    case RUN_STATE_EVENT_TYPE_SHUTDOWN:
+        shutdown_set_action(pair->u.shutdown.action, NULL);
+        break;
+    case RUN_STATE_EVENT_TYPE_PANIC:
+        panic_set_action(pair->u.panic.action, NULL);
+        break;
+    case RUN_STATE_EVENT_TYPE_WATCHDOG:
+        qmp_watchdog_set_action(pair->u.watchdog.action, NULL);
+        break;
+    default:
+        /*
+         * The fields in the RunStateAction argument are validated
+         * by the QMP marshalling code before this function is called.
+         * This case is unreachable unless new variants are added.
+         */
+        g_assert_not_reached();
+    }
+}
+
+/*
  * Process an event|action pair and set the appropriate internal
  * state if event and action are valid.
  */
-- 
1.8.3.1



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

* [PATCH v2 4/4] qtest/pvpanic: Test panic option that allows VM to continue
  2020-12-09 17:52 [PATCH v2 0/4] Add a new -action parameter Alejandro Jimenez
                   ` (2 preceding siblings ...)
  2020-12-09 17:52 ` [PATCH v2 3/4] qmp: Allow setting -action parameters on the fly Alejandro Jimenez
@ 2020-12-09 17:52 ` Alejandro Jimenez
  3 siblings, 0 replies; 10+ messages in thread
From: Alejandro Jimenez @ 2020-12-09 17:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: david.edmondson, 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>
---
 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] 10+ messages in thread

* Re: [PATCH v2 3/4] qmp: Allow setting -action parameters on the fly
  2020-12-09 17:52 ` [PATCH v2 3/4] qmp: Allow setting -action parameters on the fly Alejandro Jimenez
@ 2020-12-09 21:43   ` Paolo Bonzini
  2020-12-10  3:21     ` Alejandro Jimenez
  0 siblings, 1 reply; 10+ messages in thread
From: Paolo Bonzini @ 2020-12-09 21:43 UTC (permalink / raw)
  To: Alejandro Jimenez, qemu-devel; +Cc: david.edmondson

On 09/12/20 18:52, Alejandro Jimenez wrote:
> +# Set the action that will be taken by the emulator in response to a guest
> +# event.
> +#
> +# @pair: a @RunStateAction type that describes an event|action pair.
> +#
> +# Returns: Nothing on success.
> +#
> +# Since: 6.0
> +#
> +# Example:
> +#
> +# -> { "execute": "set-action",
> +#         "arguments": { "pair": {
> +#             "event": "shutdown",
> +#             "action": "pause" } } }
> +# <- { "return": {} }
> +##
> +{ 'command': 'set-action', 'data' : {'pair': 'RunStateAction'} }
> +
> +##
>   # @GUEST_PANICKED:
>   #
>   # Emitted when guest OS panic is detected
> diff --git a/softmmu/runstate-action.c b/softmmu/runstate-action.c
> index a644d80..7877e7e 100644
> --- a/softmmu/runstate-action.c
> +++ b/softmmu/runstate-action.c
> @@ -80,6 +80,35 @@ static void panic_set_action(PanicAction action, Error **errp)
>   }
>   
>   /*
> + * Receives a RunStateAction type which represents an event|action pair
> + * and sets the internal state as requested.
> + */
> +void qmp_set_action(RunStateAction *pair, Error **errp)
> +{
> +    switch (pair->event) {
> +    case RUN_STATE_EVENT_TYPE_REBOOT:
> +        reboot_set_action(pair->u.reboot.action, NULL);
> +        break;
> +    case RUN_STATE_EVENT_TYPE_SHUTDOWN:
> +        shutdown_set_action(pair->u.shutdown.action, NULL);
> +        break;
> +    case RUN_STATE_EVENT_TYPE_PANIC:
> +        panic_set_action(pair->u.panic.action, NULL);
> +        break;
> +    case RUN_STATE_EVENT_TYPE_WATCHDOG:
> +        qmp_watchdog_set_action(pair->u.watchdog.action, NULL);
> +        break;
> +    default:
> +        /*
> +         * The fields in the RunStateAction argument are validated
> +         * by the QMP marshalling code before this function is called.
> +         * This case is unreachable unless new variants are added.
> +         */
> +        g_assert_not_reached();
> +    }
> +}
> +

Any reason not to have the multiple optional arguments as discussed in 
v1 (no reply usually means you agree)?  The implementation would be 
nice, like

     if (actions->has_reboot) {
         reboot_set_action(actions->reboot);
     }
     etc.

?

Note that, in patches 1-2, you don't need to add an Error** argument to 
functions that cannot fail.

Thanks,

Paolo



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

* Re: [PATCH v2 1/4] vl: Add an -action option to respond to guest events
  2020-12-09 17:52 ` [PATCH v2 1/4] vl: Add an -action option to respond to guest events Alejandro Jimenez
@ 2020-12-09 21:44   ` Paolo Bonzini
  0 siblings, 0 replies; 10+ messages in thread
From: Paolo Bonzini @ 2020-12-09 21:44 UTC (permalink / raw)
  To: Alejandro Jimenez, qemu-devel; +Cc: david.edmondson

On 09/12/20 18:52, Alejandro Jimenez wrote:
> -static int no_reboot;
> +int no_reboot;
>   int no_shutdown = 0;

Since you are at it, please move these globals to the new file.

Paolo



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

* Re: [PATCH v2 2/4] vl: Add option to avoid stopping VM upon guest panic
  2020-12-09 17:52 ` [PATCH v2 2/4] vl: Add option to avoid stopping VM upon guest panic Alejandro Jimenez
@ 2020-12-10  2:43   ` Paolo Bonzini
  0 siblings, 0 replies; 10+ messages in thread
From: Paolo Bonzini @ 2020-12-10  2:43 UTC (permalink / raw)
  To: Alejandro Jimenez, qemu-devel; +Cc: david.edmondson

On 09/12/20 18:52, Alejandro Jimenez wrote:
> -    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);

The "if" below suggests making -action panic's argument a tri-state 
(none/pause/poweroff; default is poweroff and -no-shutdown becomes 
equivalent to -action shutdown=pause,panic=pause).

In principle debug and reset could be supported as well, so maybe add a 
TODO comment.

Paolo



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

* Re: [PATCH v2 3/4] qmp: Allow setting -action parameters on the fly
  2020-12-09 21:43   ` Paolo Bonzini
@ 2020-12-10  3:21     ` Alejandro Jimenez
  2020-12-10 18:00       ` Paolo Bonzini
  0 siblings, 1 reply; 10+ messages in thread
From: Alejandro Jimenez @ 2020-12-10  3:21 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel; +Cc: david.edmondson



On 12/9/2020 4:43 PM, Paolo Bonzini wrote:
> On 09/12/20 18:52, Alejandro Jimenez wrote:
>> +# Set the action that will be taken by the emulator in response to a 
>> guest
>> +# event.
>> +#
>> +# @pair: a @RunStateAction type that describes an event|action pair.
>> +#
>> +# Returns: Nothing on success.
>> +#
>> +# Since: 6.0
>> +#
>> +# Example:
>> +#
>> +# -> { "execute": "set-action",
>> +#         "arguments": { "pair": {
>> +#             "event": "shutdown",
>> +#             "action": "pause" } } }
>> +# <- { "return": {} }
>> +##
>> +{ 'command': 'set-action', 'data' : {'pair': 'RunStateAction'} }
>> +
>> +##
>>   # @GUEST_PANICKED:
>>   #
>>   # Emitted when guest OS panic is detected
>> diff --git a/softmmu/runstate-action.c b/softmmu/runstate-action.c
>> index a644d80..7877e7e 100644
>> --- a/softmmu/runstate-action.c
>> +++ b/softmmu/runstate-action.c
>> @@ -80,6 +80,35 @@ static void panic_set_action(PanicAction action, 
>> Error **errp)
>>   }
>>     /*
>> + * Receives a RunStateAction type which represents an event|action pair
>> + * and sets the internal state as requested.
>> + */
>> +void qmp_set_action(RunStateAction *pair, Error **errp)
>> +{
>> +    switch (pair->event) {
>> +    case RUN_STATE_EVENT_TYPE_REBOOT:
>> +        reboot_set_action(pair->u.reboot.action, NULL);
>> +        break;
>> +    case RUN_STATE_EVENT_TYPE_SHUTDOWN:
>> +        shutdown_set_action(pair->u.shutdown.action, NULL);
>> +        break;
>> +    case RUN_STATE_EVENT_TYPE_PANIC:
>> +        panic_set_action(pair->u.panic.action, NULL);
>> +        break;
>> +    case RUN_STATE_EVENT_TYPE_WATCHDOG:
>> +        qmp_watchdog_set_action(pair->u.watchdog.action, NULL);
>> +        break;
>> +    default:
>> +        /*
>> +         * The fields in the RunStateAction argument are validated
>> +         * by the QMP marshalling code before this function is called.
>> +         * This case is unreachable unless new variants are added.
>> +         */
>> +        g_assert_not_reached();
>> +    }
>> +}
>> +
>
> Any reason not to have the multiple optional arguments as discussed in 
> v1 (no reply usually means you agree)?  The implementation would be 
> nice, like
>
>     if (actions->has_reboot) {
>         reboot_set_action(actions->reboot);
>     }
>     etc.
>
> ?
I misunderstood your request in v1. I'll try to be explicit to avoid 
more confusion. Are you expecting a command of the form:

{ 'command': 'set-action',
'data' : {
     '*reboot': 'RebootAction',
     '*shutdown': 'ShutdownAction',
     '*panic': 'PanicAction',
     '*watchdog': 'WatchdogAction' } }
?

Or is it better to encapsulate all of those optional fields inside a new 
struct definition (RunStateActions?) so that the command would be:

{ 'command': 'set-action', 'data': 'actions' : 'RunStateActions' }

which is what the "actions->has_reboot" example seems to suggest?

Or is it something else that I am not understanding yet?

>
> Note that, in patches 1-2, you don't need to add an Error** argument 
> to functions that cannot fail.
This was left over from the initial patch. I'll fix it.

Alejandro
>
> Thanks,
>
> Paolo
>



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

* Re: [PATCH v2 3/4] qmp: Allow setting -action parameters on the fly
  2020-12-10  3:21     ` Alejandro Jimenez
@ 2020-12-10 18:00       ` Paolo Bonzini
  0 siblings, 0 replies; 10+ messages in thread
From: Paolo Bonzini @ 2020-12-10 18:00 UTC (permalink / raw)
  To: Alejandro Jimenez, qemu-devel; +Cc: david.edmondson

On 10/12/20 04:21, Alejandro Jimenez wrote:
> I misunderstood your request in v1. 

Oh ypu're right, in v1 you had multiple commands.  My fault then.

> 
> { 'command': 'set-action',
> 'data' : {
>      '*reboot': 'RebootAction',
>      '*shutdown': 'ShutdownAction',
>      '*panic': 'PanicAction',
>      '*watchdog': 'WatchdogAction' } }
> ?
> 
> Or is it better to encapsulate all of those optional fields inside a new 
> struct definition (RunStateActions?) so that the command would be:
> 
> { 'command': 'set-action', 'data': 'actions' : 'RunStateActions' }

Any of the two is fine; the QMP stream is the same.  I used 
actions->reboot because that's what you did in v2.

While at it, you might add

    'allow-preconfig': true,

as well.  (Right now there are relatively few allow-preconfig commands, 
but I'm in the process of adding it to all commands where it makes sense).

Thanks,

Paolo



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

end of thread, other threads:[~2020-12-10 18:06 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-09 17:52 [PATCH v2 0/4] Add a new -action parameter Alejandro Jimenez
2020-12-09 17:52 ` [PATCH v2 1/4] vl: Add an -action option to respond to guest events Alejandro Jimenez
2020-12-09 21:44   ` Paolo Bonzini
2020-12-09 17:52 ` [PATCH v2 2/4] vl: Add option to avoid stopping VM upon guest panic Alejandro Jimenez
2020-12-10  2:43   ` Paolo Bonzini
2020-12-09 17:52 ` [PATCH v2 3/4] qmp: Allow setting -action parameters on the fly Alejandro Jimenez
2020-12-09 21:43   ` Paolo Bonzini
2020-12-10  3:21     ` Alejandro Jimenez
2020-12-10 18:00       ` Paolo Bonzini
2020-12-09 17:52 ` [PATCH v2 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.