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 <qiaowei.ren(a)intel.com>
---
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 :|