On 20.09.2012 10:58, Martin Kletzander wrote:
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 | 25 ++++++++++++++++++++++++-
src/conf/domain_conf.h | 10 ++++++++++
src/libvirt_private.syms | 2 ++
5 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index d021837..210ebe0 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. <span class='since'><code>unit</code> since
- 0.9.11</span></dd>
+ minimum, such as 4000KiB.
+
+ In the case of crash, optional attribute <code>dump-core</code>
+ can be used to control whether the guest memory should be
+ included in the generated coredump or not (values "on",
"off").
+
+ <span class='since'><code>unit</code> since
0.9.11</span>,
+ <span class='since'><code>dump-core</code> since
0.10.2
+ (QEMU only)</span></dd>
<dt><code>currentMemory</code></dt>
<dd>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 ed25f58..bf6afbb 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -470,6 +470,14 @@
<interleave>
<element name="memory">
<ref name='scaledInteger'/>
+ <optional>
+ <attribute name="dump-core">
s/-c/C/ as Dan pointed out
+ <choice>
+ <value>on</value>
+ <value>off</value>
+ </choice>
+ </attribute>
+ </optional>
</element>
<optional>
<element name="currentMemory">
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 4714312..c0cff7b 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",
@@ -8525,6 +8530,19 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
&def->mem.cur_balloon, false) < 0)
goto error;
+ /* and info about it */
+ tmp = virXPathString("string(./memory[1]/@dump-core)", ctxt);
+ if (tmp) {
+ def->mem.dump_core = virDomainMemDumpTypeFromString(tmp);
+ VIR_FREE(tmp);
+
+ if (def->mem.dump_core < 0) {
s/</<=/ because we don't want to let users type in 'default'
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("Invalid value for <memory> 'dump-core'
attribute"));
we tend to write the value passed by user:
virReportError(VIR_ERR_XML_ERROR,
_("Bad value '%s'"),
tmp);
but that requires you won't free 'tmp' just a few lines above.
+ goto error;
+ }
+ }
+
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
@@ -13267,8 +13285,13 @@ virDomainDefFormatInternal(virDomainDefPtr def,
xmlIndentTreeOutput = oldIndentTreeOutput;
}
- virBufferAsprintf(buf, " <memory
unit='KiB'>%llu</memory>\n",
+ virBufferAddLit(buf, " <memory");
+ if (def->mem.dump_core)
+ virBufferAsprintf(buf, " dump-core='%s'",
+ virDomainMemDumpTypeToString(def->mem.dump_core));
+ virBufferAsprintf(buf, " unit='KiB'>%llu</memory>\n",
def->mem.max_balloon);
+
virBufferAsprintf(buf, " <currentMemory
unit='KiB'>%llu</currentMemory>\n",
def->mem.cur_balloon);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index d719d57..fae699f 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 0b53895..0b6068d 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -426,6 +426,8 @@ virDomainLiveConfigHelperMethod;
virDomainLoadAllConfigs;
virDomainMemballoonModelTypeFromString;
virDomainMemballoonModelTypeToString;
+virDomainMemDumpTypeFromString;
+virDomainMemDumpTypeToString;
virDomainNetDefFree;
virDomainNetFind;
virDomainNetGetActualBandwidth;
ACK if you fix those nits.
Michal