Let the user to choose whether to block other monitor command while dumping.
Signed-off-by: Wen Congyang <we...@cn.fujitsu.com> --- dump.c | 24 +++++++++++++++++++----- hmp-commands.hx | 8 ++++---- qmp-commands.hx | 7 ++++--- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/dump.c b/dump.c index 09ed96a..6acc252 100644 --- a/dump.c +++ b/dump.c @@ -74,6 +74,7 @@ typedef struct DumpState { char *error; Monitor *mon; int fd; + int detach; target_phys_addr_t memory_offset; int64_t bandwidth; RAMBlock *block; @@ -110,6 +111,10 @@ static int dump_cleanup(DumpState *s) qemu_free_timer(s->timer); } + if (!s->detach && s->error) { + monitor_printf(s->mon, "%s", s->error); + } + if (s->mon) { monitor_resume(s->mon); } @@ -405,7 +410,7 @@ static target_phys_addr_t get_offset(target_phys_addr_t phys_addr, return -1; } -static DumpState *dump_init(Monitor *mon, int fd) +static DumpState *dump_init(Monitor *mon, int fd, int detach) { CPUState *env; DumpState *s = dump_get_current(); @@ -419,6 +424,7 @@ static DumpState *dump_init(Monitor *mon, int fd) s->block = QLIST_FIRST(&ram_list.blocks); s->start = 0; s->timer = NULL; + s->detach = detach; /* * get dump info: endian, class and architecture. @@ -461,9 +467,12 @@ static DumpState *dump_init(Monitor *mon, int fd) s->phdr_num += s->list.num; } - if (monitor_suspend(mon) != 0) { - monitor_printf(mon, "terminal does not allow synchronous " - "dump, continuing detached\n"); + if (!detach) { + if (monitor_suspend(mon) != 0) { + monitor_printf(mon, "terminal does not allow synchronous " + "dump, continuing detached\n"); + s->detach = 1; + } } return s; @@ -667,6 +676,7 @@ static int create_vmcore(DumpState *s) int do_dump(Monitor *mon, const QDict *qdict, QObject **ret_data) { const char *file = qdict_get_str(qdict, "file"); + int detach = qdict_get_try_bool(qdict, "detach", 0); const char *p; int fd = -1; DumpState *s; @@ -695,11 +705,15 @@ int do_dump(Monitor *mon, const QDict *qdict, QObject **ret_data) return -1; } - s = dump_init(mon, fd); + s = dump_init(mon, fd, detach); if (!s) { return -1; } + if (s->detach) { + s->mon = NULL; + } + if (create_vmcore(s) < 0) { return -1; } diff --git a/hmp-commands.hx b/hmp-commands.hx index 98c1c35..ef0d53a 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_new = do_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/qmp-commands.hx b/qmp-commands.hx index 023cade..f359dff 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 = do_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