[libvirt] [PATCH 2/4] perf: add stalled_cycles_frontend perf event support

John Ferlan jferlan at redhat.com
Tue Dec 13 22:01:34 UTC 2016



On 12/13/2016 11:01 AM, Nitesh Konkar wrote:
> This patch adds support and documentation
> for the stalled_cycles_frontend perf event.
> 
> Signed-off-by: Nitesh Konkar <nitkon12 at linux.vnet.ibm.com>
> ---
>  docs/formatdomain.html.in                   |  6 ++++++
>  docs/news.html.in                           |  6 +++---
>  docs/schemas/domaincommon.rng               |  1 +
>  include/libvirt/libvirt-domain.h            | 10 ++++++++++
>  src/libvirt-domain.c                        |  3 +++
>  src/qemu/qemu_driver.c                      |  1 +
>  src/util/virperf.c                          |  5 ++++-
>  src/util/virperf.h                          |  1 +
>  tests/genericxml2xmlindata/generic-perf.xml |  1 +
>  tools/virsh.pod                             |  8 ++++++--
>  10 files changed, 36 insertions(+), 6 deletions(-)
> 

Similarly a few nits which I fixed - see below.

John

> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index cd3182b..424b4de 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -1930,6 +1930,7 @@
>    <event name='branch_instructions' enabled='no'/>
>    <event name='branch_misses' enabled='no'/>
>    <event name='bus_cycles' enabled='no'/>
> +  <event name='stalled_cycles_frontend' enabled='no'/>
>  </perf>
>  ...
>  </pre>
> @@ -1990,6 +1991,11 @@
>        <td>the count of bus cycles by applications running on the platform</td>
>        <td><code>perf.bus_cycles</code></td>
>      </tr>
> +    <tr>
> +      <td><code>stalled_cycles_frontend</code></td>
> +      <td>the count of stalled cycles frontend by applications running on the platform</td>

Change to:

the count of stalled cpu cycles in the frontend of the instruction
processor pipeline by applications running on the platform

IMO: It's an awful name to try and describe in a few sentences!
Essentially from my quick read an instruction pipeline can either be
stalled in the front or backend depending on what's causing the stall.
So this just counts those stall "in the" front end.

> +      <td><code>perf.stalled_cycles_frontend</code></td>
> +    </tr>
>    </table>
>  
>      <h3><a name="elementsDevices">Devices</a></h3>
> diff --git a/docs/news.html.in b/docs/news.html.in
> index f246b2a..ea91d99 100644
> --- a/docs/news.html.in
> +++ b/docs/news.html.in
> @@ -30,9 +30,9 @@
>        <li><strong>Improvements</strong>
>          <ul>
>            <li>perf: Add more perf statistics<br/>
> -          Add support to get the count of branch instructions executed
> -          and branch misses and bus cycles by applications running on
> -          the platform
> +          Add support to get the count of branch instructions
> +          executed, branch misses, bus cycles, stalled cycles

bus cycles, and stalled frontend cpu cycles

> +          frontend by applications running on the platform
>            </li>
>          </ul>
>        </li>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 21a7afa..9ce7cc9 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -430,6 +430,7 @@
>                <value>branch_instructions</value>
>                <value>branch_misses</value>
>                <value>bus_cycles</value>
> +              <value>stalled_cycles_frontend</value>
>              </choice>
>            </attribute>
>            <attribute name="enabled">
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index 6d74238..0741d14 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -2155,6 +2155,16 @@ void virDomainStatsRecordListFree(virDomainStatsRecordPtr *stats);
>   */
>  # define VIR_PERF_PARAM_BUS_CYCLES "bus_cycles"
>  
> +/**
> + * VIR_PERF_PARAM_STALLED_CYCLES_FRONTEND:
> + *
> + * Macro for typed parameter name that represents stalled_cycles_frontend
> + * perf event which can be used to measure the count of stalled cycles frontend
> + * by applications running on the platform. It corresponds to the
> + * "perf.stalled_cycles_frontend" field in the *Stats APIs.

A similar update here (sorry - line wrap makes it look ugly):

 * Macro for typed parameter name that represents stalled_cycles_frontend
 * perf event which can be used to measure the count of stalled cpu cycles
 * in the frontend of the instruction processor pipeline by applications
 * running on the platform. It corresponds to the
 * "perf.stalled_cycles_frontend" field in the *Stats APIs.

> + */
> +# define VIR_PERF_PARAM_STALLED_CYCLES_FRONTEND "stalled_cycles_frontend"
> +
>  int virDomainGetPerfEvents(virDomainPtr dom,
>                             virTypedParameterPtr *params,
>                             int *nparams,
> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
> index 19e323d..0d23d31 100644
> --- a/src/libvirt-domain.c
> +++ b/src/libvirt-domain.c
> @@ -11236,6 +11236,9 @@ virConnectGetDomainCapabilities(virConnectPtr conn,
>   *                            long. It is produced by branch_misses perf event.
>   *     "perf.bus_cycles"    - The count of bus cycles as unsigned long
>   *                            long. It is produced by bus_cycles perf event.
> + *     "perf.stalled_cycles_frontend" - The count of stalled cycles frontend
> + *                                      as unsigned long long. It is produced
> + *                                      by stalled_cycles_frontend perf event.

Same here:

The count of stalled cpu cycles in the frontend of the instruction
processor pipeline as unsigned long long.

>   *
>   * 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 cf0f5e0..273dbeb 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -9855,6 +9855,7 @@ qemuDomainSetPerfEvents(virDomainPtr dom,
>                                 VIR_PERF_PARAM_BRANCH_INSTRUCTIONS, VIR_TYPED_PARAM_BOOLEAN,
>                                 VIR_PERF_PARAM_BRANCH_MISSES, VIR_TYPED_PARAM_BOOLEAN,
>                                 VIR_PERF_PARAM_BUS_CYCLES, VIR_TYPED_PARAM_BOOLEAN,
> +                               VIR_PERF_PARAM_STALLED_CYCLES_FRONTEND, VIR_TYPED_PARAM_BOOLEAN,
>                                 NULL) < 0)
>          return -1;
>  
> diff --git a/src/util/virperf.c b/src/util/virperf.c
> index 31a5585..c21147a 100644
> --- a/src/util/virperf.c
> +++ b/src/util/virperf.c
> @@ -42,7 +42,7 @@ VIR_ENUM_IMPL(virPerfEvent, VIR_PERF_EVENT_LAST,
>                "cpu_cycles", "instructions",
>                "cache_references", "cache_misses",
>                "branch_instructions", "branch_misses",
> -              "bus_cycles");
> +              "bus_cycles", "stalled_cycles_frontend");
>  
>  struct virPerfEvent {
>      int type;
> @@ -96,6 +96,9 @@ static struct virPerfEventAttr attrs[] = {
>      {.type = VIR_PERF_EVENT_BUS_CYCLES,
>       .attrType = PERF_TYPE_HARDWARE,
>       .attrConfig = PERF_COUNT_HW_BUS_CYCLES},
> +    {.type = VIR_PERF_EVENT_STALLED_CYCLES_FRONTEND,
> +     .attrType = PERF_TYPE_HARDWARE,
> +     .attrConfig = PERF_COUNT_HW_STALLED_CYCLES_FRONTEND},
>  };
>  typedef struct virPerfEventAttr *virPerfEventAttrPtr;
>  
> diff --git a/src/util/virperf.h b/src/util/virperf.h
> index ac6d789..0aee1ba 100644
> --- a/src/util/virperf.h
> +++ b/src/util/virperf.h
> @@ -40,6 +40,7 @@ typedef enum {
>                                             for applications */
>      VIR_PERF_EVENT_BRANCH_MISSES,  /* Count of branch misses for applications */
>      VIR_PERF_EVENT_BUS_CYCLES,       /* Count of bus cycles for applications*/
> +    VIR_PERF_EVENT_STALLED_CYCLES_FRONTEND, /*Count of stalled cycles frontend*/

Comment spacing adjustment /* Count ... frontend */

I also added the longer description to the comment.

>  
>      VIR_PERF_EVENT_LAST
>  } virPerfEventType;
> diff --git a/tests/genericxml2xmlindata/generic-perf.xml b/tests/genericxml2xmlindata/generic-perf.xml
> index 56a6173..db76843 100644
> --- a/tests/genericxml2xmlindata/generic-perf.xml
> +++ b/tests/genericxml2xmlindata/generic-perf.xml
> @@ -23,6 +23,7 @@
>      <event name='branch_instructions' enabled='yes'/>
>      <event name='branch_misses' enabled='yes'/>
>      <event name='bus_cycles' enabled='yes'/>
> +    <event name='stalled_cycles_frontend' enabled='yes'/>
>    </perf>
>    <devices>
>    </devices>
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index d844dc8..f9a6a19 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -947,8 +947,9 @@ I<--perf> returns the statistics of all enabled perf events:
>  "perf.cache_references" - the count of cache hits,
>  "perf.cache_misses" - the count of caches misses,
>  "perf.branch_instructions" - the count of branch instructions,
> -"perf.branch_misses" - the count of branch misses
> -"perf.bus_cycles" - the count of bus cycles
> +"perf.branch_misses" - the count of branch misses,

This I moved to the previous patch...

> +"perf.bus_cycles" - the count of bus cycles,
> +"perf.stalled_cycles_frontend" - the count of stalled cycles frontend

changed to "the count of stalled frontend cpu cycles"

>  
>  See the B<perf> command for more details about each event.
>  
> @@ -2302,6 +2303,9 @@ B<Valid perf event names>
>                       by applications running on the platform.
>    bus_cycles       - Provides the count of bus cycles executed
>                       by applications running on the platform.
> +  stalled_cycles_frontend - Provides the count of stalled cycles
> +                            frontend by applications running on
> +                            the platform.

Longer description here too

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