From patchwork Fri Mar 2 10:45:34 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wen Congyang X-Patchwork-Id: 144213 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id BC37C1007D3 for ; Fri, 2 Mar 2012 21:44:55 +1100 (EST) Received: from localhost ([::1]:55620 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S3Pyn-0008AF-MY for incoming@patchwork.ozlabs.org; Fri, 02 Mar 2012 05:44:53 -0500 Received: from eggs.gnu.org ([208.118.235.92]:40594) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S3Pyb-00089s-GE for qemu-devel@nongnu.org; Fri, 02 Mar 2012 05:44:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S3PyB-0003gy-2Z for qemu-devel@nongnu.org; Fri, 02 Mar 2012 05:44:40 -0500 Received: from [222.73.24.84] (port=26274 helo=song.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S3PyA-0003fR-F7 for qemu-devel@nongnu.org; Fri, 02 Mar 2012 05:44:14 -0500 X-IronPort-AV: E=Sophos;i="4.73,517,1325433600"; d="scan'208";a="4434316" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 02 Mar 2012 18:44:09 +0800 Received: from mailserver.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id q22AiA5N028588; Fri, 2 Mar 2012 18:44:11 +0800 Received: from [10.167.225.226] ([10.167.225.226]) by mailserver.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.1FP4) with ESMTP id 2012030218422103-855049 ; Fri, 2 Mar 2012 18:42:21 +0800 Message-ID: <4F50A4CE.60403@cn.fujitsu.com> Date: Fri, 02 Mar 2012 18:45:34 +0800 From: Wen Congyang User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100413 Fedora/3.0.4-2.fc13 Thunderbird/3.0.4 MIME-Version: 1.0 To: qemu-devel , Jan Kiszka , Dave Anderson , HATAYAMA Daisuke , Luiz Capitulino , Eric Blake References: <4F509A00.80207@cn.fujitsu.com> In-Reply-To: <4F509A00.80207@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.1FP4|July 25, 2010) at 2012-03-02 18:42:21, Serialize by Router on mailserver/fnst(Release 8.5.1FP4|July 25, 2010) at 2012-03-02 18:42:22, Serialize complete at 2012-03-02 18:42:22 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 222.73.24.84 Subject: [Qemu-devel] [RFC][PATCH 15/16 v8] support detached dump X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Let the user to choose whether to block other monitor command while dumping. Signed-off-by: Wen Congyang --- dump.c | 2 +- hmp-commands.hx | 9 +++++---- hmp.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- qapi-schema.json | 4 +++- qmp-commands.hx | 6 ++++-- 5 files changed, 60 insertions(+), 10 deletions(-) diff --git a/dump.c b/dump.c index 4c8038d..40eefb9 100644 --- a/dump.c +++ b/dump.c @@ -800,7 +800,7 @@ static DumpState *dump_init_fd(int fd, bool paging, Error **errp) return s; } -void qmp_dump(bool paging, const char *file, Error **errp) +void qmp_dump(bool detach, bool paging, const char *file, Error **errp) { const char *p; int fd = -1; diff --git a/hmp-commands.hx b/hmp-commands.hx index b936bb7..fd6f9f1 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -883,21 +883,22 @@ ETEXI #if defined(CONFIG_HAVE_CORE_DUMP) { .name = "dump", - .args_type = "paging:-p,file:s", - .params = "[-p] file", - .help = "dump to file", + .args_type = "detach:-d,paging:-p,file:s", + .params = "[-d] [-p] file", + .help = "dump to file (using -d to not wait for completion)", .user_print = monitor_user_noop, .mhandler.cmd = hmp_dump, }, STEXI -@item dump [-p] @var{file} +@item dump [-d] [-p] @var{file} @findex dump Dump to @var{file}. The file can be processed with crash or gdb. file: destination file(started with "file:") or destination file descriptor (started with "fd:") paging: do paging to get guest's memory mapping + -d: donot wait for completion. ETEXI #endif diff --git a/hmp.c b/hmp.c index 81dd23d..8652b20 100644 --- a/hmp.c +++ b/hmp.c @@ -857,14 +857,59 @@ void hmp_block_job_cancel(Monitor *mon, const QDict *qdict) hmp_handle_error(mon, &error); } +typedef struct DumpingStatus +{ + QEMUTimer *timer; + Monitor *mon; +} DumpingStatus; + +static void hmp_dumping_status_cb(void *opaque) +{ + DumpingStatus *status = opaque; + DumpInfo *info; + + info = qmp_query_dump(NULL); + if (!info->has_status || strcmp(info->status, "active") == 0) { + qemu_mod_timer(status->timer, qemu_get_clock_ms(rt_clock) + 1000); + } else { + monitor_resume(status->mon); + qemu_del_timer(status->timer); + g_free(status); + } + + qapi_free_DumpInfo(info); +} + void hmp_dump(Monitor *mon, const QDict *qdict) { Error *errp = NULL; int paging = qdict_get_try_bool(qdict, "paging", 0); + int detach = qdict_get_try_bool(qdict, "detach", 0); const char *file = qdict_get_str(qdict, "file"); - qmp_dump(!!paging, file, &errp); - hmp_handle_error(mon, &errp); + qmp_dump(!!detach, !!paging, file, &errp); + if (errp) { + hmp_handle_error(mon, &errp); + return; + } + + if (!detach) { + DumpingStatus *status; + int ret; + + ret = monitor_suspend(mon); + if (ret < 0) { + monitor_printf(mon, "terminal does not allow synchronous " + "migration, continuing detached\n"); + return; + } + + status = g_malloc0(sizeof(*status)); + status->mon = mon; + status->timer = qemu_new_timer_ms(rt_clock, hmp_dumping_status_cb, + status); + qemu_mod_timer(status->timer, qemu_get_clock_ms(rt_clock)); + } } void hmp_dump_cancel(Monitor *mon, const QDict *qdict) diff --git a/qapi-schema.json b/qapi-schema.json index 41428ed..bd258cb 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -1637,6 +1637,7 @@ # # Dump guest's memory to vmcore. # +# @detach: detached dumping. # @paging: if true, do paging to get guest's memory mapping # @file: the filename or file descriptor of the vmcore. # @@ -1644,7 +1645,8 @@ # # Since: 1.1 ## -{ 'command': 'dump', 'data': { 'paging': 'bool', 'file': 'str' } } +{ 'command': 'dump', + 'data': { 'detach': 'bool', 'paging': 'bool', 'file': 'str' } } ## # @dump_cancel diff --git a/qmp-commands.hx b/qmp-commands.hx index c532561..e2accb2 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -589,8 +589,8 @@ EQMP #if defined(CONFIG_HAVE_CORE_DUMP) { .name = "dump", - .args_type = "paging:-p,file:s", - .params = "[-p] file", + .args_type = "detach:-d,paging:-p,file:s", + .params = "[-d] [-p] file", .help = "dump to file", .user_print = monitor_user_noop, .mhandler.cmd_new = qmp_marshal_input_dump, @@ -618,6 +618,8 @@ Notes: (1) All boolean arguments default to false (2) The 'info dump' command should be used to check dumping's progress and final result (this information is provided by the 'status' member) +(3) The user Monitor's "detach" argument is invalid in QMP and should not + be used EQMP #endif