[libvirt] [PATCH 4/8] qemu_driver: add support to perf event

Daniel P. Berrange berrange at redhat.com
Thu Jan 28 15:18:51 UTC 2016


On Thu, Dec 10, 2015 at 08:34:34PM +0800, Qiaowei Ren wrote:
> This patch implement the internal driver API for perf event into
> qemu driver.
> 
> Signed-off-by: Qiaowei Ren <qiaowei.ren at intel.com>
> ---
>  include/libvirt/libvirt-domain.h |   1 +
>  src/qemu/qemu_domain.h           |   3 +
>  src/qemu/qemu_driver.c           | 133 +++++++++++++++++++++++++++++++++++++++
>  src/qemu/qemu_process.c          |   6 ++
>  4 files changed, 143 insertions(+)
> 


> @@ -19427,6 +19508,55 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver,
>  
>  #undef QEMU_ADD_COUNT_PARAM
>  
> +static int
> +qemuDomainGetStatsPerfCmt(virPerfPtr perf,
> +                          virDomainStatsRecordPtr record,
> +                          int *maxparams)
> +{
> +    uint64_t cache = 0;
> +
> +    if (virPerfReadEvent(perf, VIR_PERF_EVENT_CMT, &cache) < 0)
> +        return -1;
> +
> +    if (virTypedParamsAddULLong(&record->params,
> +                                &record->nparams,
> +                                maxparams,
> +                                "perf.cache",
> +                                cache) < 0)
> +        return -1;
> +
> +    return 0;
> +}
> +
> +static int
> +qemuDomainGetStatsPerf(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
> +                       virDomainObjPtr dom,
> +                       virDomainStatsRecordPtr record,
> +                       int *maxparams,
> +                       unsigned int privflags ATTRIBUTE_UNUSED)
> +{
> +    size_t i;
> +    qemuDomainObjPrivatePtr priv = dom->privateData;
> +    int ret = -1;
> +
> +    for (i = 0; i < VIR_PERF_EVENT_LAST; i++) {
> +        if (!virPerfEventIsEnabled(priv->perf, i))
> +             continue;
> +
> +        switch (i) {
> +        case VIR_PERF_EVENT_CMT:
> +            if (qemuDomainGetStatsPerfCmt(priv->perf, record, maxparams))
> +                goto cleanup;

I guess that should be checking  '< 0'

> +            break;
> +        }
> +    }
> +
> +    ret = 0;
> +
> + cleanup:
> +    return ret;
> +}
> +
>  typedef int
>  (*qemuDomainGetStatsFunc)(virQEMUDriverPtr driver,
>                            virDomainObjPtr dom,
> @@ -19447,6 +19577,7 @@ static struct qemuDomainGetStatsWorker qemuDomainGetStatsWorkers[] = {
>      { qemuDomainGetStatsVcpu, VIR_DOMAIN_STATS_VCPU, false },
>      { qemuDomainGetStatsInterface, VIR_DOMAIN_STATS_INTERFACE, false },
>      { qemuDomainGetStatsBlock, VIR_DOMAIN_STATS_BLOCK, true },
> +    { qemuDomainGetStatsPerf, VIR_DOMAIN_STATS_PERF, false },
>      { NULL, 0, false }
>  };
>  
> @@ -20207,6 +20338,8 @@ static virHypervisorDriver qemuHypervisorDriver = {
>      .domainMigrateFinish3 = qemuDomainMigrateFinish3, /* 0.9.2 */
>      .domainMigrateConfirm3 = qemuDomainMigrateConfirm3, /* 0.9.2 */
>      .domainSendKey = qemuDomainSendKey, /* 0.9.4 */
> +    .domainGetPerfEvents = qemuDomainGetPerfEvents, /* 1.3.1 */
> +    .domainSetPerfEvents = qemuDomainSetPerfEvents, /* 1.3.1 */
>      .domainBlockJobAbort = qemuDomainBlockJobAbort, /* 0.9.4 */
>      .domainGetBlockJobInfo = qemuDomainGetBlockJobInfo, /* 0.9.4 */
>      .domainBlockJobSetSpeed = qemuDomainBlockJobSetSpeed, /* 0.9.4 */
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 4201962..8679d29 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -4844,6 +4844,10 @@ qemuProcessLaunch(virConnectPtr conn,
>      if (qemuSetupCgroup(driver, vm, nnicindexes, nicindexes) < 0)
>          goto cleanup;
>  
> +    priv->perf = virPerfNew();
> +    if (!priv->perf)
> +        goto cleanup;
> +

You also need todo this in  qemuProcessReconnect so that it works
after libvirtd is restarted, and in qemuProcessAttach too


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 :|




More information about the libvir-list mailing list