On Mon, Dec 07, 2015 at 03:53:56PM +0800, Qiaowei Ren wrote:
> This patch adds new xml element, and so we can have the option of
> also having perf events enabled immediately at startup.
>
> Signed-off-by: Qiaowei Ren <[email protected]>
> ---
> docs/schemas/domaincommon.rng | 27 +++++++++++++++++++++++++++
> src/conf/domain_conf.c | 37 +++++++++++++++++++++++++++++++++++++
> src/conf/domain_conf.h | 10 ++++++++++
> src/qemu/qemu_driver.c | 26 ++++++++++++++++++++++++++
> src/qemu/qemu_process.c | 6 ++++--
> 5 files changed, 104 insertions(+), 2 deletions(-)
Needs an addition to the tests to exercise the XML round-trip
parse+format
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 4804c69..fb4bf2b 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -393,6 +393,33 @@
> </define>
>
> <!--
> + Enable or disable perf events for the domain. For each
> + of the events the following rules apply:
> + on: the event will be forcefully enabled
> + off: the event will be forcefully disabled
> + not specified: the event will be disabled by default
> + -->
> + <define name="perf">
> + <element name="perf">
> + <interleave>
> + <optional>
> + <element name="cmt">
> + <ref name="enableChoices"/>
> + </element>
> + </optional>
> + </interleave>
> + <empty/>
> + </element>
> + </define>
> + <define name="enableChoices">
> + <optional>
> + <attribute name="enabled">
> + <ref name="virYesNo"/>
> + </attribute>
> + </optional>
> + </define>
> +
You have not used the 'perf' define anywhere, so this is currently
orphaned. Presumably you're adding this at the top level of the
<domain> XML. If you add an example XML file to the test suite then
you'd see a test error about this.
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 2f5c0ed..833e69f 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -12231,6 +12231,29 @@ virDomainPMStateParseXML(xmlXPathContextPtr ctxt,
>
>
> static int
> +virDomainPerfParseXML(xmlXPathContextPtr ctxt,
> + const char *xpath,
> + int *val)
> +{
> + int ret = -1;
> + char *tmp = virXPathString(xpath, ctxt);
> + if (tmp) {
> + *val = virTristateBoolTypeFromString(tmp);
> + if (*val < 0) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("unknown perf event state %s"), tmp);
> + goto cleanup;
> + }
> + }
> +
> + ret = 0;
> + cleanup:
> + VIR_FREE(tmp);
> + return ret;
> +}
> +
> +
> +static int
> virDomainMemorySourceDefParseXML(xmlNodePtr node,
> xmlXPathContextPtr ctxt,
> virDomainMemoryDefPtr def)
> @@ -15388,6 +15411,11 @@ virDomainDefParseXML(xmlDocPtr xml,
> &def->pm.s4) < 0)
> goto error;
>
> + if (virDomainPerfParseXML(ctxt,
> + "string(./perf/cmt/@enabled)",
> + &def->perf.cmt) < 0)
> + goto error;
> +
> if ((tmp = virXPathString("string(./clock/@offset)", ctxt)) &&
> (def->clock.offset = virDomainClockOffsetTypeFromString(tmp)) < 0) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> @@ -22011,6 +22039,15 @@ virDomainDefFormatInternal(virDomainDefPtr def,
> virBufferAddLit(buf, "</pm>\n");
> }
>
> + if (def->perf.cmt) {
> + virBufferAddLit(buf, "<perf>\n");
> + virBufferAdjustIndent(buf, 2);
> + virBufferAsprintf(buf, "<cmt enabled='%s'/>\n",
> + virTristateBoolTypeToString(def->perf.cmt));
It might be slightly nicer to have
<event name="cmt" enabled="%s"/>
Also, we should probably have a VIR_ENUM defined for VIR_PERF_EVENT*
types, so you can just do virPerfEventTypeToString() to get the
value for the 'name' attribute. That would avoid us needing to
extend the parsing code every time we add a new event
> + virBufferAdjustIndent(buf, -2);
> + virBufferAddLit(buf, "</perf>\n");
> + }
> +
> virBufferAddLit(buf, "<devices>\n");
> virBufferAdjustIndent(buf, 2);
>
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 90d8e13..7383faf 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2192,6 +2192,14 @@ struct _virDomainPowerManagement {
> int s4;
> };
>
> +typedef struct _virDomainPerf virDomainPerf;
> +typedef virDomainPerf *virDomainPerfPtr;
> +
> +struct _virDomainPerf {
> + /* These options are of type enum virTristateBool */
> + int cmt;
> +};
This should be an array with size VIR_PERF_EVENT_LAST really,
so we don't hardcode 'cmt' in the parser.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list