Signed-off-by: Lai Jiangshan <laijs(a)cn.fujitsu.com>
---
include/libvirt/libvirt.h.in | 5 ++++
python/generator.py | 1 +
src/driver.h | 7 +++++
src/libvirt.c | 51 ++++++++++++++++++++++++++++++++++++++++++
src/libvirt_public.syms | 5 ++++
5 files changed, 69 insertions(+), 0 deletions(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index e436f3c..167e89f 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -3606,6 +3606,11 @@ int virConnectSetKeepAlive(virConnectPtr conn,
int interval,
unsigned int count);
+int virDomainGetPcpusUsage(virDomainPtr dom,
+ unsigned long long *usages,
+ int *nr_usages,
+ unsigned int flags);
+
#ifdef __cplusplus
}
#endif
diff --git a/python/generator.py b/python/generator.py
index 6fee3a4..0311004 100755
--- a/python/generator.py
+++ b/python/generator.py
@@ -421,6 +421,7 @@ skip_impl = (
'virDomainGetBlockIoTune',
'virDomainSetInterfaceParameters',
'virDomainGetInterfaceParameters',
+ 'virDomainGetPcpusUsage', # not implemented yet
)
qemu_skip_impl = (
diff --git a/src/driver.h b/src/driver.h
index 24636a4..2a3c46d 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -794,6 +794,12 @@ typedef int
int *nparams,
unsigned int flags);
+typedef int
+ (*virDrvDomainGetPcpusUsage)(virDomainPtr dom,
+ unsigned long long *usages,
+ int *nr_usages,
+ unsigned int flags);
+
/**
* _virDriver:
*
@@ -962,6 +968,7 @@ struct _virDriver {
virDrvNodeSuspendForDuration nodeSuspendForDuration;
virDrvDomainSetBlockIoTune domainSetBlockIoTune;
virDrvDomainGetBlockIoTune domainGetBlockIoTune;
+ virDrvDomainGetPcpusUsage domainGetPcpusUsage;
};
typedef int
diff --git a/src/libvirt.c b/src/libvirt.c
index a540424..bd19bf5 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -17882,3 +17882,54 @@ error:
virDispatchError(dom->conn);
return -1;
}
+
+/**
+ * virDomainGetPcpusUsage:
+ * @dom: pointer to domain object
+ * @usages: returned physical cpu usages
+ * @nr_usages: length of @usages
+ * @flags: flags to control the operation
+ *
+ * Get the cpu usages for every physical cpu since the domain started (in nanoseconds).
+ *
+ * Returns 0 if success, -1 on error
+ */
+int virDomainGetPcpusUsage(virDomainPtr dom,
+ unsigned long long *usages,
+ int *nr_usages,
+ unsigned int flags)
+{
+ virConnectPtr conn;
+
+ VIR_DOMAIN_DEBUG(dom, "usages=%p, nr_usages=%d, flags=%x",
+ usages, (nr_usages) ? *nr_usages : -1, flags);
+
+ virResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
+ virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ virDispatchError(NULL);
+ return -1;
+ }
+
+ if (nr_usages == NULL && *nr_usages != 0) {
+ virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+ goto error;
+ }
+
+ conn = dom->conn;
+
+ if (conn->driver->domainGetPcpusUsage) {
+ int ret;
+ ret = conn->driver->domainGetPcpusUsage(dom, usages, nr_usages, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ virDispatchError(dom->conn);
+ return -1;
+}
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 4ca7216..15d944c 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -516,4 +516,9 @@ LIBVIRT_0.9.9 {
virDomainSetNumaParameters;
} LIBVIRT_0.9.8;
+LIBVIRT_0.9.10 {
+ global:
+ virDomainGetPcpusUsage;
+} LIBVIRT_0.9.9;
+
# .... define new API here using predicted next version number ....
--
1.7.4.4