dump-guest-memory: add qmp event DUMP_COMPLETED

One new QMP event DUMP_COMPLETED is added. When a dump finishes, one
DUMP_COMPLETED event will occur to notify the user.

Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by:   Fam Zheng <famz@redhat.com>
Message-Id: <1455772616-8668-12-git-send-email-peterx@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Peter Xu 2016-02-18 13:16:56 +08:00 committed by Paolo Bonzini
parent 4a6b52d67e
commit d42a0d1484
3 changed files with 46 additions and 6 deletions

View File

@ -220,6 +220,24 @@ Data:
}, },
"timestamp": { "seconds": 1265044230, "microseconds": 450486 } } "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
DUMP_COMPLETED
--------------
Emitted when the guest has finished one memory dump.
Data:
- "result": DumpQueryResult type described in qapi-schema.json
- "error": Error message when dump failed. This is only a
human-readable string provided when dump failed. It should not be
parsed in any way (json-string, optional)
Example:
{ "event": "DUMP_COMPLETED",
"data": {"result": {"total": 1090650112, "status": "completed",
"completed": 1090650112} } }
GUEST_PANICKED GUEST_PANICKED
-------------- --------------

18
dump.c
View File

@ -25,6 +25,7 @@
#include "sysemu/cpus.h" #include "sysemu/cpus.h"
#include "qapi/qmp/qerror.h" #include "qapi/qmp/qerror.h"
#include "qmp-commands.h" #include "qmp-commands.h"
#include "qapi-event.h"
#include <zlib.h> #include <zlib.h>
#ifdef CONFIG_LZO #ifdef CONFIG_LZO
@ -1662,6 +1663,7 @@ cleanup:
static void dump_process(DumpState *s, Error **errp) static void dump_process(DumpState *s, Error **errp)
{ {
Error *local_err = NULL; Error *local_err = NULL;
DumpQueryResult *result = NULL;
if (s->has_format && s->format != DUMP_GUEST_MEMORY_FORMAT_ELF) { if (s->has_format && s->format != DUMP_GUEST_MEMORY_FORMAT_ELF) {
create_kdump_vmcore(s, &local_err); create_kdump_vmcore(s, &local_err);
@ -1674,6 +1676,15 @@ static void dump_process(DumpState *s, Error **errp)
atomic_set(&s->status, atomic_set(&s->status,
(local_err ? DUMP_STATUS_FAILED : DUMP_STATUS_COMPLETED)); (local_err ? DUMP_STATUS_FAILED : DUMP_STATUS_COMPLETED));
/* send DUMP_COMPLETED message (unconditionally) */
result = qmp_query_dump(NULL);
/* should never fail */
assert(result);
qapi_event_send_dump_completed(result, !!local_err, (local_err ? \
error_get_pretty(local_err) : NULL),
&error_abort);
qapi_free_DumpQueryResult(result);
error_propagate(errp, local_err); error_propagate(errp, local_err);
dump_cleanup(s); dump_cleanup(s);
} }
@ -1682,13 +1693,8 @@ static void *dump_thread(void *data)
{ {
Error *err = NULL; Error *err = NULL;
DumpState *s = (DumpState *)data; DumpState *s = (DumpState *)data;
dump_process(s, &err); dump_process(s, &err);
error_free(err);
if (err) {
/* TODO: notify user the error */
error_free(err);
}
return NULL; return NULL;
} }

View File

@ -369,3 +369,19 @@
## ##
{ 'event': 'MEM_UNPLUG_ERROR', { 'event': 'MEM_UNPLUG_ERROR',
'data': { 'device': 'str', 'msg': 'str' } } 'data': { 'device': 'str', 'msg': 'str' } }
##
# @DUMP_COMPLETED
#
# Emitted when background dump has completed
#
# @result: DumpQueryResult type described in qapi-schema.json.
#
# @error: #optional human-readable error string that provides
# hint on why dump failed. Only presents on failure. The
# user should not try to interpret the error string.
#
# Since: 2.6
##
{ 'event': 'DUMP_COMPLETED' ,
'data': { 'result': 'DumpQueryResult', '*error': 'str' } }