]> xenbits.xensource.com Git - libvirt.git/commitdiff
perf: add new public APIs for perf event
authorQiaowei Ren <qiaowei.ren@intel.com>
Mon, 28 Mar 2016 13:30:26 +0000 (21:30 +0800)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 29 Mar 2016 12:13:05 +0000 (13:13 +0100)
API agreed on in
https://www.redhat.com/archives/libvir-list/2015-October/msg00872.html

* include/libvirt/libvirt-domain.h (virDomainGetPerfEvents,
virDomainSetPerfEvents): New declarations.
* src/libvirt_public.syms: Export new symbols.
* src/driver-hypervisor.h (virDrvDomainGetPerfEvents,
virDrvDomainSetPerfEvents): New typedefs.
* src/libvirt-domain.c: Implement virDomainGetPerfEvents and
virDomainSetPerfEvents.

Signed-off-by: Qiaowei Ren <qiaowei.ren@intel.com>
Message-id: 1459171833-26416-2-git-send-email-qiaowei.ren@intel.com

include/libvirt/libvirt-domain.h
src/driver-hypervisor.h
src/libvirt-domain.c
src/libvirt_public.syms

index 7e06796c3c7357b14d3aeedbd3211e5800bbccb0..b171cdfa991c65103f1bca9a3766105bf169e325 100644 (file)
@@ -1834,6 +1834,24 @@ int virDomainListGetStats(virDomainPtr *doms,
 
 void virDomainStatsRecordListFree(virDomainStatsRecordPtr *stats);
 
+/*
+ * Perf Event API
+ */
+
+/**
+ * VIR_PERF_PARAM_CMT:
+ *
+ * Macro for typed parameter name that represents CMT perf event.
+ */
+# define VIR_PERF_PARAM_CMT "cmt"
+
+int virDomainGetPerfEvents(virDomainPtr dom,
+                           virTypedParameterPtr *params,
+                           int *nparams);
+int virDomainSetPerfEvents(virDomainPtr dom,
+                           virTypedParameterPtr params,
+                           int nparams);
+
 /*
  * BlockJob API
  */
index 9bc321125ace26d2b4de4e9fa02506af209d8f4e..d0e729880080ff44da038a2e4033f2f1e7d8d713 100644 (file)
@@ -961,6 +961,16 @@ typedef int
                                 unsigned long long duration,
                                 unsigned int flags);
 
+typedef int
+(*virDrvDomainGetPerfEvents)(virDomainPtr dom,
+                             virTypedParameterPtr *params,
+                             int *nparams);
+
+typedef int
+(*virDrvDomainSetPerfEvents)(virDomainPtr dom,
+                             virTypedParameterPtr params,
+                             int nparams);
+
 typedef int
 (*virDrvDomainBlockJobAbort)(virDomainPtr dom,
                              const char *path,
@@ -1427,6 +1437,8 @@ struct _virHypervisorDriver {
     virDrvConnectSetKeepAlive connectSetKeepAlive;
     virDrvConnectIsAlive connectIsAlive;
     virDrvNodeSuspendForDuration nodeSuspendForDuration;
+    virDrvDomainGetPerfEvents domainGetPerfEvents;
+    virDrvDomainSetPerfEvents domainSetPerfEvents;
     virDrvDomainSetBlockIoTune domainSetBlockIoTune;
     virDrvDomainGetBlockIoTune domainGetBlockIoTune;
     virDrvDomainGetCPUStats domainGetCPUStats;
index caa81c0165ab812ee4284d8b32cb4499604da34f..42031bcd2ea5f2239b76bfbbd69217b1c1d5abbc 100644 (file)
@@ -9690,6 +9690,99 @@ virDomainOpenChannel(virDomainPtr dom,
 }
 
 
+/**
+ * virDomainGetPerfEvents:
+ * @domain: a domain object
+ * @params: where to store perf events setting
+ * @nparams: number of items in @params
+ *
+ * Get all perf events setting. Possible fields returned in @params are
+ * defined by VIR_DOMAIN_PERF_* macros and new fields will likely be
+ * introduced in the future.
+ *
+ * Returns -1 in case of failure, 0 in case of success.
+ */
+int virDomainGetPerfEvents(virDomainPtr domain,
+                           virTypedParameterPtr *params,
+                           int *nparams)
+{
+    virConnectPtr conn;
+
+    VIR_DOMAIN_DEBUG(domain, "params=%p, nparams=%p",
+                     params, nparams);
+
+    virResetLastError();
+
+    virCheckDomainReturn(domain, -1);
+    virCheckNonNullArgGoto(params, error);
+    virCheckNonNullArgGoto(nparams, error);
+
+    conn = domain->conn;
+
+    if (conn->driver->domainGetPerfEvents) {
+        int ret;
+        ret = conn->driver->domainGetPerfEvents(domain, params, nparams);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
+    virReportUnsupportedError();
+
+ error:
+    virDispatchError(domain->conn);
+    return -1;
+}
+
+
+/**
+ * virDomainSetPerfEvents:
+ * @domain: a domain object
+ * @params: pointer to perf events parameter object
+ * @nparams: number of perf event parameters (this value can be the same
+ *           less than the number of parameters supported)
+ *
+ * Enable or disable the particular list of perf events you care about.
+ *
+ * Returns -1 in case of error, 0 in case of success.
+ */
+int virDomainSetPerfEvents(virDomainPtr domain,
+                           virTypedParameterPtr params,
+                           int nparams)
+{
+    virConnectPtr conn;
+
+    VIR_DOMAIN_DEBUG(domain, "params=%p, nparams=%d",
+                     params, nparams);
+    VIR_TYPED_PARAMS_DEBUG(params, nparams);
+
+    virResetLastError();
+
+    virCheckDomainReturn(domain, -1);
+    conn = domain->conn;
+
+    virCheckReadOnlyGoto(conn->flags, error);
+    virCheckNonNullArgGoto(params, error);
+    virCheckPositiveArgGoto(nparams, error);
+
+    if (virTypedParameterValidateSet(conn, params, nparams) < 0)
+        goto error;
+
+    if (conn->driver->domainSetPerfEvents) {
+        int ret;
+        ret = conn->driver->domainSetPerfEvents(domain, params, nparams);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
+
+    virReportUnsupportedError();
+
+ error:
+    virDispatchError(domain->conn);
+    return -1;
+}
+
+
 /**
  * virDomainBlockJobAbort:
  * @dom: pointer to domain object
index 221743a7f843f218102dadc825158c7752cd337b..1e920d6e68903784146b70ed4c21f7c5a22459b3 100644 (file)
@@ -728,6 +728,8 @@ LIBVIRT_1.2.19 {
 LIBVIRT_1.3.3 {
     global:
         virDomainMigrateStartPostCopy;
+        virDomainGetPerfEvents;
+        virDomainSetPerfEvents;
 } LIBVIRT_1.2.19;
 
 # .... define new API here using predicted next version number ....