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 | 2 +- qmp-commands.hx | 7 ++++--- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/dump.c b/dump.c index b2cccd8..14c2642 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 c3615e3..4582875 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -829,18 +829,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 11b4ce6..1ae8926 100644 --- a/hmp.c +++ b/hmp.c @@ -685,8 +685,9 @@ void hmp_migrate_set_speed(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 84c2c9a..f96268a 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -1287,4 +1287,4 @@ # # 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 fefdae2..59ddd98 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -573,9 +573,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, }, @@ -588,7 +588,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