On Mon, Dec 07, 2015 at 03:53:52PM +0800, Qiaowei Ren wrote: > 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@xxxxxxxxx> > --- > include/libvirt/libvirt-domain.h | 18 ++++++++ > src/driver-hypervisor.h | 12 ++++++ > src/libvirt-domain.c | 93 ++++++++++++++++++++++++++++++++++++++++ > src/libvirt_public.syms | 6 +++ > 4 files changed, 129 insertions(+) > > diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h > index a1ea6a5..cc1b29b 100644 > --- a/include/libvirt/libvirt-domain.h > +++ b/include/libvirt/libvirt-domain.h > @@ -1802,6 +1802,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 > */ > > diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h > index ae2ec4d..aedbc83 100644 > --- a/src/driver-hypervisor.h > +++ b/src/driver-hypervisor.h > @@ -958,6 +958,16 @@ typedef int > 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, > unsigned int flags); > @@ -1413,6 +1423,8 @@ struct _virHypervisorDriver { > virDrvConnectSetKeepAlive connectSetKeepAlive; > virDrvConnectIsAlive connectIsAlive; > virDrvNodeSuspendForDuration nodeSuspendForDuration; > + virDrvDomainGetPerfEvents domainGetPerfEvents; > + virDrvDomainSetPerfEvents domainSetPerfEvents; > virDrvDomainSetBlockIoTune domainSetBlockIoTune; > virDrvDomainGetBlockIoTune domainGetBlockIoTune; > virDrvDomainGetCPUStats domainGetCPUStats; > diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c > index b91388e..f105803 100644 > --- a/src/libvirt-domain.c > +++ b/src/libvirt-domain.c > @@ -9564,6 +9564,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. You called the constants VIR_PERF in the header - either this doc needs changing or the constants need renaming to VIR_DOMAIN_PERF > + * > + * 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 > * @disk: path to the block device, or device shorthand > diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms > index dd94191..03206e7 100644 > --- a/src/libvirt_public.syms > +++ b/src/libvirt_public.syms > @@ -725,4 +725,10 @@ LIBVIRT_1.2.19 { > virDomainRename; > } LIBVIRT_1.2.17; > > +LIBVIRT_1.3.0 { > + global: > + virDomainGetPerfEvents; > + virDomainSetPerfEvents; > +} LIBVIRT_1.2.19; This will need to be 1.3.1 next time you post this ACK with the minor fixes 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 libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list