* [PATCH v7 1/4] tools/perf: support parsing parameterized events
2015-01-08 1:13 [PATCH v7 0/4] Add support for parametrized events Sukadev Bhattiprolu
@ 2015-01-08 1:13 ` Sukadev Bhattiprolu
2015-01-08 1:13 ` [PATCH v7 2/4] tools/perf: extend format_alias() to include event parameters Sukadev Bhattiprolu
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Sukadev Bhattiprolu @ 2015-01-08 1:13 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Michael Ellerman,
Paul Mackerras
Cc: peterz, linuxppc-dev, dev, linux-kernel
From: Cody P Schafer <cody@linux.vnet.ibm.com>
Enable event specification like:
pmu/event_name,param1=0x1,param2=0x4/
Assuming that
/sys/bus/event_source/devices/pmu/events/event_name
Contains something like
param2=?,bar=1,param1=?
CC: Haren Myneni <hbabu@us.ibm.com>
CC: Cody P Schafer <dev@codyps.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com>
---
Changelog[v6]:
[Jiri Olsa] Add a check to make sure that sysfs entries have with
parameters exactly match '=?'.
Changelog[v4]:
[Jiri Olsa] Merge to recent perf-core and fix a small conflict.
Changelog[v3]:
[Jiri Olsa] If the sysfs event file specifies 'param=val', make the
usage 'hv_24x7/event,param=123/' rather than 'hv_24x7/event,val=123/'.
tools/perf/util/parse-events.h | 1 +
tools/perf/util/pmu.c | 74 +++++++++++++++++++++++++++++++++++-------
2 files changed, 64 insertions(+), 11 deletions(-)
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index db2cf78..ca226ce 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -71,6 +71,7 @@ struct parse_events_term {
int type_val;
int type_term;
struct list_head list;
+ bool used;
};
struct parse_events_evlist {
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 5c9c494..bfbecf7 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -551,31 +551,68 @@ static void pmu_format_value(unsigned long *format, __u64 value, __u64 *v,
}
/*
+ * Term is a string term, and might be a param-term. Try to look up it's value
+ * in the remaining terms.
+ * - We have a term like "base-or-format-term=param-term",
+ * - We need to find the value supplied for "param-term" (with param-term named
+ * in a config string) later on in the term list.
+ */
+static int pmu_resolve_param_term(struct parse_events_term *term,
+ struct list_head *head_terms,
+ __u64 *value)
+{
+ struct parse_events_term *t;
+
+ list_for_each_entry(t, head_terms, list) {
+ if (t->type_val == PARSE_EVENTS__TERM_TYPE_NUM) {
+ if (!strcmp(t->config, term->config)) {
+ t->used = true;
+ *value = t->val.num;
+ return 0;
+ }
+ }
+ }
+
+ if (verbose)
+ printf("Required parameter '%s' not specified\n", term->config);
+
+ return -1;
+}
+
+/*
* Setup one of config[12] attr members based on the
* user input data - term parameter.
*/
static int pmu_config_term(struct list_head *formats,
struct perf_event_attr *attr,
struct parse_events_term *term,
+ struct list_head *head_terms,
bool zero)
{
struct perf_pmu_format *format;
__u64 *vp;
+ __u64 val;
+
+ /*
+ * If this is a parameter we've already used for parameterized-eval,
+ * skip it in normal eval.
+ */
+ if (term->used)
+ return 0;
/*
- * Support only for hardcoded and numnerial terms.
* Hardcoded terms should be already in, so nothing
* to be done for them.
*/
if (parse_events__is_hardcoded_term(term))
return 0;
- if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM)
- return -EINVAL;
-
format = pmu_find_format(formats, term->config);
- if (!format)
+ if (!format) {
+ if (verbose)
+ printf("Invalid event/parameter '%s'\n", term->config);
return -EINVAL;
+ }
switch (format->value) {
case PERF_PMU_FORMAT_VALUE_CONFIG:
@@ -592,11 +629,25 @@ static int pmu_config_term(struct list_head *formats,
}
/*
- * XXX If we ever decide to go with string values for
- * non-hardcoded terms, here's the place to translate
- * them into value.
+ * Either directly use a numeric term, or try to translate string terms
+ * using event parameters.
*/
- pmu_format_value(format->bits, term->val.num, vp, zero);
+ if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
+ val = term->val.num;
+ else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
+ if (strcmp(term->val.str, "?")) {
+ if (verbose)
+ pr_info("Invalid sysfs entry %s=%s\n",
+ term->config, term->val.str);
+ return -EINVAL;
+ }
+
+ if (pmu_resolve_param_term(term, head_terms, &val))
+ return -EINVAL;
+ } else
+ return -EINVAL;
+
+ pmu_format_value(format->bits, val, vp, zero);
return 0;
}
@@ -607,9 +658,10 @@ int perf_pmu__config_terms(struct list_head *formats,
{
struct parse_events_term *term;
- list_for_each_entry(term, head_terms, list)
- if (pmu_config_term(formats, attr, term, zero))
+ list_for_each_entry(term, head_terms, list) {
+ if (pmu_config_term(formats, attr, term, head_terms, zero))
return -EINVAL;
+ }
return 0;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v7 2/4] tools/perf: extend format_alias() to include event parameters
2015-01-08 1:13 [PATCH v7 0/4] Add support for parametrized events Sukadev Bhattiprolu
2015-01-08 1:13 ` [PATCH v7 1/4] tools/perf: support parsing parameterized events Sukadev Bhattiprolu
@ 2015-01-08 1:13 ` Sukadev Bhattiprolu
2015-01-08 1:13 ` [PATCH v7 3/4] perf Documentation: add " Sukadev Bhattiprolu
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Sukadev Bhattiprolu @ 2015-01-08 1:13 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Michael Ellerman,
Paul Mackerras
Cc: peterz, linuxppc-dev, dev, linux-kernel
From: Cody P Schafer <cody@linux.vnet.ibm.com>
This causes `perf list pmu` to show parameters for parameterized events
like:
pmu/event_name,param1=?,param2=?/ [Kernel PMU event]
An example:
hv_24x7/HPM_TLBIE__PHYS_CORE,core=?/ [Kernel PMU event]
CC: Haren Myneni <hbabu@us.ibm.com>
CC: Cody P Schafer <dev@codyps.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com>
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
---
Changelog[v7]
[Jiri Olsa] Nit: Add braces for clarity.
Changelog[v6]
[Jiri Olsa, Sukadev Bhattiprolu] Drop the '$' sign and go back to
just printing whatevever sysfs provides (which is '=?') to identify
required parameters. sysfs also now uses parameters like 'core'
and 'vcpu' rather than 'starting_index'.
Changelog[v5]
[Jiri Olsa, Peter Zijlstra] Use '$' to prefix parameterized events.
Changelog[v4]
[Jiri Olsa] If the parameter for an event in sysfs is 'param=val',
have perf-list show the event as 'param=?' rather than 'val=?'.
tools/perf/util/pmu.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index bfbecf7..4841167 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -819,10 +819,36 @@ void perf_pmu__set_format(unsigned long *bits, long from, long to)
set_bit(b, bits);
}
+static int sub_non_neg(int a, int b)
+{
+ if (b > a)
+ return 0;
+ return a - b;
+}
+
static char *format_alias(char *buf, int len, struct perf_pmu *pmu,
struct perf_pmu_alias *alias)
{
- snprintf(buf, len, "%s/%s/", pmu->name, alias->name);
+ struct parse_events_term *term;
+ int used = snprintf(buf, len, "%s/%s", pmu->name, alias->name);
+
+ list_for_each_entry(term, &alias->terms, list) {
+ if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR)
+ used += snprintf(buf + used, sub_non_neg(len, used),
+ ",%s=%s", term->config,
+ term->val.str);
+ }
+
+ if (sub_non_neg(len, used) > 0) {
+ buf[used] = '/';
+ used++;
+ }
+ if (sub_non_neg(len, used) > 0) {
+ buf[used] = '\0';
+ used++;
+ } else
+ buf[len - 1] = '\0';
+
return buf;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v7 3/4] perf Documentation: add event parameters
2015-01-08 1:13 [PATCH v7 0/4] Add support for parametrized events Sukadev Bhattiprolu
2015-01-08 1:13 ` [PATCH v7 1/4] tools/perf: support parsing parameterized events Sukadev Bhattiprolu
2015-01-08 1:13 ` [PATCH v7 2/4] tools/perf: extend format_alias() to include event parameters Sukadev Bhattiprolu
@ 2015-01-08 1:13 ` Sukadev Bhattiprolu
2015-01-08 1:13 ` [PATCH v7 4/4] tools/perf: Document parameterized and symbolic events Sukadev Bhattiprolu
2015-01-08 9:54 ` [PATCH v7 0/4] Add support for parametrized events Jiri Olsa
4 siblings, 0 replies; 7+ messages in thread
From: Sukadev Bhattiprolu @ 2015-01-08 1:13 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Michael Ellerman,
Paul Mackerras
Cc: peterz, linuxppc-dev, dev, linux-kernel
From: Cody P Schafer <cody@linux.vnet.ibm.com>
Event parameters are a basic way for partial events to be specified in
sysfs with per-event names given to the fields that need to be filled in
when using a particular event.
It is intended for supporting cases where the single 'cpu' parameter is
insufficient. For example, POWER 8 has events for physical
sockets/cores/cpus that are accessible from with virtual machines. To
keep using the single 'cpu' parameter we'd need to perform a mapping
between Linux's cpus and the physical machine's cpus (in this case
Linux is running under a hypervisor). This isn't possible because
bindings between our cpus and physical cpus may not be fixed, and we
probably won't have a "cpu" on each physical cpu.
CC: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
CC: Haren Myneni <hbabu@us.ibm.com>
CC: Cody P Schafer <dev@codyps.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com>
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
---
Changelog[v6]
Update event description to explain how required parameters
are displayed.
Documentation/ABI/testing/sysfs-bus-event_source-devices-events | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-bus-event_source-devices-events b/Documentation/ABI/testing/sysfs-bus-event_source-devices-events
index 20979f8..505f080 100644
--- a/Documentation/ABI/testing/sysfs-bus-event_source-devices-events
+++ b/Documentation/ABI/testing/sysfs-bus-event_source-devices-events
@@ -52,12 +52,18 @@ Description: Per-pmu performance monitoring events specific to the running syste
event=0x2abc
event=0x423,inv,cmask=0x3
domain=0x1,offset=0x8,starting_index=0xffff
+ domain=0x1,offset=0x8,core=?
Each of the assignments indicates a value to be assigned to a
particular set of bits (as defined by the format file
corresponding to the <term>) in the perf_event structure passed
to the perf_open syscall.
+ In the case of the last example, a value replacing "?" would
+ need to be provided by the user selecting the particular event.
+ This is referred to as "event parameterization". Event
+ parameters have the format 'param=?'.
+
What: /sys/bus/event_source/devices/<pmu>/events/<event>.unit
Date: 2014/02/24
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v7 4/4] tools/perf: Document parameterized and symbolic events
2015-01-08 1:13 [PATCH v7 0/4] Add support for parametrized events Sukadev Bhattiprolu
` (2 preceding siblings ...)
2015-01-08 1:13 ` [PATCH v7 3/4] perf Documentation: add " Sukadev Bhattiprolu
@ 2015-01-08 1:13 ` Sukadev Bhattiprolu
2015-01-08 9:54 ` [PATCH v7 0/4] Add support for parametrized events Jiri Olsa
4 siblings, 0 replies; 7+ messages in thread
From: Sukadev Bhattiprolu @ 2015-01-08 1:13 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Jiri Olsa, Michael Ellerman,
Paul Mackerras
Cc: peterz, linuxppc-dev, dev, linux-kernel
From: Cody P Schafer <cody@linux.vnet.ibm.com>
CC: Haren Myneni <hbabu@us.ibm.com>
CC: Cody P Schafer <dev@codyps.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com>
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
---
Changelog[v6]:
- [Sukadev Bhattiprolu]: Update documentation of perf-list and
perf-record; Added documentation for perf-stat.
- [Jiri Olsa] Fix some typos/formatting
tools/perf/Documentation/perf-list.txt | 13 +++++++++++++
tools/perf/Documentation/perf-record.txt | 12 ++++++++++++
tools/perf/Documentation/perf-stat.txt | 20 ++++++++++++++++----
3 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/tools/perf/Documentation/perf-list.txt b/tools/perf/Documentation/perf-list.txt
index cbb4f74..3e2aec9 100644
--- a/tools/perf/Documentation/perf-list.txt
+++ b/tools/perf/Documentation/perf-list.txt
@@ -89,6 +89,19 @@ raw encoding of 0x1A8 can be used:
You should refer to the processor specific documentation for getting these
details. Some of them are referenced in the SEE ALSO section below.
+PARAMETERIZED EVENTS
+--------------------
+
+Some pmu events listed by 'perf-list' will be displayed with '?' in them. For
+example:
+
+ hv_gpci/dtbp_ptitc,phys_processor_idx=?/
+
+This means that when provided as an event, a value for '?' must
+also be supplied. For example:
+
+ perf stat -C 0 -e 'hv_gpci/dtbp_ptitc,phys_processor_idx=0x2/' ...
+
OPTIONS
-------
diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
index af9a54e..7d8df2e 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -33,6 +33,18 @@ OPTIONS
- a raw PMU event (eventsel+umask) in the form of rNNN where NNN is a
hexadecimal event descriptor.
+ - a symbolically formed PMU event like 'pmu/param1=0x3,param2/' where
+ 'param1', 'param2', etc are defined as formats for the PMU in
+ /sys/bus/event_sources/devices/<pmu>/format/*.
+
+ - a symbolically formed event like 'pmu/config=M,config1=N,config3=K/'
+
+ where M, N, K are numbers (in decimal, hex, octal format). Acceptable
+ values for each of 'config', 'config1' and 'config2' are defined by
+ corresponding entries in /sys/bus/event_sources/devices/<pmu>/format/*
+ param1 and param2 are defined as formats for the PMU in:
+ /sys/bus/event_sources/devices/<pmu>/format/*
+
- a hardware breakpoint event in the form of '\mem:addr[:access]'
where addr is the address in memory you want to break in.
Access is the memory access type (read, write, execute) it can
diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt
index 29ee857..04e150d 100644
--- a/tools/perf/Documentation/perf-stat.txt
+++ b/tools/perf/Documentation/perf-stat.txt
@@ -25,10 +25,22 @@ OPTIONS
-e::
--event=::
- Select the PMU event. Selection can be a symbolic event name
- (use 'perf list' to list all events) or a raw PMU
- event (eventsel+umask) in the form of rNNN where NNN is a
- hexadecimal event descriptor.
+ Select the PMU event. Selection can be:
+
+ - a symbolic event name (use 'perf list' to list all events)
+
+ - a raw PMU event (eventsel+umask) in the form of rNNN where NNN is a
+ hexadecimal event descriptor.
+
+ - a symbolically formed event like 'pmu/param1=0x3,param2/' where
+ param1 and param2 are defined as formats for the PMU in
+ /sys/bus/event_sources/devices/<pmu>/format/*
+
+ - a symbolically formed event like 'pmu/config=M,config1=N,config2=K/'
+ where M, N, K are numbers (in decimal, hex, octal format).
+ Acceptable values for each of 'config', 'config1' and 'config2'
+ parameters are defined by corresponding entries in
+ /sys/bus/event_sources/devices/<pmu>/format/*
-i::
--no-inherit::
--
1.8.3.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v7 0/4] Add support for parametrized events
2015-01-08 1:13 [PATCH v7 0/4] Add support for parametrized events Sukadev Bhattiprolu
` (3 preceding siblings ...)
2015-01-08 1:13 ` [PATCH v7 4/4] tools/perf: Document parameterized and symbolic events Sukadev Bhattiprolu
@ 2015-01-08 9:54 ` Jiri Olsa
2015-01-12 14:18 ` Arnaldo Carvalho de Melo
4 siblings, 1 reply; 7+ messages in thread
From: Jiri Olsa @ 2015-01-08 9:54 UTC (permalink / raw)
To: Sukadev Bhattiprolu
Cc: peterz, linux-kernel, Arnaldo Carvalho de Melo, dev,
Paul Mackerras, linuxppc-dev
On Wed, Jan 07, 2015 at 05:13:49PM -0800, Sukadev Bhattiprolu wrote:
> Description of "event parameters" from the documentation patch:
>
> Event parameters are a basic way for partial events to be specified in
> sysfs with per-event names given to the fields that need to be filled in
> when using a particular event.
>
> It is intended for supporting cases where the single 'cpu' parameter is
> insufficient. For example, POWER 8 has events for physical
> sockets/cores/cpus that are accessible from with virtual machines. To
> keep using the single 'cpu' parameter we'd need to perform a mapping
> between Linux's cpus and the physical machine's cpus (in this case
> Linux is running under a hypervisor). This isn't possible because
> bindings between our cpus and physical cpus may not be fixed, and we
> probably won't have a "cpu" on each physical cpu.
>
> Description of the sysfs contents when events are parameterized (copied from an
> included patch):
>
> Examples:
>
> domain=0x1,offset=0x8,core=?
>
> In the case of the last example, a value replacing "?" would need
> to be provided by the user selecting the particular event. This is
> refered to as "event parameterization". All non-numerical values
> indicate an event parameter.
>
> Notes on how perf-list displays parameterized events
>
> PARAMETERIZED EVENTS
> --------------------
>
> Some pmu events listed by 'perf list' will be displayed with '$xyz' in
> them. For example:
>
> hv_24x7/HPM_THREAD_NAP_CCYC__PHYS_CORE,core=?/
>
> This means that when provided as an event, a value for ? must also
> be supplied. For example:
>
> perf stat -e \
> 'hv_24x7/HPM_THREAD_NAP_CCYC__PHYS_CORE,core=2' ...
>
> Changelog[v7]
> [Jiri Olsa] Nit: Add braces for clarity.
> [Jiri Olsa] Add a check to make sure that sysfs entries have with
> parameters exactly match '=?'.
for the patchset:
Acked-by: Jiri Olsa <jolsa@kernel.org>
thanks,
jirka
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v7 0/4] Add support for parametrized events
2015-01-08 9:54 ` [PATCH v7 0/4] Add support for parametrized events Jiri Olsa
@ 2015-01-12 14:18 ` Arnaldo Carvalho de Melo
0 siblings, 0 replies; 7+ messages in thread
From: Arnaldo Carvalho de Melo @ 2015-01-12 14:18 UTC (permalink / raw)
To: Jiri Olsa
Cc: peterz, linux-kernel, Paul Mackerras, dev, Sukadev Bhattiprolu,
linuxppc-dev
Em Thu, Jan 08, 2015 at 10:54:34AM +0100, Jiri Olsa escreveu:
> for the patchset:
>
> Acked-by: Jiri Olsa <jolsa@kernel.org>
Applied to perf/core
Thanks,
- Arnaldo
^ permalink raw reply [flat|nested] 7+ messages in thread