[libvirt] [PATCH v2 1/3] Add support for limiting guest coredump

Martin Kletzander mkletzan at redhat.com
Thu Sep 20 14:46:59 UTC 2012


On 09/20/2012 02:54 PM, Michal Privoznik wrote:
> 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
> 

Done and double checked with tests.

>> +            <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'
> 

Fixed.

>> +            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.
> 

I did that except the function fitted on one line.

>> +            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
> 

Thanks for the review. Nits fixed, syntax-check and check ran OK, it's
pushed now.

Martin




More information about the libvir-list mailing list