From: Adrian Hunter <adrian.hunter@intel.com>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
linux-kernel@vger.kernel.org, David Ahern <dsahern@gmail.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@gmail.com>,
Paul Mackerras <paulus@samba.org>,
Stephane Eranian <eranian@google.com>
Subject: [PATCH 06/24] perf tools: Let default config be defined for a PMU
Date: Fri, 15 Aug 2014 22:08:41 +0300 [thread overview]
Message-ID: <1408129739-17368-7-git-send-email-adrian.hunter@intel.com> (raw)
In-Reply-To: <1408129739-17368-1-git-send-email-adrian.hunter@intel.com>
This allows default config terms to be provided
for a PMU. So, for example, when the Intel PT
PMU is added, it will be possible to specify:
intel_pt//
which will be the same as:
intel_pt/tsc=1,noretcomp=0/
meaning that the trace should contain
TSC timestamps and perform 'return
compression'.
An important consideration of this
patch is that it must be possible
to overwrite the default values.
That has meant changing the logic
so that a zero value can replace
a non-zero value.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
tools/perf/tests/pmu.c | 2 +-
tools/perf/util/parse-events.c | 7 ++++++-
tools/perf/util/pmu.c | 42 ++++++++++++++++++++++++++----------------
tools/perf/util/pmu.h | 9 ++++++++-
4 files changed, 41 insertions(+), 19 deletions(-)
diff --git a/tools/perf/tests/pmu.c b/tools/perf/tests/pmu.c
index 12b322f..eeb68bb1 100644
--- a/tools/perf/tests/pmu.c
+++ b/tools/perf/tests/pmu.c
@@ -152,7 +152,7 @@ int test__pmu(void)
if (ret)
break;
- ret = perf_pmu__config_terms(&formats, &attr, terms);
+ ret = perf_pmu__config_terms(&formats, &attr, terms, false);
if (ret)
break;
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index e756288..61be3e6 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -643,7 +643,12 @@ int parse_events_add_pmu(struct list_head *list, int *idx,
if (!pmu)
return -EINVAL;
- memset(&attr, 0, sizeof(attr));
+ if (pmu->default_config) {
+ memcpy(&attr, pmu->default_config,
+ sizeof(struct perf_event_attr));
+ } else {
+ memset(&attr, 0, sizeof(attr));
+ }
if (!head_config) {
attr.type = pmu->type;
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 9bf5827..438bb26 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -2,6 +2,7 @@
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
+#include <stdbool.h>
#include <dirent.h>
#include <api/fs/fs.h>
#include <locale.h>
@@ -387,6 +388,12 @@ static struct cpu_map *pmu_cpumask(const char *name)
return cpus;
}
+struct perf_event_attr *__attribute__((weak))
+perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused)
+{
+ return NULL;
+}
+
static struct perf_pmu *pmu_lookup(const char *name)
{
struct perf_pmu *pmu;
@@ -421,6 +428,9 @@ static struct perf_pmu *pmu_lookup(const char *name)
pmu->name = strdup(name);
pmu->type = type;
list_add_tail(&pmu->list, &pmus);
+
+ pmu->default_config = perf_pmu__get_default_config(pmu);
+
return pmu;
}
@@ -479,28 +489,24 @@ pmu_find_format(struct list_head *formats, char *name)
}
/*
- * Returns value based on the format definition (format parameter)
+ * Sets value based on the format definition (format parameter)
* and unformated value (value parameter).
- *
- * TODO maybe optimize a little ;)
*/
-static __u64 pmu_format_value(unsigned long *format, __u64 value)
+static void pmu_format_value(unsigned long *format, __u64 value, __u64 *v,
+ bool zero)
{
unsigned long fbit, vbit;
- __u64 v = 0;
for (fbit = 0, vbit = 0; fbit < PERF_PMU_FORMAT_BITS; fbit++) {
if (!test_bit(fbit, format))
continue;
- if (!(value & (1llu << vbit++)))
- continue;
-
- v |= (1llu << fbit);
+ if (value & (1llu << vbit++))
+ *v |= (1llu << fbit);
+ else if (zero)
+ *v &= ~(1llu << fbit);
}
-
- return v;
}
/*
@@ -509,7 +515,8 @@ static __u64 pmu_format_value(unsigned long *format, __u64 value)
*/
static int pmu_config_term(struct list_head *formats,
struct perf_event_attr *attr,
- struct parse_events_term *term)
+ struct parse_events_term *term,
+ bool zero)
{
struct perf_pmu_format *format;
__u64 *vp;
@@ -548,18 +555,19 @@ static int pmu_config_term(struct list_head *formats,
* non-hardcoded terms, here's the place to translate
* them into value.
*/
- *vp |= pmu_format_value(format->bits, term->val.num);
+ pmu_format_value(format->bits, term->val.num, vp, zero);
return 0;
}
int perf_pmu__config_terms(struct list_head *formats,
struct perf_event_attr *attr,
- struct list_head *head_terms)
+ struct list_head *head_terms,
+ bool zero)
{
struct parse_events_term *term;
list_for_each_entry(term, head_terms, list)
- if (pmu_config_term(formats, attr, term))
+ if (pmu_config_term(formats, attr, term, zero))
return -EINVAL;
return 0;
@@ -573,8 +581,10 @@ int perf_pmu__config_terms(struct list_head *formats,
int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr,
struct list_head *head_terms)
{
+ bool zero = !!pmu->default_config;
+
attr->type = pmu->type;
- return perf_pmu__config_terms(&pmu->format, attr, head_terms);
+ return perf_pmu__config_terms(&pmu->format, attr, head_terms, zero);
}
static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu,
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
index 1c1e2ee..413b9a6 100644
--- a/tools/perf/util/pmu.h
+++ b/tools/perf/util/pmu.h
@@ -13,9 +13,12 @@ enum {
#define PERF_PMU_FORMAT_BITS 64
+struct perf_event_attr;
+
struct perf_pmu {
char *name;
__u32 type;
+ struct perf_event_attr *default_config;
struct cpu_map *cpus;
struct list_head format; /* HEAD struct perf_pmu_format -> list */
struct list_head aliases; /* HEAD struct perf_pmu_alias -> list */
@@ -27,7 +30,8 @@ int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr,
struct list_head *head_terms);
int perf_pmu__config_terms(struct list_head *formats,
struct perf_event_attr *attr,
- struct list_head *head_terms);
+ struct list_head *head_terms,
+ bool zero);
int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms,
const char **unit, double *scale);
struct list_head *perf_pmu__alias(struct perf_pmu *pmu,
@@ -46,4 +50,7 @@ void print_pmu_events(const char *event_glob, bool name_only);
bool pmu_have_event(const char *pname, const char *name);
int perf_pmu__test(void);
+
+struct perf_event_attr *perf_pmu__get_default_config(struct perf_pmu *pmu);
+
#endif /* __PMU_H */
--
1.8.3.2
next prev parent reply other threads:[~2014-08-15 19:11 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-15 19:08 [PATCH 00/24] perf tools: Still more preparation for Intel PT Adrian Hunter
2014-08-15 19:08 ` [PATCH 01/24] perf tools: Add a test for tracking with sched_switch Adrian Hunter
2014-08-20 19:48 ` Arnaldo Carvalho de Melo
2014-08-29 13:52 ` Adrian Hunter
2014-08-29 15:06 ` Arnaldo Carvalho de Melo
2014-08-29 15:18 ` Jiri Olsa
2014-08-29 18:38 ` Adrian Hunter
2014-08-21 16:58 ` Arnaldo Carvalho de Melo
2014-08-24 14:58 ` [tip:perf/core] perf tests: " tip-bot for Adrian Hunter
2014-08-15 19:08 ` [PATCH 02/24] perf scripting: Add 'flush' callback to scripting API Adrian Hunter
2014-08-24 14:58 ` [tip:perf/core] " tip-bot for Adrian Hunter
2014-08-15 19:08 ` [PATCH 03/24] perf tools: Rename machine__get_kernel_start_addr() Adrian Hunter
2014-08-24 14:58 ` [tip:perf/core] perf machine: Rename machine__get_kernel_start_addr() method tip-bot for Adrian Hunter
2014-08-15 19:08 ` [PATCH 04/24] perf tools: Add machine__kernel_ip() Adrian Hunter
2014-08-24 14:58 ` [tip:perf/core] " tip-bot for Adrian Hunter
2014-08-15 19:08 ` [PATCH 05/24] perf tools: Let a user specify a PMU event without any config terms Adrian Hunter
2014-09-19 5:20 ` [tip:perf/core] " tip-bot for Adrian Hunter
2014-08-15 19:08 ` Adrian Hunter [this message]
2014-08-15 19:08 ` [PATCH 07/24] perf tools: Add perf_pmu__scan_file() Adrian Hunter
2014-08-15 19:08 ` [PATCH 08/24] perf tools: Add id index Adrian Hunter
2014-08-15 19:08 ` [PATCH 09/24] perf pmu: Let pmu's with no events show up on perf list Adrian Hunter
2014-08-15 19:08 ` [PATCH 10/24] perf session: Add perf_session__deliver_synth_event() Adrian Hunter
2014-08-15 19:08 ` [PATCH 11/24] perf tools: Add a thread stack for synthesizing call chains Adrian Hunter
2014-08-15 19:08 ` [PATCH 12/24] perf tools: Add facility to export data in database-friendly way Adrian Hunter
2014-08-15 19:08 ` [PATCH 13/24] perf tools: Extend Python script interface to export data in a " Adrian Hunter
2014-08-15 19:08 ` [PATCH 14/24] perf tools: Add Python script to export to postgresql Adrian Hunter
2014-08-15 19:08 ` [PATCH 15/24] perf tools: Add branch type to db export Adrian Hunter
2014-08-15 19:08 ` [PATCH 16/24] perf tools: Add branch_type and in_tx to Python export Adrian Hunter
2014-08-15 19:08 ` [PATCH 17/24] perf tools: Enhance the thread stack to output call/return data Adrian Hunter
2014-08-15 19:08 ` [PATCH 18/24] perf tools: Add call information to the database export API Adrian Hunter
2014-08-15 19:08 ` [PATCH 19/24] perf tools: Add call information to Python export Adrian Hunter
2014-08-15 19:08 ` [PATCH 20/24] perf tools: Defer export of comms that were not 'set' Adrian Hunter
2014-08-15 19:08 ` [PATCH 21/24] perf tools: Add perf-with-kcore script Adrian Hunter
2014-08-15 19:08 ` [PATCH 22/24] perf tools: Build programs to copy 32-bit compatibility VDSOs Adrian Hunter
2014-09-15 15:47 ` Arnaldo Carvalho de Melo
2014-09-15 15:50 ` Arnaldo Carvalho de Melo
2014-09-16 6:59 ` Adrian Hunter
2014-09-17 14:52 ` Arnaldo Carvalho de Melo
2014-08-15 19:08 ` [PATCH 23/24] perf tools: Add support for " Adrian Hunter
2014-08-15 19:08 ` [PATCH 24/24] perf tools: Add feature checks to .gitignore Adrian Hunter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1408129739-17368-7-git-send-email-adrian.hunter@intel.com \
--to=adrian.hunter@intel.com \
--cc=acme@kernel.org \
--cc=dsahern@gmail.com \
--cc=eranian@google.com \
--cc=fweisbec@gmail.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=namhyung@gmail.com \
--cc=paulus@samba.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome