Let the user to choose whether to block other monitor command while dumping.
Signed-off-by: Wen Congyang <we...@cn.fujitsu.com> --- dump.c | 12 ++++++++---- hmp-commands.hx | 8 ++++---- hmp.c | 3 ++- qapi-schema.json | 3 ++- qmp-commands.hx | 7 ++++--- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/dump.c b/dump.c index cb33495..0f5fcb6 100644 --- a/dump.c +++ b/dump.c @@ -76,6 +76,7 @@ typedef struct DumpState { int state; char *error; int fd; + bool detach; target_phys_addr_t memory_offset; int64_t bandwidth; RAMBlock *block; @@ -405,7 +406,7 @@ static target_phys_addr_t get_offset(target_phys_addr_t phys_addr, return -1; } -static DumpState *dump_init(int fd, Error **errp) +static DumpState *dump_init(int fd, bool detach, Error **errp) { CPUState *env; DumpState *s = dump_get_current(); @@ -422,6 +423,7 @@ static DumpState *dump_init(int fd, Error **errp) s->block = QLIST_FIRST(&ram_list.blocks); s->start = 0; s->timer = NULL; + s->detach = detach; /* * get dump info: endian, class and architecture. @@ -465,7 +467,9 @@ static DumpState *dump_init(int fd, Error **errp) } msg = "terminal does not allow synchronous dumping, continuing detached\n"; - qemu_suspend_monitor("%s", msg); + if (!detach && qemu_suspend_monitor("%s", msg) != 0) { + s->detach = true; + } return s; } @@ -665,7 +669,7 @@ static int create_vmcore(DumpState *s) return 0; } -void qmp_dump(const char *file, Error **errp) +void qmp_dump(bool detach, const char *file, Error **errp) { const char *p; int fd = -1; @@ -694,7 +698,7 @@ void qmp_dump(const char *file, Error **errp) return; } - s = dump_init(fd, errp); + s = dump_init(fd, detach, errp); if (!s) { return; } diff --git a/hmp-commands.hx b/hmp-commands.hx index 6cfb678..ed3544c 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -868,18 +868,18 @@ ETEXI { .name = "dump", - .args_type = "file:s", + .args_type = "detach:-d,file:s", .params = "file", - .help = "dump to file", + .help = "dump to file (using -d to not wait for completion)", .user_print = monitor_user_noop, .mhandler.cmd = hmp_dump, }, STEXI -@item dump @var{file} +@item dump [-d] @var{file} @findex dump -Dump to @var{file}. +Dump to @var{file} (using -d to not wait for completion). ETEXI { diff --git a/hmp.c b/hmp.c index 1a69857..7e08332 100644 --- a/hmp.c +++ b/hmp.c @@ -855,8 +855,9 @@ void hmp_block_job_cancel(Monitor *mon, const QDict *qdict) void hmp_dump(Monitor *mon, const QDict *qdict) { Error *errp = NULL; + bool detach = qdict_get_try_bool(qdict, "detach", 0); const char *file = qdict_get_str(qdict, "file"); - qmp_dump(file, &errp); + qmp_dump(detach, file, &errp); hmp_handle_error(mon, &errp); } diff --git a/qapi-schema.json b/qapi-schema.json index 1013ae6..d39cb41 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -1588,10 +1588,11 @@ # # Dump guest's memory to vmcore. # +# @detach: detached dumping. # @file: the filename or file descriptor of the vmcore. # # Returns: nothing on success # # Since: 1.1 ## -{ 'command': 'dump', 'data': { 'file': 'str' } } +{ 'command': 'dump', 'data': { 'detach': 'bool', 'file': 'str' } } diff --git a/qmp-commands.hx b/qmp-commands.hx index 52d3d3b..b0aa22e 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -567,9 +567,9 @@ EQMP { .name = "dump", - .args_type = "file:s", + .args_type = "detach:-d,file:s", .params = "file", - .help = "dump to file", + .help = "dump to file (using -d to not wait for completion)", .user_print = monitor_user_noop, .mhandler.cmd_new = qmp_marshal_input_dump, }, @@ -582,7 +582,8 @@ Dump to file. Arguments: -- "file": Destination file (json-string) +- "detach": detached dumping (json-bool, optional) +- "file": Destination file (json-string) Example: -- 1.7.1