]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add support for limiting guest coredump
authorMartin Kletzander <mkletzan@redhat.com>
Wed, 15 Aug 2012 07:51:58 +0000 (09:51 +0200)
committerMartin Kletzander <mkletzan@redhat.com>
Thu, 20 Sep 2012 14:41:07 +0000 (16:41 +0200)
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
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms

index a403ba8c5bb2621e115db8d318f00449af4aa999..f05350e80fef414f659036f0a77b4a1821508e1e 100644 (file)
         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>dumpCore</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>dumpCore</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
index afa6bbd19f6265ff44ecb96aa51cf1ae4fddc9c4..75afac2e151f0c197ab23ed71991f0f80f098c98 100644 (file)
     <interleave>
       <element name="memory">
         <ref name='scaledInteger'/>
+        <optional>
+          <attribute name="dumpCore">
+            <choice>
+              <value>on</value>
+              <value>off</value>
+            </choice>
+          </attribute>
+        </optional>
       </element>
       <optional>
         <element name="currentMemory">
index d6f2ebfe20a3e188834fe52cb13fb85f18dc5391..4b20b72f3a5798791a1f3e91ed17622edc62afa3 100644 (file)
@@ -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, "  <memory unit='KiB'>%llu</memory>\n",
+    virBufferAddLit(buf, "  <memory");
+    if (def->mem.dump_core)
+        virBufferAsprintf(buf, " dumpCore='%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);
 
index d719d57dad7b2d6f6c47871c6a899fb033815bf3..fae699f7d91a6884ca4346d167aaf5a5e9a01266 100644 (file)
@@ -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)
index 0b538950e94abb8949251be21826932b6f94ff7d..0b6068d4415bc22fccf66ff2b3ddb642cfefcee3 100644 (file)
@@ -426,6 +426,8 @@ virDomainLiveConfigHelperMethod;
 virDomainLoadAllConfigs;
 virDomainMemballoonModelTypeFromString;
 virDomainMemballoonModelTypeToString;
+virDomainMemDumpTypeFromString;
+virDomainMemDumpTypeToString;
 virDomainNetDefFree;
 virDomainNetFind;
 virDomainNetGetActualBandwidth;