Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
util/async-teardown: wire up query-command-line-options
Add new -run-with option with an async-teardown=on|off parameter. It is
visible in the output of query-command-line-options QMP command, so it
can be discovered and used by libvirt.

The option -async-teardown is now redundant, deprecate it.

Reported-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Fixes: c891c24 ("os-posix: asynchronous teardown for shutdown on Linux")
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Message-Id: <20230505120051.36605-2-imbrenda@linux.ibm.com>
[thuth: Add curly braces to fix error with GCC 8.5, fix bug in deprecated.rst]
Signed-off-by: Thomas Huth <thuth@redhat.com>
(cherry picked from commit 80bd81c)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
(Mjt: context tweak in docs/about/deprecated.rst)
  • Loading branch information
Claudio Imbrenda authored and Michael Tokarev committed May 30, 2023
1 parent 0d9a5fc commit e656bdd
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 11 deletions.
4 changes: 4 additions & 0 deletions docs/about/deprecated.rst
Expand Up @@ -111,6 +111,10 @@ Use ``-machine acpi=off`` instead.
The HAXM project has been retired (see https://github.com/intel/haxm#status).
Use "whpx" (on Windows) or "hvf" (on macOS) instead.

``-async-teardown`` (since 8.1)
'''''''''''''''''''''''''''''''

Use ``-run-with async-teardown=on`` instead.

QEMU Machine Protocol (QMP) commands
------------------------------------
Expand Down
14 changes: 14 additions & 0 deletions os-posix.c
Expand Up @@ -36,6 +36,8 @@
#include "qemu/log.h"
#include "sysemu/runstate.h"
#include "qemu/cutils.h"
#include "qemu/config-file.h"
#include "qemu/option.h"

#ifdef CONFIG_LINUX
#include <sys/prctl.h>
Expand Down Expand Up @@ -152,9 +154,21 @@ int os_parse_cmd_args(int index, const char *optarg)
daemonize = 1;
break;
#if defined(CONFIG_LINUX)
/* deprecated */
case QEMU_OPTION_asyncteardown:
init_async_teardown();
break;
case QEMU_OPTION_run_with: {
QemuOpts *opts = qemu_opts_parse_noisily(qemu_find_opts("run-with"),
optarg, false);
if (!opts) {
exit(1);
}
if (qemu_opt_get_bool(opts, "async-teardown", false)) {
init_async_teardown();
}
break;
}
#endif
default:
return -1;
Expand Down
34 changes: 23 additions & 11 deletions qemu-options.hx
Expand Up @@ -4786,20 +4786,32 @@ DEF("qtest-log", HAS_ARG, QEMU_OPTION_qtest_log, "", QEMU_ARCH_ALL)
DEF("async-teardown", 0, QEMU_OPTION_asyncteardown,
"-async-teardown enable asynchronous teardown\n",
QEMU_ARCH_ALL)
#endif
SRST
``-async-teardown``
Enable asynchronous teardown. A new process called "cleanup/<QEMU_PID>"
will be created at startup sharing the address space with the main qemu
process, using clone. It will wait for the main qemu process to
terminate completely, and then exit.
This allows qemu to terminate very quickly even if the guest was
huge, leaving the teardown of the address space to the cleanup
process. Since the cleanup process shares the same cgroups as the
main qemu process, accounting is performed correctly. This only
works if the cleanup process is not forcefully killed with SIGKILL
before the main qemu process has terminated completely.
This option is deprecated and should no longer be used. The new option
``-run-with async-teardown=on`` is a replacement.
ERST
DEF("run-with", HAS_ARG, QEMU_OPTION_run_with,
"-run-with async-teardown[=on|off]\n"
" misc QEMU process lifecycle options\n"
" async-teardown=on enables asynchronous teardown\n",
QEMU_ARCH_ALL)
SRST
``-run-with``
Set QEMU process lifecycle options.

``async-teardown=on`` enables asynchronous teardown. A new process called
"cleanup/<QEMU_PID>" will be created at startup sharing the address
space with the main QEMU process, using clone. It will wait for the
main QEMU process to terminate completely, and then exit. This allows
QEMU to terminate very quickly even if the guest was huge, leaving the
teardown of the address space to the cleanup process. Since the cleanup
process shares the same cgroups as the main QEMU process, accounting is
performed correctly. This only works if the cleanup process is not
forcefully killed with SIGKILL before the main QEMU process has
terminated completely.
ERST
#endif

DEF("msg", HAS_ARG, QEMU_OPTION_msg,
"-msg [timestamp[=on|off]][,guest-name=[on|off]]\n"
Expand Down
21 changes: 21 additions & 0 deletions util/async-teardown.c
Expand Up @@ -12,6 +12,9 @@
*/

#include "qemu/osdep.h"
#include "qemu/config-file.h"
#include "qemu/option.h"
#include "qemu/module.h"
#include <dirent.h>
#include <sys/prctl.h>
#include <sched.h>
Expand Down Expand Up @@ -144,3 +147,21 @@ void init_async_teardown(void)
clone(async_teardown_fn, new_stack_for_clone(), CLONE_VM, NULL);
sigprocmask(SIG_SETMASK, &old_signals, NULL);
}

static QemuOptsList qemu_run_with_opts = {
.name = "run-with",
.head = QTAILQ_HEAD_INITIALIZER(qemu_run_with_opts.head),
.desc = {
{
.name = "async-teardown",
.type = QEMU_OPT_BOOL,
},
{ /* end of list */ }
},
};

static void register_teardown(void)
{
qemu_add_opts(&qemu_run_with_opts);
}
opts_init(register_teardown);

0 comments on commit e656bdd

Please sign in to comment.