From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:33445) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qm4QA-0007Hs-GP for qemu-devel@nongnu.org; Wed, 27 Jul 2011 09:45:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qm4Q9-0004ZT-0d for qemu-devel@nongnu.org; Wed, 27 Jul 2011 09:45:10 -0400 Received: from mtagate2.uk.ibm.com ([194.196.100.162]:34783) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qm4Q8-0004Yc-JA for qemu-devel@nongnu.org; Wed, 27 Jul 2011 09:45:08 -0400 Received: from d06nrmr1707.portsmouth.uk.ibm.com (d06nrmr1707.portsmouth.uk.ibm.com [9.149.39.225]) by mtagate2.uk.ibm.com (8.13.1/8.13.1) with ESMTP id p6RDj7kc015799 for ; Wed, 27 Jul 2011 13:45:07 GMT Received: from d06av09.portsmouth.uk.ibm.com (d06av09.portsmouth.uk.ibm.com [9.149.37.250]) by d06nrmr1707.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p6RDj78s1900702 for ; Wed, 27 Jul 2011 14:45:07 +0100 Received: from d06av09.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av09.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p6RDj7Go016296 for ; Wed, 27 Jul 2011 07:45:07 -0600 From: Stefan Hajnoczi Date: Wed, 27 Jul 2011 14:44:50 +0100 Message-Id: <1311774295-8696-11-git-send-email-stefanha@linux.vnet.ibm.com> In-Reply-To: <1311774295-8696-1-git-send-email-stefanha@linux.vnet.ibm.com> References: <1311774295-8696-1-git-send-email-stefanha@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 10/15] qmp: add query-block-jobs command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Anthony Liguori , Stefan Hajnoczi , Adam Litke Active image streaming operations can be enumerated with the query-block-jobs command. Each operation is listed along with its total progress. The command synopsis is: query-block-jobs ---------------- Show progress of ongoing block device operations. Return a json-array of all block device operations. If no operation is active then return an empty array. Each operation is a json-object with the following data: - type: job type ("stream" for image streaming, json-string) - device: device name (json-string) - end: maximum progress value (json-int) - position: current progress value (json-int) - speed: rate limit, bytes per second (json-int) Progress can be observed as position increases and it reaches end when the operation completes. Position and end have undefined units but can be used to calculate a percentage indicating the progress that has been made. Example: -> { "execute": "query-block-jobs" } <- { "return":[ { "type": "stream", "device": "virtio0", "end": 10737418240, "position": 709632, "speed": 0 } ] } Signed-off-by: Stefan Hajnoczi --- blockdev.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ blockdev.h | 2 ++ hmp-commands.hx | 2 ++ monitor.c | 16 ++++++++++++++++ qmp-commands.hx | 31 +++++++++++++++++++++++++++++++ 5 files changed, 97 insertions(+), 0 deletions(-) diff --git a/blockdev.c b/blockdev.c index e9bc577..422b43b 100644 --- a/blockdev.c +++ b/blockdev.c @@ -802,6 +802,52 @@ out: return ret; } +static void monitor_print_block_stream(Monitor *mon, const QObject *data) +{ + QDict *stream; + + assert(data); + stream = qobject_to_qdict(data); + + monitor_printf(mon, "Streaming device %s: Completed %" PRId64 " of %" + PRId64 " bytes, speed limit %" PRId64 " bytes/s\n", + qdict_get_str(stream, "device"), + qdict_get_int(stream, "offset"), + qdict_get_int(stream, "len"), + (int64_t)0); +} + +void monitor_print_block_jobs(Monitor *mon, const QObject *data) +{ + QList *streams; + QListEntry *entry; + + assert(data); + streams = qobject_to_qlist(data); + assert(streams); /* we pass a list of stream objects to ourselves */ + + if (qlist_empty(streams)) { + monitor_printf(mon, "No active jobs\n"); + return; + } + + QLIST_FOREACH_ENTRY(streams, entry) { + monitor_print_block_stream(mon, entry->value); + } +} + +void do_info_block_jobs(Monitor *mon, QObject **ret_data) +{ + QList *streams; + StreamState *s; + + streams = qlist_new(); + QLIST_FOREACH(s, &block_streams, list) { + qlist_append_obj(streams, stream_get_qobject(s)); + } + *ret_data = QOBJECT(streams); +} + int do_block_stream(Monitor *mon, const QDict *params, QObject **ret_data) { const char *device = qdict_get_str(params, "device"); diff --git a/blockdev.h b/blockdev.h index a3cde69..0a32793 100644 --- a/blockdev.h +++ b/blockdev.h @@ -66,6 +66,8 @@ int do_change_block(Monitor *mon, const char *device, int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_snapshot_blkdev(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_block_resize(Monitor *mon, const QDict *qdict, QObject **ret_data); +void monitor_print_block_jobs(Monitor *mon, const QObject *data); +void do_info_block_jobs(Monitor *mon, QObject **ret_data); int do_block_stream(Monitor *mon, const QDict *params, QObject **ret_data); int do_block_job_cancel(Monitor *mon, const QDict *params, MonitorCompletion cb, void *opaque); diff --git a/hmp-commands.hx b/hmp-commands.hx index 613eb76..74a74d8 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1383,6 +1383,8 @@ show device tree show qdev device model list @item info roms show roms +@item info block-jobs +show progress of background block device operations @end table ETEXI diff --git a/monitor.c b/monitor.c index 700b534..bc2f630 100644 --- a/monitor.c +++ b/monitor.c @@ -3141,6 +3141,14 @@ static const mon_cmd_t info_cmds[] = { }, #endif { + .name = "block-jobs", + .args_type = "", + .params = "", + .help = "show block job status", + .user_print = monitor_print_block_jobs, + .mhandler.info_new = do_info_block_jobs, + }, + { .name = NULL, }, }; @@ -3282,6 +3290,14 @@ static const mon_cmd_t qmp_query_cmds[] = { .mhandler.info_async = do_info_balloon, .flags = MONITOR_CMD_ASYNC, }, + { + .name = "block-jobs", + .args_type = "", + .params = "", + .help = "show block job status", + .user_print = monitor_print_block_jobs, + .mhandler.info_new = do_info_block_jobs, + }, { /* NULL */ }, }; diff --git a/qmp-commands.hx b/qmp-commands.hx index 5ab15a4..c3a72ad 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -1971,3 +1971,34 @@ Example: EQMP +SQMP +query-block-jobs +---------------- + +Show progress of ongoing block device operations. + +Return a json-array of all block device operations. If no operation is +active then return an empty array. Each operation is a json-object with the +following data: + +- type: job type ("stream" for image streaming, json-string) +- device: device name (json-string) +- end: maximum progress value (json-int) +- position: current progress value (json-int) +- speed: rate limit, bytes per second (json-int) + +Progress can be observed as position increases and it reaches end when +the operation completes. Position and end have undefined units but can be +used to calculate a percentage indicating the progress that has been made. + +Example: + +-> { "execute": "query-block-jobs" } +<- { "return":[ + { "type": "stream", "device": "virtio0", + "end": 10737418240, "position": 709632, + "speed": 0 } + ] + } + +EQMP -- 1.7.5.4