dumpCore tag in the <memory> is not supported by libvirt-cim and
it will be dropped during updating any element in the xml definition
of a domain. This patch keep the tag all the time.
Signed-off-by: Xu Wang <gesaint(a)linux.vnet.ibm.com>
---
libxkutil/device_parsing.c | 28 +++++++++++++++++++++++++++-
libxkutil/device_parsing.h | 3 +++
libxkutil/xmlgen.c | 9 +++++++++
3 files changed, 39 insertions(+), 1 deletions(-)
diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index 7900e06..96db532 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -605,8 +605,17 @@ static int parse_mem_device(xmlNode *node, struct virt_device
**vdevs)
if (XSTREQ(node->name, "currentMemory"))
sscanf(content, "%" PRIu64, &mdev->size);
- else if (XSTREQ(node->name, "memory"))
+ else if (XSTREQ(node->name, "memory")) {
sscanf(content, "%" PRIu64, &mdev->maxsize);
+ content = get_attr_value(node, "dumpCore");
+ if (XSTREQ(content, "on")) {
+ mdev->dumpCore = MEM_DUMP_CORE_ON;
+ } else if (XSTREQ(content, "off")) {
+ mdev->dumpCore = MEM_DUMP_CORE_OFF;
+ } else {
+ mdev->dumpCore = MEM_DUMP_CORE_NOT_SET;
+ }
+ }
free(content);
@@ -968,6 +977,7 @@ static int _get_mem_device(const char *xml, struct virt_device
**list)
struct virt_device *mdevs = NULL;
struct virt_device *mdev = NULL;
int ret;
+ bool mem_dump_core_set = false;
ret = parse_devices(xml, &mdevs, CIM_RES_TYPE_MEM);
if (ret <= 0)
@@ -987,10 +997,26 @@ static int _get_mem_device(const char *xml, struct virt_device
**list)
mdevs[1].dev.mem.size);
mdev->dev.mem.maxsize = MAX(mdevs[0].dev.mem.maxsize,
mdevs[1].dev.mem.maxsize);
+ /* libvirt dumpCore tag always belong to memory xml node, but
+ * here we may have two mdev for memory node and currentMemory
+ * node. So pick up one value.
+ */
+ if (mdevs[0].dev.mem.dumpCore != MEM_DUMP_CORE_NOT_SET) {
+ mdev->dev.mem.dumpCore = mdevs[0].dev.mem.dumpCore;
+ mem_dump_core_set = true;
+ } else if (mdevs[1].dev.mem.dumpCore !=
+ MEM_DUMP_CORE_NOT_SET) {
+ if (mem_dump_core_set) {
+ CU_DEBUG("WARN: libvirt set memory core dump
in"
+ "two nodes!");
+ }
+ mdev->dev.mem.dumpCore = mdevs[1].dev.mem.dumpCore;
+ }
} else {
mdev->dev.mem.size = MAX(mdevs[0].dev.mem.size,
mdevs[0].dev.mem.maxsize);
mdev->dev.mem.maxsize = mdev->dev.mem.size;
+ mdev->dev.mem.dumpCore = mdevs[0].dev.mem.dumpCore;
}
mdev->type = CIM_RES_TYPE_MEM;
diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
index 2b6d3d1..979b792 100644
--- a/libxkutil/device_parsing.h
+++ b/libxkutil/device_parsing.h
@@ -75,6 +75,9 @@ struct net_device {
struct mem_device {
uint64_t size;
uint64_t maxsize;
+ enum { MEM_DUMP_CORE_NOT_SET,
+ MEM_DUMP_CORE_ON,
+ MEM_DUMP_CORE_OFF } dumpCore;
};
struct vcpu_device {
diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 4287d42..30e9a5e 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -498,6 +498,15 @@ static const char *mem_xml(xmlNodePtr root, struct domain *dominfo)
BAD_CAST string);
free(string);
+
+ if (tmp == NULL)
+ return XML_ERROR;
+ if (mem->dumpCore == MEM_DUMP_CORE_ON) {
+ xmlNewProp(tmp, BAD_CAST "dumpCore", BAD_CAST "on");
+ } else if (mem->dumpCore == MEM_DUMP_CORE_OFF) {
+ xmlNewProp(tmp, BAD_CAST "dumpCore", BAD_CAST
"off");
+ }
+
out:
if (tmp == NULL)
return XML_ERROR;
--
1.7.1