qapi: Add exit-failure PanicAction

Currently QEMU exits with code 0 on both panic an shutdown. For tests
it is useful to return 1 on panic, so that it counts as a test
failure.

Introduce a new exit-failure PanicAction that makes main() return
EXIT_FAILURE. Tests can use -action panic=exit-failure option to
activate this behavior.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: David Hildenbrand <david@redhat.com>
Message-Id: <20220725223746.227063-2-iii@linux.ibm.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
This commit is contained in:
Ilya Leoshkevich 2022-07-26 00:37:45 +02:00 committed by Alex Bennée
parent 9b1268f55c
commit 0882caf4d6
5 changed files with 23 additions and 9 deletions

View file

@ -103,7 +103,7 @@ void qemu_boot_set(const char *boot_order, Error **errp);
bool defaults_enabled(void);
void qemu_init(int argc, char **argv, char **envp);
void qemu_main_loop(void);
int qemu_main_loop(void);
void qemu_cleanup(void);
extern QemuOptsList qemu_legacy_drive_opts;

View file

@ -364,10 +364,13 @@
#
# @shutdown: Shutdown the VM and exit, according to the shutdown action
#
# @exit-failure: Shutdown the VM and exit with nonzero status
# (since 7.1)
#
# Since: 6.0
##
{ 'enum': 'PanicAction',
'data': [ 'pause', 'shutdown', 'none' ] }
'data': [ 'pause', 'shutdown', 'exit-failure', 'none' ] }
##
# @watchdog-set-action:

View file

@ -4239,7 +4239,7 @@ DEF("action", HAS_ARG, QEMU_OPTION_action,
" action when guest reboots [default=reset]\n"
"-action shutdown=poweroff|pause\n"
" action when guest shuts down [default=poweroff]\n"
"-action panic=pause|shutdown|none\n"
"-action panic=pause|shutdown|exit-failure|none\n"
" action when guest panics [default=shutdown]\n"
"-action watchdog=reset|shutdown|poweroff|inject-nmi|pause|debug|none\n"
" action when watchdog fires [default=reset]\n",

View file

@ -32,11 +32,13 @@
int qemu_main(int argc, char **argv, char **envp)
{
int status;
qemu_init(argc, argv, envp);
qemu_main_loop();
status = qemu_main_loop();
qemu_cleanup();
return 0;
return status;
}
#ifndef CONFIG_COCOA

View file

@ -482,7 +482,8 @@ void qemu_system_guest_panicked(GuestPanicInformation *info)
qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE,
!!info, info);
vm_stop(RUN_STATE_GUEST_PANICKED);
} else if (panic_action == PANIC_ACTION_SHUTDOWN) {
} else if (panic_action == PANIC_ACTION_SHUTDOWN ||
panic_action == PANIC_ACTION_EXIT_FAILURE) {
qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_POWEROFF,
!!info, info);
vm_stop(RUN_STATE_GUEST_PANICKED);
@ -662,7 +663,7 @@ void qemu_system_debug_request(void)
qemu_notify_event();
}
static bool main_loop_should_exit(void)
static bool main_loop_should_exit(int *status)
{
RunState r;
ShutdownCause request;
@ -680,6 +681,10 @@ static bool main_loop_should_exit(void)
if (shutdown_action == SHUTDOWN_ACTION_PAUSE) {
vm_stop(RUN_STATE_SHUTDOWN);
} else {
if (request == SHUTDOWN_CAUSE_GUEST_PANIC &&
panic_action == PANIC_ACTION_EXIT_FAILURE) {
*status = EXIT_FAILURE;
}
return true;
}
}
@ -715,12 +720,14 @@ static bool main_loop_should_exit(void)
return false;
}
void qemu_main_loop(void)
int qemu_main_loop(void)
{
int status = EXIT_SUCCESS;
#ifdef CONFIG_PROFILER
int64_t ti;
#endif
while (!main_loop_should_exit()) {
while (!main_loop_should_exit(&status)) {
#ifdef CONFIG_PROFILER
ti = profile_getclock();
#endif
@ -729,6 +736,8 @@ void qemu_main_loop(void)
dev_time += profile_getclock() - ti;
#endif
}
return status;
}
void qemu_add_exit_notifier(Notifier *notify)