qemu: implement qemu's dump-guest-memory

dump-guest-memory is a new dump mechanism, and it can work when the
guest uses host devices. This patch adds a API to use this new
monitor command.
We will always use json mode if qemu's version is >= 0.15, so I
don't implement the API for text mode.
This commit is contained in:
Wen Congyang 2012-06-12 11:04:51 +08:00
parent 5136c5799f
commit 6fe26d89cc
4 changed files with 89 additions and 0 deletions

View File

@ -2017,6 +2017,43 @@ int qemuMonitorMigrateCancel(qemuMonitorPtr mon)
return ret;
}
int qemuMonitorDumpToFd(qemuMonitorPtr mon,
unsigned int flags,
int fd,
unsigned long long begin,
unsigned long long length)
{
int ret;
VIR_DEBUG("mon=%p fd=%d flags=%x begin=%llx length=%llx",
mon, fd, flags, begin, length);
if (!mon) {
qemuReportError(VIR_ERR_INVALID_ARG, "%s",
_("monitor must not be NULL"));
return -1;
}
if (!mon->json) {
/* We don't have qemuMonitorTextDump(), so we should check mon->json
* here.
*/
qemuReportError(VIR_ERR_NO_SUPPORT, "%s",
_("dump-guest-memory is not supported in text mode"));
return -1;
}
if (qemuMonitorSendFileHandle(mon, "dump", fd) < 0)
return -1;
ret = qemuMonitorJSONDump(mon, flags, "fd:dump", begin, length);
if (ret < 0) {
if (qemuMonitorCloseFileHandle(mon, "dump") < 0)
VIR_WARN("failed to close dumping handle");
}
return ret;
}
int qemuMonitorGraphicsRelocate(qemuMonitorPtr mon,
int type,

View File

@ -379,6 +379,18 @@ int qemuMonitorMigrateToUnix(qemuMonitorPtr mon,
int qemuMonitorMigrateCancel(qemuMonitorPtr mon);
typedef enum {
QEMU_MONITOR_DUMP_HAVE_FILTER = 1 << 0,
QEMU_MONITOR_DUMP_PAGING = 1 << 1,
QEMU_MONITOR_DUMP_FLAGS_LAST
} QEMU_MONITOR_DUMP;
int qemuMonitorDumpToFd(qemuMonitorPtr mon,
unsigned int flags,
int fd,
unsigned long long begin,
unsigned long long length);
int qemuMonitorGraphicsRelocate(qemuMonitorPtr mon,
int type,
const char *hostname,

View File

@ -2465,6 +2465,40 @@ int qemuMonitorJSONMigrateCancel(qemuMonitorPtr mon)
return ret;
}
int qemuMonitorJSONDump(qemuMonitorPtr mon,
unsigned int flags,
const char *protocol,
unsigned long long begin,
unsigned long long length)
{
int ret;
virJSONValuePtr cmd = NULL;
virJSONValuePtr reply = NULL;
if (flags & QEMU_MONITOR_DUMP_HAVE_FILTER)
cmd = qemuMonitorJSONMakeCommand("dump-guest-memory",
"b:paging", flags & QEMU_MONITOR_DUMP_PAGING ? 1 : 0,
"s:protocol", protocol,
"U:begin", begin,
"U:length", length,
NULL);
else
cmd = qemuMonitorJSONMakeCommand("dump-guest-memory",
"b:paging", flags & QEMU_MONITOR_DUMP_PAGING ? 1 : 0,
"s:protocol", protocol,
NULL);
if (!cmd)
return -1;
ret = qemuMonitorJSONCommand(mon, cmd, &reply);
if (ret == 0)
ret = qemuMonitorJSONCheckError(cmd, reply);
virJSONValueFree(cmd);
virJSONValueFree(reply);
return ret;
}
int qemuMonitorJSONGraphicsRelocate(qemuMonitorPtr mon,
int type,

View File

@ -136,6 +136,12 @@ int qemuMonitorJSONMigrate(qemuMonitorPtr mon,
int qemuMonitorJSONMigrateCancel(qemuMonitorPtr mon);
int qemuMonitorJSONDump(qemuMonitorPtr mon,
unsigned int flags,
const char *protocol,
unsigned long long begin,
unsigned long long length);
int qemuMonitorJSONGraphicsRelocate(qemuMonitorPtr mon,
int type,
const char *hostname,