[libvirt] [PATCH 1/9] perf: add cpu_clock software perf event support

John Ferlan jferlan at redhat.com
Thu Feb 9 21:40:18 UTC 2017



On 01/27/2017 06:01 AM, Nitesh Konkar wrote:
> This patch adds support and documentation for
> the cpu_clock perf event.
> 
> Signed-off-by: Nitesh Konkar <nitkon12 at linux.vnet.ibm.com>
> ---
>  docs/formatdomain.html.in                   |  6 ++++++
>  docs/news.xml                               |  4 ++--
>  docs/schemas/domaincommon.rng               |  1 +
>  include/libvirt/libvirt-domain.h            | 10 ++++++++++
>  src/libvirt-domain.c                        |  2 ++
>  src/qemu/qemu_driver.c                      |  1 +
>  src/util/virperf.c                          |  6 +++++-
>  src/util/virperf.h                          |  1 +
>  tests/genericxml2xmlindata/generic-perf.xml |  1 +
>  tools/virsh.pod                             |  3 +++
>  10 files changed, 32 insertions(+), 3 deletions(-)
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 3f7f875..e44e758 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -1937,6 +1937,7 @@
>    <event name='stalled_cycles_frontend' enabled='no'/>
>    <event name='stalled_cycles_backend' enabled='no'/>
>    <event name='ref_cpu_cycles' enabled='no'/>
> +  <event name='cpu_clock' enabled='no'/>
>  </perf>
>  ...
>  </pre>
> @@ -2015,6 +2016,11 @@
>           by applications running on the platform</td>
>        <td><code>perf.ref_cpu_cycles</code></td>
>      </tr>
> +    <tr>
> +      <td><code>cpu_clock</code></td>
> +      <td>the count of cpu clock by applications running on the platform</td>
> +      <td><code>perf.cpu_clock</code></td>
> +    </tr>
>    </table>

"the count of cpu clock by applications..."

doesn't convey enough meaning. Is that cycles? Time?  something else?

The virsh.pod description seems to give the best hint...

Some subsequent patches had longer descriptions in the virsh.pod, which
got me thinking - where is the best place to have the longer
description. I would think either in formatdomain or the
libvirt-domain.{c|} description.  At least that way you don't need to
mess with the 80 column formatting that is "nice" to have in virsh.pod
output


>  
>      <h3><a name="elementsDevices">Devices</a></h3>
> diff --git a/docs/news.xml b/docs/news.xml
> index ef7e2db..ec113ab 100644
> --- a/docs/news.xml
> +++ b/docs/news.xml
> @@ -136,8 +136,8 @@
>          <description>
>            Add support to get the count of branch instructions
>            executed, branch misses, bus cycles, stalled frontend
> -          cpu cycles, stalled backend cpu cycles, and ref cpu
> -          cycles by applications running on the platform.
> +          cpu cycles, stalled backend cpu cycles, ref cpu cycles
> +          and cpu clock by applications running on the platform.
>          </description>
>        </change>
>        <change>

So the latest decree is to not integrate news.xml into the patches with
the code.  So just make one patch at the end that summarizes all the
adjustments.

Also this patch is wrong because it describes the additions in the 3.0.0
section while this code would be available in 3.1.0.

> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 4d76315..86a39c8 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -433,6 +433,7 @@
>                <value>stalled_cycles_frontend</value>
>                <value>stalled_cycles_backend</value>
>                <value>ref_cpu_cycles</value>
> +              <value>cpu_clock</value>
>              </choice>
>            </attribute>
>            <attribute name="enabled">
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index e303140..bffe955 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -2188,6 +2188,16 @@ void virDomainStatsRecordListFree(virDomainStatsRecordPtr *stats);
>   */
>  # define VIR_PERF_PARAM_REF_CPU_CYCLES "ref_cpu_cycles"
>  
> +/**
> + * VIR_PERF_PARAM_CPU_CLOCK:
> + *
> + * Macro for typed parameter name that represents cpu_clock
> + * perf event which can be used to measure the count of cpu
> + * clock by applications running on the platform. It corresponds
> + * to the "perf.cpu_clock" field in the *Stats APIs.
> + */
> +# define VIR_PERF_PARAM_CPU_CLOCK "cpu_clock"
> +
>  int virDomainGetPerfEvents(virDomainPtr dom,
>                             virTypedParameterPtr *params,
>                             int *nparams,
> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
> index 5b3e842..001cdd7 100644
> --- a/src/libvirt-domain.c
> +++ b/src/libvirt-domain.c
> @@ -11250,6 +11250,8 @@ virConnectGetDomainCapabilities(virConnectPtr conn,
>   *                             CPU frequency scaling by applications running
>   *                             as unsigned long long. It is produced by the
>   *                             ref_cpu_cycles perf event.
> + *     "perf.cpu_clock" - The count of cpu clock as unsigned long long. It is
> + *                        produced by the cpu_clock perf event.
>   *
>   * Note that entire stats groups or individual stat fields may be missing from
>   * the output in case they are not supported by the given hypervisor, are not
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 516a851..ff4803c 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -9549,6 +9549,7 @@ qemuDomainSetPerfEvents(virDomainPtr dom,
>                                 VIR_PERF_PARAM_STALLED_CYCLES_FRONTEND, VIR_TYPED_PARAM_BOOLEAN,
>                                 VIR_PERF_PARAM_STALLED_CYCLES_BACKEND, VIR_TYPED_PARAM_BOOLEAN,
>                                 VIR_PERF_PARAM_REF_CPU_CYCLES, VIR_TYPED_PARAM_BOOLEAN,
> +                               VIR_PERF_PARAM_CPU_CLOCK, VIR_TYPED_PARAM_BOOLEAN,
>                                 NULL) < 0)
>          return -1;
>  
> diff --git a/src/util/virperf.c b/src/util/virperf.c
> index f64692b..3629e5b 100644
> --- a/src/util/virperf.c
> +++ b/src/util/virperf.c
> @@ -43,7 +43,8 @@ VIR_ENUM_IMPL(virPerfEvent, VIR_PERF_EVENT_LAST,
>                "cache_references", "cache_misses",
>                "branch_instructions", "branch_misses",
>                "bus_cycles", "stalled_cycles_frontend",
> -              "stalled_cycles_backend", "ref_cpu_cycles");
> +              "stalled_cycles_backend", "ref_cpu_cycles",
> +              "cpu_clock");
>  
>  struct virPerfEvent {
>      int type;
> @@ -112,6 +113,9 @@ static struct virPerfEventAttr attrs[] = {
>       .attrConfig = 0,
>  # endif
>      },
> +    {.type = VIR_PERF_EVENT_CPU_CLOCK,
> +     .attrType = PERF_TYPE_SOFTWARE,
> +     .attrConfig = PERF_COUNT_SW_CPU_CLOCK},
>  };
>  typedef struct virPerfEventAttr *virPerfEventAttrPtr;
>  
> diff --git a/src/util/virperf.h b/src/util/virperf.h
> index 1f43c92..81f1e20 100644
> --- a/src/util/virperf.h
> +++ b/src/util/virperf.h
> @@ -47,6 +47,7 @@ typedef enum {
>                                                the backend of the instruction
>                                                processor pipeline */
>      VIR_PERF_EVENT_REF_CPU_CYCLES,   /* Count of ref cpu cycles */
> +    VIR_PERF_EVENT_CPU_CLOCK,   /* Count of cpu clock */
>  
>      VIR_PERF_EVENT_LAST
>  } virPerfEventType;
> diff --git a/tests/genericxml2xmlindata/generic-perf.xml b/tests/genericxml2xmlindata/generic-perf.xml
> index 437cd65..3e7834e 100644
> --- a/tests/genericxml2xmlindata/generic-perf.xml
> +++ b/tests/genericxml2xmlindata/generic-perf.xml
> @@ -26,6 +26,7 @@
>      <event name='stalled_cycles_frontend' enabled='yes'/>
>      <event name='stalled_cycles_backend' enabled='yes'/>
>      <event name='ref_cpu_cycles' enabled='yes'/>
> +    <event name='cpu_clock' enabled='yes'/>
>    </perf>
>    <devices>
>    </devices>
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index 290f508..2f0bf36 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -946,6 +946,7 @@ I<--perf> returns the statistics of all enabled perf events:
>  "perf.stalled_cycles_frontend" - the count of stalled frontend cpu cycles,
>  "perf.stalled_cycles_backend" - the count of stalled backend cpu cycles,
>  "perf.ref_cpu_cycles" - the count of ref cpu cycles
> +"perf.cpu_clock" - the count of cpu clock


If you do a 'man tools/virsh.1' using an 80 column wide terminal, you'll
note that starting with perf.stalled_cycles_frontend things go a bit
haywire.

I sent a patch to "fix" the existing format issues and make things a bit
more consistent in this space.

If that's ACK'd then this will be affected. Still the text here still
doesn't convey enough meaning.

>  
>  See the B<perf> command for more details about each event.
>  
> @@ -2310,6 +2311,8 @@ B<Valid perf event names>
>    ref_cpu_cycles   -  Provides the count of total cpu cycles
>                        not affected by CPU frequency scaling by
>                        applications running on the platform.
> +  cpu_clock - Provides the cpu clock time consumed by applications
> +              running on the platform.

Now this is a little bit better w/r/t meaning, but needs to be fit in
else where as well.

John
>  
>  B<Note>: The statistics can be retrieved using the B<domstats> command using
>  the I<--perf> flag.
> 




More information about the libvir-list mailing list