From 78f3666fe929428016ce55694094f65efb0b9a0f Mon Sep 17 00:00:00 2001 From: Martin Kletzander Date: Wed, 15 Aug 2012 09:51:58 +0200 Subject: [PATCH] Add support for limiting guest coredump Sometimes when guest machine crashes, coredump can get huge due to the guest memory. This can be limited using madvise(2) system call and is being used in QEMU hypervisor. This patch adds an option for configuring that in the domain XML and related documentation. --- docs/formatdomain.html.in | 12 +++++++++--- docs/schemas/domaincommon.rng | 8 ++++++++ src/conf/domain_conf.c | 24 +++++++++++++++++++++++- src/conf/domain_conf.h | 10 ++++++++++ src/libvirt_private.syms | 2 ++ 5 files changed, 52 insertions(+), 4 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index a403ba8c5b..f05350e80f 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -515,9 +515,15 @@ However, the value will be rounded up to the nearest kibibyte by libvirt, and may be further rounded to the granularity supported by the hypervisor. Some hypervisors also enforce a - minimum, such as - 4000KiB. unit since - 0.9.11 + minimum, such as 4000KiB. + + In the case of crash, optional attribute dumpCore + can be used to control whether the guest memory should be + included in the generated coredump or not (values "on", "off"). + + unit since 0.9.11, + dumpCore since 0.10.2 + (QEMU only)
currentMemory
The actual allocation of memory for the guest. This value can be less than the maximum allocation, to allow for ballooning diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index afa6bbd19f..75afac2e15 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -470,6 +470,14 @@ + + + + on + off + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index d6f2ebfe20..4b20b72f3a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -381,6 +381,11 @@ VIR_ENUM_IMPL(virDomainSoundModel, VIR_DOMAIN_SOUND_MODEL_LAST, "ac97", "ich6") +VIR_ENUM_IMPL(virDomainMemDump, VIR_DOMAIN_MEM_DUMP_LAST, + "default", + "on", + "off") + VIR_ENUM_IMPL(virDomainMemballoonModel, VIR_DOMAIN_MEMBALLOON_MODEL_LAST, "virtio", "xen", @@ -8524,6 +8529,18 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, &def->mem.cur_balloon, false) < 0) goto error; + /* and info about it */ + tmp = virXPathString("string(./memory[1]/@dumpCore)", ctxt); + if (tmp) { + def->mem.dump_core = virDomainMemDumpTypeFromString(tmp); + + if (def->mem.dump_core <= 0) { + virReportError(VIR_ERR_XML_ERROR, _("Bad value '%s'"), tmp); + goto error; + } + VIR_FREE(tmp); + } + if (def->mem.cur_balloon > def->mem.max_balloon) { /* Older libvirt could get into this situation due to * rounding; if the discrepancy is less than 1MiB, we silently @@ -13266,8 +13283,13 @@ virDomainDefFormatInternal(virDomainDefPtr def, xmlIndentTreeOutput = oldIndentTreeOutput; } - virBufferAsprintf(buf, " %llu\n", + virBufferAddLit(buf, " mem.dump_core) + virBufferAsprintf(buf, " dumpCore='%s'", + virDomainMemDumpTypeToString(def->mem.dump_core)); + virBufferAsprintf(buf, " unit='KiB'>%llu\n", def->mem.max_balloon); + virBufferAsprintf(buf, " %llu\n", def->mem.cur_balloon); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d719d57dad..fae699f7d9 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1320,6 +1320,14 @@ struct _virDomainRedirFilterDef { virDomainRedirFilterUsbDevDefPtr *usbdevs; }; +enum virDomainMemDump { + VIR_DOMAIN_MEM_DUMP_DEFAULT = 0, + VIR_DOMAIN_MEM_DUMP_ON, + VIR_DOMAIN_MEM_DUMP_OFF, + + VIR_DOMAIN_MEM_DUMP_LAST, +}; + enum { VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO, VIR_DOMAIN_MEMBALLOON_MODEL_XEN, @@ -1641,6 +1649,7 @@ struct _virDomainDef { unsigned long long max_balloon; /* in kibibytes */ unsigned long long cur_balloon; /* in kibibytes */ bool hugepage_backed; + int dump_core; /* enum virDomainMemDump */ unsigned long long hard_limit; /* in kibibytes */ unsigned long long soft_limit; /* in kibibytes */ unsigned long long min_guarantee; /* in kibibytes */ @@ -2177,6 +2186,7 @@ VIR_ENUM_DECL(virDomainChrTcpProtocol) VIR_ENUM_DECL(virDomainChrSpicevmc) VIR_ENUM_DECL(virDomainSoundCodec) VIR_ENUM_DECL(virDomainSoundModel) +VIR_ENUM_DECL(virDomainMemDump) VIR_ENUM_DECL(virDomainMemballoonModel) VIR_ENUM_DECL(virDomainSmbiosMode) VIR_ENUM_DECL(virDomainWatchdogModel) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 0b538950e9..0b6068d441 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -426,6 +426,8 @@ virDomainLiveConfigHelperMethod; virDomainLoadAllConfigs; virDomainMemballoonModelTypeFromString; virDomainMemballoonModelTypeToString; +virDomainMemDumpTypeFromString; +virDomainMemDumpTypeToString; virDomainNetDefFree; virDomainNetFind; virDomainNetGetActualBandwidth;