2023-04-19 12:32:29

by Yang Jihong

[permalink] [raw]
Subject: [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` symbol in perf_event_attr__fprintf()

Add printing perf_event_attr `config` and `id` symbol to improve the readability of debugging information.

Before:

# perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
<SNIP>
------------------------------------------------------------
perf_event_attr:
size 136
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
------------------------------------------------------------
perf_event_attr:
type 1
size 136
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
------------------------------------------------------------
perf_event_attr:
type 2
size 136
config 0x131
{ sample_period, sample_freq } 1
sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
read_format ID
disabled 1
inherit 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
------------------------------------------------------------
perf_event_attr:
type 3
size 136
config 0x10005
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
------------------------------------------------------------
perf_event_attr:
type 4
size 136
config 0x101
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
<SNIP>

After:

# perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
<SNIP>
------------------------------------------------------------
perf_event_attr:
type 0 (PERF_TYPE_HARDWARE)
size 136
config 0 (PERF_COUNT_HW_CPU_CYCLES)
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
------------------------------------------------------------
perf_event_attr:
type 1 (PERF_TYPE_SOFTWARE)
size 136
config 0 (PERF_COUNT_SW_CPU_CLOCK)
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
------------------------------------------------------------
perf_event_attr:
type 2 (PERF_TYPE_TRACEPOINT)
size 136
config 0x131 (sched:sched_switch)
{ sample_period, sample_freq } 1
sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
read_format ID
disabled 1
inherit 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
------------------------------------------------------------
perf_event_attr:
type 3 (PERF_TYPE_HW_CACHE)
size 136
config 0x10005 (PERF_COUNT_HW_CACHE_RESULT_MISS | PERF_COUNT_HW_CACHE_OP_READ | PERF_COUNT_HW_CACHE_BPU)
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
------------------------------------------------------------
perf_event_attr:
type 4 (PERF_TYPE_RAW)
size 136
config 0x101
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
<SNIP>

Yang Jihong (4):
perf trace-event-info: Add tracepoint_id_to_name() helper
perf tools: Extend PRINT_ATTRf to support printing of members with a
value of 0
perf tools: Add printing perf_event_attr->type symbol in
perf_event_attr__fprintf()
perf tools: Add printing perf_event_attr->config symbol in
perf_event_attr__fprintf()

tools/perf/util/perf_event_attr_fprintf.c | 169 ++++++++++++++++++++--
tools/perf/util/trace-event-info.c | 13 ++
tools/perf/util/trace-event.h | 6 +
3 files changed, 179 insertions(+), 9 deletions(-)

--
2.30.GIT


2023-04-19 12:32:49

by Yang Jihong

[permalink] [raw]
Subject: [PATCH 1/4] perf trace-event-info: Add tracepoint_id_to_name() helper

Add tracepoint_id_to_name() helper to search for the trace events directory
by given event id and return the corresponding tracepoint.

Signed-off-by: Yang Jihong <[email protected]>
---
tools/perf/util/trace-event-info.c | 13 +++++++++++++
tools/perf/util/trace-event.h | 6 ++++++
2 files changed, 19 insertions(+)

diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index c24b3a15e319..79907caaf0ca 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -466,6 +466,19 @@ static struct tracepoint_path *tracepoint_id_to_path(u64 config)
return NULL;
}

+char *tracepoint_id_to_name(u64 config)
+{
+ char buf[MAX_EVENT_LENGTH];
+ struct tracepoint_path *path = NULL;
+
+ path = tracepoint_id_to_path(config);
+ if (path == NULL)
+ return NULL;
+
+ snprintf(buf, sizeof(buf), "%s:%s", path->system, path->name);
+ return strdup(buf);
+}
+
static struct tracepoint_path *tracepoint_name_to_path(const char *name)
{
struct tracepoint_path *path = zalloc(sizeof(*path));
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
index a0cff184b1cd..a69ee29419f3 100644
--- a/tools/perf/util/trace-event.h
+++ b/tools/perf/util/trace-event.h
@@ -62,6 +62,12 @@ unsigned long long eval_flag(const char *flag);

int read_tracing_data(int fd, struct list_head *pattrs);

+/*
+ * Return the tracepoint name in the format "subsystem:event_name",
+ * callers should free the returned string.
+ */
+char *tracepoint_id_to_name(u64 config);
+
struct tracing_data {
/* size is only valid if temp is 'true' */
ssize_t size;
--
2.30.GIT

2023-04-19 12:33:00

by Yang Jihong

[permalink] [raw]
Subject: [PATCH 2/4] perf tools: Extend PRINT_ATTRf to support printing of members with a value of 0

When printing attr, members whose value is 0 will not be printed, we want
to print the case where attr->type is 0(PERF_TYPE_HARDWARE), add `_a`
param to PRINT_ATTRf macro to always print member when it is true
No functional change.

Signed-off-by: Yang Jihong <[email protected]>
---
tools/perf/util/perf_event_attr_fprintf.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/perf_event_attr_fprintf.c
index 7e5e7b30510d..433029c6afc5 100644
--- a/tools/perf/util/perf_event_attr_fprintf.c
+++ b/tools/perf/util/perf_event_attr_fprintf.c
@@ -80,15 +80,15 @@ static void __p_read_format(char *buf, size_t size, u64 value)
#define p_branch_sample_type(val) __p_branch_sample_type(buf, BUF_SIZE, val)
#define p_read_format(val) __p_read_format(buf, BUF_SIZE, val)

-#define PRINT_ATTRn(_n, _f, _p) \
+#define PRINT_ATTRn(_n, _f, _p, _a) \
do { \
- if (attr->_f) { \
+ if (_a || attr->_f) { \
_p(attr->_f); \
ret += attr__fprintf(fp, _n, buf, priv);\
} \
} while (0)

-#define PRINT_ATTRf(_f, _p) PRINT_ATTRn(#_f, _f, _p)
+#define PRINT_ATTRf(_f, _p) PRINT_ATTRn(#_f, _f, _p, false)

int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,
attr__fprintf_f attr__fprintf, void *priv)
@@ -99,7 +99,7 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,
PRINT_ATTRf(type, p_unsigned);
PRINT_ATTRf(size, p_unsigned);
PRINT_ATTRf(config, p_hex);
- PRINT_ATTRn("{ sample_period, sample_freq }", sample_period, p_unsigned);
+ PRINT_ATTRn("{ sample_period, sample_freq }", sample_period, p_unsigned, false);
PRINT_ATTRf(sample_type, p_sample_type);
PRINT_ATTRf(read_format, p_read_format);

@@ -141,10 +141,10 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,
PRINT_ATTRf(remove_on_exec, p_unsigned);
PRINT_ATTRf(sigtrap, p_unsigned);

- PRINT_ATTRn("{ wakeup_events, wakeup_watermark }", wakeup_events, p_unsigned);
+ PRINT_ATTRn("{ wakeup_events, wakeup_watermark }", wakeup_events, p_unsigned, false);
PRINT_ATTRf(bp_type, p_unsigned);
- PRINT_ATTRn("{ bp_addr, config1 }", bp_addr, p_hex);
- PRINT_ATTRn("{ bp_len, config2 }", bp_len, p_hex);
+ PRINT_ATTRn("{ bp_addr, config1 }", bp_addr, p_hex, false);
+ PRINT_ATTRn("{ bp_len, config2 }", bp_len, p_hex, false);
PRINT_ATTRf(branch_sample_type, p_branch_sample_type);
PRINT_ATTRf(sample_regs_user, p_hex);
PRINT_ATTRf(sample_stack_user, p_unsigned);
--
2.30.GIT

2023-04-19 12:33:55

by Yang Jihong

[permalink] [raw]
Subject: [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf()

When printing perf_event_attr, always display attr->type and its symbol
to improve the readability of debugging information.

Before:

# perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
<SNIP>
------------------------------------------------------------
perf_event_attr:
size 136
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
------------------------------------------------------------
perf_event_attr:
type 1
size 136
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
------------------------------------------------------------
perf_event_attr:
type 2
size 136
config 0x131
{ sample_period, sample_freq } 1
sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
read_format ID
disabled 1
inherit 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
------------------------------------------------------------
perf_event_attr:
type 3
size 136
config 0x10005
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
------------------------------------------------------------
perf_event_attr:
type 4
size 136
config 0x101
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
<SNIP>

After:

# perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
<SNIP>
------------------------------------------------------------
perf_event_attr:
type 0 (PERF_TYPE_HARDWARE)
size 136
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
------------------------------------------------------------
perf_event_attr:
type 1 (PERF_TYPE_SOFTWARE)
size 136
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
------------------------------------------------------------
perf_event_attr:
type 2 (PERF_TYPE_TRACEPOINT)
size 136
config 0x131
{ sample_period, sample_freq } 1
sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
read_format ID
disabled 1
inherit 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
------------------------------------------------------------
perf_event_attr:
type 3 (PERF_TYPE_HW_CACHE)
size 136
config 0x10005
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
------------------------------------------------------------
perf_event_attr:
type 4 (PERF_TYPE_RAW)
size 136
config 0x101
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
<SNIP>

Signed-off-by: Yang Jihong <[email protected]>
---
tools/perf/util/perf_event_attr_fprintf.c | 24 ++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/perf_event_attr_fprintf.c
index 433029c6afc5..d9d70126d505 100644
--- a/tools/perf/util/perf_event_attr_fprintf.c
+++ b/tools/perf/util/perf_event_attr_fprintf.c
@@ -71,6 +71,27 @@ static void __p_read_format(char *buf, size_t size, u64 value)
__p_bits(buf, size, value, bits);
}

+static void __p_type_id(char *buf, size_t size, u64 value)
+{
+ /* sync with enum perf_type_id in perf_event.h */
+ switch (value) {
+#define PRINT_ENUM_PERF_TYPE_ID_CASE(x) \
+ case x: \
+ snprintf(buf, size, "%"PRIu64" (%s)", value, #x); \
+ return;
+ PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_HARDWARE)
+ PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_SOFTWARE)
+ PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_TRACEPOINT)
+ PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_HW_CACHE)
+ PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_RAW)
+ PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_BREAKPOINT)
+#undef PRINT_ENUM_PERF_TYPE_ID_CASE
+ default:
+ snprintf(buf, size, "%"PRIu64, value);
+ return;
+ }
+}
+
#define BUF_SIZE 1024

#define p_hex(val) snprintf(buf, BUF_SIZE, "%#"PRIx64, (uint64_t)(val))
@@ -79,6 +100,7 @@ static void __p_read_format(char *buf, size_t size, u64 value)
#define p_sample_type(val) __p_sample_type(buf, BUF_SIZE, val)
#define p_branch_sample_type(val) __p_branch_sample_type(buf, BUF_SIZE, val)
#define p_read_format(val) __p_read_format(buf, BUF_SIZE, val)
+#define p_type_id(val) __p_type_id(buf, BUF_SIZE, val)

#define PRINT_ATTRn(_n, _f, _p, _a) \
do { \
@@ -96,7 +118,7 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,
char buf[BUF_SIZE];
int ret = 0;

- PRINT_ATTRf(type, p_unsigned);
+ PRINT_ATTRn("type", type, p_type_id, true);
PRINT_ATTRf(size, p_unsigned);
PRINT_ATTRf(config, p_hex);
PRINT_ATTRn("{ sample_period, sample_freq }", sample_period, p_unsigned, false);
--
2.30.GIT

2023-04-19 12:50:05

by Yang Jihong

[permalink] [raw]
Subject: [PATCH 4/4] perf tools: Add printing perf_event_attr->config symbol in perf_event_attr__fprintf()

When printing perf_event_attr, always display attr->config and its symbol
to improve the readability of debugging information.

Before:

# perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
<SNIP>
------------------------------------------------------------
perf_event_attr:
size 136
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
------------------------------------------------------------
perf_event_attr:
type 1
size 136
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
------------------------------------------------------------
perf_event_attr:
type 2
size 136
config 0x131
{ sample_period, sample_freq } 1
sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
read_format ID
disabled 1
inherit 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
------------------------------------------------------------
perf_event_attr:
type 3
size 136
config 0x10005
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
------------------------------------------------------------
perf_event_attr:
type 4
size 136
config 0x101
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
<SNIP>

After:

# perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
<SNIP>
------------------------------------------------------------
perf_event_attr:
type 0 (PERF_TYPE_HARDWARE)
size 136
config 0 (PERF_COUNT_HW_CPU_CYCLES)
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
------------------------------------------------------------
perf_event_attr:
type 1 (PERF_TYPE_SOFTWARE)
size 136
config 0 (PERF_COUNT_SW_CPU_CLOCK)
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
------------------------------------------------------------
perf_event_attr:
type 2 (PERF_TYPE_TRACEPOINT)
size 136
config 0x131 (sched:sched_switch)
{ sample_period, sample_freq } 1
sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
read_format ID
disabled 1
inherit 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
------------------------------------------------------------
perf_event_attr:
type 3 (PERF_TYPE_HW_CACHE)
size 136
config 0x10005 (PERF_COUNT_HW_CACHE_RESULT_MISS | PERF_COUNT_HW_CACHE_OP_READ | PERF_COUNT_HW_CACHE_BPU)
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
------------------------------------------------------------
perf_event_attr:
type 4 (PERF_TYPE_RAW)
size 136
config 0x101
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
read_format ID
disabled 1
inherit 1
freq 1
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
<SNIP>

Signed-off-by: Yang Jihong <[email protected]>
---
tools/perf/util/perf_event_attr_fprintf.c | 131 +++++++++++++++++++++-
1 file changed, 130 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/perf_event_attr_fprintf.c
index d9d70126d505..e2ce4a737ef7 100644
--- a/tools/perf/util/perf_event_attr_fprintf.c
+++ b/tools/perf/util/perf_event_attr_fprintf.c
@@ -7,6 +7,11 @@
#include <linux/perf_event.h>
#include "util/evsel_fprintf.h"

+#ifdef HAVE_LIBTRACEEVENT
+#include <stdlib.h>
+#include "trace-event.h"
+#endif
+
struct bit_names {
int bit;
const char *name;
@@ -92,6 +97,129 @@ static void __p_type_id(char *buf, size_t size, u64 value)
}
}

+static void __p_config_hw_cache_id(char *buf, size_t size, u64 value)
+{
+ const char *hw_cache_str, *hw_cache_op_str, *hw_cache_op_result_str;
+
+#define ENUM_PERF_HW_CACHE_ID_CASE(x, s) case x: s = (#x); break;
+#define ENUM_PERF_HW_CACHE_ID_CASE_DEFAULT(s) default: s = NULL; break;
+
+ /* sync with enum perf_hw_cache_id in perf_event.h */
+ switch (value & 0xff) {
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_L1D, hw_cache_str)
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_L1I, hw_cache_str)
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_LL, hw_cache_str)
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_DTLB, hw_cache_str)
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_ITLB, hw_cache_str)
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_BPU, hw_cache_str)
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_NODE, hw_cache_str)
+ ENUM_PERF_HW_CACHE_ID_CASE_DEFAULT(hw_cache_str)
+ }
+
+ /* sync with enum perf_hw_cache_op_id in perf_event.h */
+ switch ((value & 0xff00) >> 8) {
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_OP_READ, hw_cache_op_str)
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_OP_WRITE, hw_cache_op_str)
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_OP_PREFETCH, hw_cache_op_str)
+ ENUM_PERF_HW_CACHE_ID_CASE_DEFAULT(hw_cache_op_str)
+ }
+
+ /* sync with enum perf_hw_cache_op_result_id in perf_event.h */
+ switch ((value & 0xff0000) >> 16) {
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_RESULT_ACCESS, hw_cache_op_result_str)
+ ENUM_PERF_HW_CACHE_ID_CASE(PERF_COUNT_HW_CACHE_RESULT_MISS, hw_cache_op_result_str)
+ ENUM_PERF_HW_CACHE_ID_CASE_DEFAULT(hw_cache_op_result_str)
+ }
+
+#undef ENUM_PERF_HW_CACHE_ID_CASE
+#undef ENUM_PERF_HW_CACHE_ID_CASE_DEFULT
+
+ if (hw_cache_str == NULL || hw_cache_op_str == NULL ||
+ hw_cache_op_result_str == NULL) {
+ snprintf(buf, size, "%#"PRIx64, value);
+ } else {
+ snprintf(buf, size, "%#"PRIx64" (%s | %s | %s)", value,
+ hw_cache_op_result_str, hw_cache_op_str, hw_cache_str);
+ }
+}
+
+#ifdef HAVE_LIBTRACEEVENT
+static void __p_config_tracepoint_id(char *buf, size_t size, u64 value)
+{
+ char *name = tracepoint_id_to_name(value);
+
+ if (name != NULL) {
+ snprintf(buf, size, "%#"PRIx64" (%s)", value, name);
+ free(name);
+ } else {
+ snprintf(buf, size, "%#"PRIx64, value);
+ }
+}
+#endif
+
+static void __p_config_id(char *buf, size_t size, u32 type, u64 value)
+{
+#define PRINT_ENUM_PERF_CONFIG_ID_CASE(x) \
+ case x: \
+ snprintf(buf, size, "%#"PRIx64" (%s)", value, #x); \
+ return;
+
+#define PRINT_ENUM_PERF_CONFIG_ID_DEFAULT_CASE \
+ default: \
+ snprintf(buf, size, "%#"PRIx64, value); \
+ return;
+
+ switch (type) {
+ case PERF_TYPE_HARDWARE:
+ /* sync with enum perf_hw_cache_id in perf_event.h */
+ switch (value & PERF_HW_EVENT_MASK) {
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_HW_CPU_CYCLES)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_HW_INSTRUCTIONS)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_HW_CACHE_REFERENCES)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_HW_CACHE_MISSES)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_HW_BRANCH_INSTRUCTIONS)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_HW_BRANCH_MISSES)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_HW_BUS_CYCLES)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_HW_STALLED_CYCLES_FRONTEND)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_HW_STALLED_CYCLES_BACKEND)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_HW_REF_CPU_CYCLES)
+ PRINT_ENUM_PERF_CONFIG_ID_DEFAULT_CASE
+ }
+
+ case PERF_TYPE_SOFTWARE:
+ /* sync with enum perf_sw_ids in perf_event.h */
+ switch (value) {
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_CPU_CLOCK)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_TASK_CLOCK)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_PAGE_FAULTS)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_CONTEXT_SWITCHES)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_CPU_MIGRATIONS)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_PAGE_FAULTS_MIN)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_PAGE_FAULTS_MAJ)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_ALIGNMENT_FAULTS)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_EMULATION_FAULTS)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_DUMMY)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_BPF_OUTPUT)
+ PRINT_ENUM_PERF_CONFIG_ID_CASE(PERF_COUNT_SW_CGROUP_SWITCHES)
+ PRINT_ENUM_PERF_CONFIG_ID_DEFAULT_CASE
+ }
+#undef PRINT_ENUM_PERF_CONFIG_ID_CASE
+
+ case PERF_TYPE_HW_CACHE:
+ return __p_config_hw_cache_id(buf, size, value);
+
+ case PERF_TYPE_TRACEPOINT:
+#ifdef HAVE_LIBTRACEEVENT
+ return __p_config_tracepoint_id(buf, size, value);
+#endif
+ case PERF_TYPE_RAW:
+ case PERF_TYPE_BREAKPOINT:
+ PRINT_ENUM_PERF_CONFIG_ID_DEFAULT_CASE
+ }
+
+#undef PRINT_ENUM_PERF_CONFIG_ID_DEFAULT_CASE
+}
+
#define BUF_SIZE 1024

#define p_hex(val) snprintf(buf, BUF_SIZE, "%#"PRIx64, (uint64_t)(val))
@@ -101,6 +229,7 @@ static void __p_type_id(char *buf, size_t size, u64 value)
#define p_branch_sample_type(val) __p_branch_sample_type(buf, BUF_SIZE, val)
#define p_read_format(val) __p_read_format(buf, BUF_SIZE, val)
#define p_type_id(val) __p_type_id(buf, BUF_SIZE, val)
+#define p_config_id(val) __p_config_id(buf, BUF_SIZE, attr->type, val)

#define PRINT_ATTRn(_n, _f, _p, _a) \
do { \
@@ -120,7 +249,7 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,

PRINT_ATTRn("type", type, p_type_id, true);
PRINT_ATTRf(size, p_unsigned);
- PRINT_ATTRf(config, p_hex);
+ PRINT_ATTRn("config", config, p_config_id, true);
PRINT_ATTRn("{ sample_period, sample_freq }", sample_period, p_unsigned, false);
PRINT_ATTRf(sample_type, p_sample_type);
PRINT_ATTRf(read_format, p_read_format);
--
2.30.GIT

2023-05-10 07:42:43

by Yang Jihong

[permalink] [raw]
Subject: Re: [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` symbol in perf_event_attr__fprintf()

Hello,

PING.

Thanks,
Yang.

On 2023/4/19 20:29, Yang Jihong wrote:
> Add printing perf_event_attr `config` and `id` symbol to improve the readability of debugging information.
>
> Before:
>
> # perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
> <SNIP>
> ------------------------------------------------------------
> perf_event_attr:
> size 136
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
> ------------------------------------------------------------
> perf_event_attr:
> type 1
> size 136
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
> ------------------------------------------------------------
> perf_event_attr:
> type 2
> size 136
> config 0x131
> { sample_period, sample_freq } 1
> sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
> ------------------------------------------------------------
> perf_event_attr:
> type 3
> size 136
> config 0x10005
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
> ------------------------------------------------------------
> perf_event_attr:
> type 4
> size 136
> config 0x101
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
> <SNIP>
>
> After:
>
> # perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
> <SNIP>
> ------------------------------------------------------------
> perf_event_attr:
> type 0 (PERF_TYPE_HARDWARE)
> size 136
> config 0 (PERF_COUNT_HW_CPU_CYCLES)
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
> ------------------------------------------------------------
> perf_event_attr:
> type 1 (PERF_TYPE_SOFTWARE)
> size 136
> config 0 (PERF_COUNT_SW_CPU_CLOCK)
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
> ------------------------------------------------------------
> perf_event_attr:
> type 2 (PERF_TYPE_TRACEPOINT)
> size 136
> config 0x131 (sched:sched_switch)
> { sample_period, sample_freq } 1
> sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
> ------------------------------------------------------------
> perf_event_attr:
> type 3 (PERF_TYPE_HW_CACHE)
> size 136
> config 0x10005 (PERF_COUNT_HW_CACHE_RESULT_MISS | PERF_COUNT_HW_CACHE_OP_READ | PERF_COUNT_HW_CACHE_BPU)
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
> ------------------------------------------------------------
> perf_event_attr:
> type 4 (PERF_TYPE_RAW)
> size 136
> config 0x101
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
> <SNIP>
>
> Yang Jihong (4):
> perf trace-event-info: Add tracepoint_id_to_name() helper
> perf tools: Extend PRINT_ATTRf to support printing of members with a
> value of 0
> perf tools: Add printing perf_event_attr->type symbol in
> perf_event_attr__fprintf()
> perf tools: Add printing perf_event_attr->config symbol in
> perf_event_attr__fprintf()
>
> tools/perf/util/perf_event_attr_fprintf.c | 169 ++++++++++++++++++++--
> tools/perf/util/trace-event-info.c | 13 ++
> tools/perf/util/trace-event.h | 6 +
> 3 files changed, 179 insertions(+), 9 deletions(-)
>

2023-05-10 08:12:38

by Adrian Hunter

[permalink] [raw]
Subject: Re: [PATCH 1/4] perf trace-event-info: Add tracepoint_id_to_name() helper

On 19/04/23 15:29, Yang Jihong wrote:
> Add tracepoint_id_to_name() helper to search for the trace events directory
> by given event id and return the corresponding tracepoint.
>
> Signed-off-by: Yang Jihong <[email protected]>
> ---
> tools/perf/util/trace-event-info.c | 13 +++++++++++++
> tools/perf/util/trace-event.h | 6 ++++++
> 2 files changed, 19 insertions(+)
>
> diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
> index c24b3a15e319..79907caaf0ca 100644
> --- a/tools/perf/util/trace-event-info.c
> +++ b/tools/perf/util/trace-event-info.c
> @@ -466,6 +466,19 @@ static struct tracepoint_path *tracepoint_id_to_path(u64 config)
> return NULL;
> }
>
> +char *tracepoint_id_to_name(u64 config)
> +{
> + char buf[MAX_EVENT_LENGTH];
> + struct tracepoint_path *path = NULL;

Initializer should be tracepoint_id_to_path(config) i.e.

struct tracepoint_path *path = tracepoint_id_to_path(config);

> +
> + path = tracepoint_id_to_path(config);
> + if (path == NULL)
> + return NULL;
> +
> + snprintf(buf, sizeof(buf), "%s:%s", path->system, path->name);

asprintf() can be used then buf and strdup() are not needed.

> + return strdup(buf);
> +}
> +
> static struct tracepoint_path *tracepoint_name_to_path(const char *name)
> {
> struct tracepoint_path *path = zalloc(sizeof(*path));
> diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h
> index a0cff184b1cd..a69ee29419f3 100644
> --- a/tools/perf/util/trace-event.h
> +++ b/tools/perf/util/trace-event.h
> @@ -62,6 +62,12 @@ unsigned long long eval_flag(const char *flag);
>
> int read_tracing_data(int fd, struct list_head *pattrs);
>
> +/*
> + * Return the tracepoint name in the format "subsystem:event_name",
> + * callers should free the returned string.
> + */
> +char *tracepoint_id_to_name(u64 config);
> +
> struct tracing_data {
> /* size is only valid if temp is 'true' */
> ssize_t size;


2023-05-10 08:29:51

by Yang Jihong

[permalink] [raw]
Subject: Re: [PATCH 1/4] perf trace-event-info: Add tracepoint_id_to_name() helper

Hello,

On 2023/5/10 15:48, Adrian Hunter wrote:
> On 19/04/23 15:29, Yang Jihong wrote:
>> Add tracepoint_id_to_name() helper to search for the trace events directory
>> by given event id and return the corresponding tracepoint.
>>
>> Signed-off-by: Yang Jihong <[email protected]>
>> ---
>> tools/perf/util/trace-event-info.c | 13 +++++++++++++
>> tools/perf/util/trace-event.h | 6 ++++++
>> 2 files changed, 19 insertions(+)
>>
>> diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
>> index c24b3a15e319..79907caaf0ca 100644
>> --- a/tools/perf/util/trace-event-info.c
>> +++ b/tools/perf/util/trace-event-info.c
>> @@ -466,6 +466,19 @@ static struct tracepoint_path *tracepoint_id_to_path(u64 config)
>> return NULL;
>> }
>>
>> +char *tracepoint_id_to_name(u64 config)
>> +{
>> + char buf[MAX_EVENT_LENGTH];
>> + struct tracepoint_path *path = NULL;
>
> Initializer should be tracepoint_id_to_path(config) i.e.
>
OK, will fix in next version.

> struct tracepoint_path *path = tracepoint_id_to_path(config);
>
>> +
>> + path = tracepoint_id_to_path(config);
>> + if (path == NULL)
>> + return NULL;
>> +
>> + snprintf(buf, sizeof(buf), "%s:%s", path->system, path->name);
>
> asprintf() can be used then buf and strdup() are not needed.
>
OK, will fix in next version.

Thanks for correcting.

Thanks,
Yang

2023-05-10 08:43:43

by Adrian Hunter

[permalink] [raw]
Subject: Re: [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf()

On 19/04/23 15:29, Yang Jihong wrote:
> When printing perf_event_attr, always display attr->type and its symbol
> to improve the readability of debugging information.
>
> Before:
>
> # perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
> <SNIP>
> ------------------------------------------------------------
> perf_event_attr:
> size 136
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
> ------------------------------------------------------------
> perf_event_attr:
> type 1
> size 136
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
> ------------------------------------------------------------
> perf_event_attr:
> type 2
> size 136
> config 0x131
> { sample_period, sample_freq } 1
> sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
> ------------------------------------------------------------
> perf_event_attr:
> type 3
> size 136
> config 0x10005
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
> ------------------------------------------------------------
> perf_event_attr:
> type 4
> size 136
> config 0x101
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
> <SNIP>
>
> After:
>
> # perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
> <SNIP>
> ------------------------------------------------------------
> perf_event_attr:
> type 0 (PERF_TYPE_HARDWARE)
> size 136
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
> ------------------------------------------------------------
> perf_event_attr:
> type 1 (PERF_TYPE_SOFTWARE)
> size 136
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
> ------------------------------------------------------------
> perf_event_attr:
> type 2 (PERF_TYPE_TRACEPOINT)
> size 136
> config 0x131
> { sample_period, sample_freq } 1
> sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
> ------------------------------------------------------------
> perf_event_attr:
> type 3 (PERF_TYPE_HW_CACHE)
> size 136
> config 0x10005
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
> ------------------------------------------------------------
> perf_event_attr:
> type 4 (PERF_TYPE_RAW)
> size 136
> config 0x101
> { sample_period, sample_freq } 4000
> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
> read_format ID
> disabled 1
> inherit 1
> freq 1
> sample_id_all 1
> exclude_guest 1
> ------------------------------------------------------------
> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
> <SNIP>
>
> Signed-off-by: Yang Jihong <[email protected]>
> ---
> tools/perf/util/perf_event_attr_fprintf.c | 24 ++++++++++++++++++++++-
> 1 file changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/perf_event_attr_fprintf.c
> index 433029c6afc5..d9d70126d505 100644
> --- a/tools/perf/util/perf_event_attr_fprintf.c
> +++ b/tools/perf/util/perf_event_attr_fprintf.c
> @@ -71,6 +71,27 @@ static void __p_read_format(char *buf, size_t size, u64 value)
> __p_bits(buf, size, value, bits);
> }
>
> +static void __p_type_id(char *buf, size_t size, u64 value)
> +{
> + /* sync with enum perf_type_id in perf_event.h */
> + switch (value) {
> +#define PRINT_ENUM_PERF_TYPE_ID_CASE(x) \
> + case x: \
> + snprintf(buf, size, "%"PRIu64" (%s)", value, #x); \
> + return;
> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_HARDWARE)
> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_SOFTWARE)
> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_TRACEPOINT)
> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_HW_CACHE)
> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_RAW)
> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_BREAKPOINT)
> +#undef PRINT_ENUM_PERF_TYPE_ID_CASE

These are ABI constants so maybe simpler:

const char *fixed_types[] = {"HARDWARE", "SOFTWARE", "TRACEPOINT",
"HW_CACHE", "RAW", "BREAKPOINT"};

if (value < ARRAY_SIZE(fixed_types)) {
snprintf(buf, size, "%"PRIu64" (PERF_TYPE_%s)",
value, fixed_types[value]);
} else {
snprintf(buf, size, "%"PRIu64, value);
}

> + default:
> + snprintf(buf, size, "%"PRIu64, value);
> + return;
> + }
> +}
> +
> #define BUF_SIZE 1024
>
> #define p_hex(val) snprintf(buf, BUF_SIZE, "%#"PRIx64, (uint64_t)(val))
> @@ -79,6 +100,7 @@ static void __p_read_format(char *buf, size_t size, u64 value)
> #define p_sample_type(val) __p_sample_type(buf, BUF_SIZE, val)
> #define p_branch_sample_type(val) __p_branch_sample_type(buf, BUF_SIZE, val)
> #define p_read_format(val) __p_read_format(buf, BUF_SIZE, val)
> +#define p_type_id(val) __p_type_id(buf, BUF_SIZE, val)
>
> #define PRINT_ATTRn(_n, _f, _p, _a) \
> do { \
> @@ -96,7 +118,7 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,
> char buf[BUF_SIZE];
> int ret = 0;
>
> - PRINT_ATTRf(type, p_unsigned);
> + PRINT_ATTRn("type", type, p_type_id, true);
> PRINT_ATTRf(size, p_unsigned);
> PRINT_ATTRf(config, p_hex);
> PRINT_ATTRn("{ sample_period, sample_freq }", sample_period, p_unsigned, false);


2023-05-10 16:05:16

by Adrian Hunter

[permalink] [raw]
Subject: Re: [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf()

On 10/05/23 11:32, Adrian Hunter wrote:
> On 19/04/23 15:29, Yang Jihong wrote:
>> When printing perf_event_attr, always display attr->type and its symbol
>> to improve the readability of debugging information.
>>
>> Before:
>>
>> # perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
>> <SNIP>
>> ------------------------------------------------------------
>> perf_event_attr:
>> size 136
>> { sample_period, sample_freq } 4000
>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>> read_format ID
>> disabled 1
>> inherit 1
>> freq 1
>> sample_id_all 1
>> exclude_guest 1
>> ------------------------------------------------------------
>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
>> ------------------------------------------------------------
>> perf_event_attr:
>> type 1
>> size 136
>> { sample_period, sample_freq } 4000
>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>> read_format ID
>> disabled 1
>> inherit 1
>> freq 1
>> sample_id_all 1
>> exclude_guest 1
>> ------------------------------------------------------------
>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
>> ------------------------------------------------------------
>> perf_event_attr:
>> type 2
>> size 136
>> config 0x131
>> { sample_period, sample_freq } 1
>> sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
>> read_format ID
>> disabled 1
>> inherit 1
>> sample_id_all 1
>> exclude_guest 1
>> ------------------------------------------------------------
>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
>> ------------------------------------------------------------
>> perf_event_attr:
>> type 3
>> size 136
>> config 0x10005
>> { sample_period, sample_freq } 4000
>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>> read_format ID
>> disabled 1
>> inherit 1
>> freq 1
>> sample_id_all 1
>> exclude_guest 1
>> ------------------------------------------------------------
>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
>> ------------------------------------------------------------
>> perf_event_attr:
>> type 4
>> size 136
>> config 0x101
>> { sample_period, sample_freq } 4000
>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>> read_format ID
>> disabled 1
>> inherit 1
>> freq 1
>> sample_id_all 1
>> exclude_guest 1
>> ------------------------------------------------------------
>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
>> <SNIP>
>>
>> After:
>>
>> # perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
>> <SNIP>
>> ------------------------------------------------------------
>> perf_event_attr:
>> type 0 (PERF_TYPE_HARDWARE)
>> size 136
>> { sample_period, sample_freq } 4000
>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>> read_format ID
>> disabled 1
>> inherit 1
>> freq 1
>> sample_id_all 1
>> exclude_guest 1
>> ------------------------------------------------------------
>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
>> ------------------------------------------------------------
>> perf_event_attr:
>> type 1 (PERF_TYPE_SOFTWARE)
>> size 136
>> { sample_period, sample_freq } 4000
>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>> read_format ID
>> disabled 1
>> inherit 1
>> freq 1
>> sample_id_all 1
>> exclude_guest 1
>> ------------------------------------------------------------
>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
>> ------------------------------------------------------------
>> perf_event_attr:
>> type 2 (PERF_TYPE_TRACEPOINT)
>> size 136
>> config 0x131
>> { sample_period, sample_freq } 1
>> sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
>> read_format ID
>> disabled 1
>> inherit 1
>> sample_id_all 1
>> exclude_guest 1
>> ------------------------------------------------------------
>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
>> ------------------------------------------------------------
>> perf_event_attr:
>> type 3 (PERF_TYPE_HW_CACHE)
>> size 136
>> config 0x10005
>> { sample_period, sample_freq } 4000
>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>> read_format ID
>> disabled 1
>> inherit 1
>> freq 1
>> sample_id_all 1
>> exclude_guest 1
>> ------------------------------------------------------------
>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
>> ------------------------------------------------------------
>> perf_event_attr:
>> type 4 (PERF_TYPE_RAW)
>> size 136
>> config 0x101
>> { sample_period, sample_freq } 4000
>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>> read_format ID
>> disabled 1
>> inherit 1
>> freq 1
>> sample_id_all 1
>> exclude_guest 1
>> ------------------------------------------------------------
>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
>> <SNIP>
>>
>> Signed-off-by: Yang Jihong <[email protected]>
>> ---
>> tools/perf/util/perf_event_attr_fprintf.c | 24 ++++++++++++++++++++++-
>> 1 file changed, 23 insertions(+), 1 deletion(-)
>>
>> diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/perf_event_attr_fprintf.c
>> index 433029c6afc5..d9d70126d505 100644
>> --- a/tools/perf/util/perf_event_attr_fprintf.c
>> +++ b/tools/perf/util/perf_event_attr_fprintf.c
>> @@ -71,6 +71,27 @@ static void __p_read_format(char *buf, size_t size, u64 value)
>> __p_bits(buf, size, value, bits);
>> }
>>
>> +static void __p_type_id(char *buf, size_t size, u64 value)
>> +{
>> + /* sync with enum perf_type_id in perf_event.h */
>> + switch (value) {
>> +#define PRINT_ENUM_PERF_TYPE_ID_CASE(x) \
>> + case x: \
>> + snprintf(buf, size, "%"PRIu64" (%s)", value, #x); \
>> + return;
>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_HARDWARE)
>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_SOFTWARE)
>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_TRACEPOINT)
>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_HW_CACHE)
>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_RAW)
>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_BREAKPOINT)
>> +#undef PRINT_ENUM_PERF_TYPE_ID_CASE
>
> These are ABI constants so maybe simpler:
>
> const char *fixed_types[] = {"HARDWARE", "SOFTWARE", "TRACEPOINT",
> "HW_CACHE", "RAW", "BREAKPOINT"};
>
> if (value < ARRAY_SIZE(fixed_types)) {
> snprintf(buf, size, "%"PRIu64" (PERF_TYPE_%s)",
> value, fixed_types[value]);
> } else {
> snprintf(buf, size, "%"PRIu64, value);
> }

Although it is really the repeated snprintf that seems unnecessary
so maybe use a switch but just to get the stringified name.

>
>> + default:
>> + snprintf(buf, size, "%"PRIu64, value);
>> + return;
>> + }
>> +}
>> +
>> #define BUF_SIZE 1024
>>
>> #define p_hex(val) snprintf(buf, BUF_SIZE, "%#"PRIx64, (uint64_t)(val))
>> @@ -79,6 +100,7 @@ static void __p_read_format(char *buf, size_t size, u64 value)
>> #define p_sample_type(val) __p_sample_type(buf, BUF_SIZE, val)
>> #define p_branch_sample_type(val) __p_branch_sample_type(buf, BUF_SIZE, val)
>> #define p_read_format(val) __p_read_format(buf, BUF_SIZE, val)
>> +#define p_type_id(val) __p_type_id(buf, BUF_SIZE, val)
>>
>> #define PRINT_ATTRn(_n, _f, _p, _a) \
>> do { \
>> @@ -96,7 +118,7 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,
>> char buf[BUF_SIZE];
>> int ret = 0;
>>
>> - PRINT_ATTRf(type, p_unsigned);
>> + PRINT_ATTRn("type", type, p_type_id, true);
>> PRINT_ATTRf(size, p_unsigned);
>> PRINT_ATTRf(config, p_hex);
>> PRINT_ATTRn("{ sample_period, sample_freq }", sample_period, p_unsigned, false);
>


2023-05-11 08:06:19

by Yang Jihong

[permalink] [raw]
Subject: Re: [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf()

Hello,

On 2023/5/10 23:51, Adrian Hunter wrote:
> On 10/05/23 11:32, Adrian Hunter wrote:
>> On 19/04/23 15:29, Yang Jihong wrote:
>>> When printing perf_event_attr, always display attr->type and its symbol
>>> to improve the readability of debugging information.
>>>
>>> Before:
>>>
>>> # perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
>>> <SNIP>
>>> ------------------------------------------------------------
>>> perf_event_attr:
>>> size 136
>>> { sample_period, sample_freq } 4000
>>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>>> read_format ID
>>> disabled 1
>>> inherit 1
>>> freq 1
>>> sample_id_all 1
>>> exclude_guest 1
>>> ------------------------------------------------------------
>>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
>>> ------------------------------------------------------------
>>> perf_event_attr:
>>> type 1
>>> size 136
>>> { sample_period, sample_freq } 4000
>>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>>> read_format ID
>>> disabled 1
>>> inherit 1
>>> freq 1
>>> sample_id_all 1
>>> exclude_guest 1
>>> ------------------------------------------------------------
>>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
>>> ------------------------------------------------------------
>>> perf_event_attr:
>>> type 2
>>> size 136
>>> config 0x131
>>> { sample_period, sample_freq } 1
>>> sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
>>> read_format ID
>>> disabled 1
>>> inherit 1
>>> sample_id_all 1
>>> exclude_guest 1
>>> ------------------------------------------------------------
>>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
>>> ------------------------------------------------------------
>>> perf_event_attr:
>>> type 3
>>> size 136
>>> config 0x10005
>>> { sample_period, sample_freq } 4000
>>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>>> read_format ID
>>> disabled 1
>>> inherit 1
>>> freq 1
>>> sample_id_all 1
>>> exclude_guest 1
>>> ------------------------------------------------------------
>>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
>>> ------------------------------------------------------------
>>> perf_event_attr:
>>> type 4
>>> size 136
>>> config 0x101
>>> { sample_period, sample_freq } 4000
>>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>>> read_format ID
>>> disabled 1
>>> inherit 1
>>> freq 1
>>> sample_id_all 1
>>> exclude_guest 1
>>> ------------------------------------------------------------
>>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
>>> <SNIP>
>>>
>>> After:
>>>
>>> # perf --debug verbose=2 record -e cycles,cpu-clock,sched:sched_switch,branch-load-misses,r101 -C 0 true
>>> <SNIP>
>>> ------------------------------------------------------------
>>> perf_event_attr:
>>> type 0 (PERF_TYPE_HARDWARE)
>>> size 136
>>> { sample_period, sample_freq } 4000
>>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>>> read_format ID
>>> disabled 1
>>> inherit 1
>>> freq 1
>>> sample_id_all 1
>>> exclude_guest 1
>>> ------------------------------------------------------------
>>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 6
>>> ------------------------------------------------------------
>>> perf_event_attr:
>>> type 1 (PERF_TYPE_SOFTWARE)
>>> size 136
>>> { sample_period, sample_freq } 4000
>>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>>> read_format ID
>>> disabled 1
>>> inherit 1
>>> freq 1
>>> sample_id_all 1
>>> exclude_guest 1
>>> ------------------------------------------------------------
>>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 7
>>> ------------------------------------------------------------
>>> perf_event_attr:
>>> type 2 (PERF_TYPE_TRACEPOINT)
>>> size 136
>>> config 0x131
>>> { sample_period, sample_freq } 1
>>> sample_type IP|TID|TIME|CPU|PERIOD|RAW|IDENTIFIER
>>> read_format ID
>>> disabled 1
>>> inherit 1
>>> sample_id_all 1
>>> exclude_guest 1
>>> ------------------------------------------------------------
>>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 8
>>> ------------------------------------------------------------
>>> perf_event_attr:
>>> type 3 (PERF_TYPE_HW_CACHE)
>>> size 136
>>> config 0x10005
>>> { sample_period, sample_freq } 4000
>>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>>> read_format ID
>>> disabled 1
>>> inherit 1
>>> freq 1
>>> sample_id_all 1
>>> exclude_guest 1
>>> ------------------------------------------------------------
>>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 10
>>> ------------------------------------------------------------
>>> perf_event_attr:
>>> type 4 (PERF_TYPE_RAW)
>>> size 136
>>> config 0x101
>>> { sample_period, sample_freq } 4000
>>> sample_type IP|TID|TIME|CPU|PERIOD|IDENTIFIER
>>> read_format ID
>>> disabled 1
>>> inherit 1
>>> freq 1
>>> sample_id_all 1
>>> exclude_guest 1
>>> ------------------------------------------------------------
>>> sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 11
>>> <SNIP>
>>>
>>> Signed-off-by: Yang Jihong <[email protected]>
>>> ---
>>> tools/perf/util/perf_event_attr_fprintf.c | 24 ++++++++++++++++++++++-
>>> 1 file changed, 23 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/perf_event_attr_fprintf.c
>>> index 433029c6afc5..d9d70126d505 100644
>>> --- a/tools/perf/util/perf_event_attr_fprintf.c
>>> +++ b/tools/perf/util/perf_event_attr_fprintf.c
>>> @@ -71,6 +71,27 @@ static void __p_read_format(char *buf, size_t size, u64 value)
>>> __p_bits(buf, size, value, bits);
>>> }
>>>
>>> +static void __p_type_id(char *buf, size_t size, u64 value)
>>> +{
>>> + /* sync with enum perf_type_id in perf_event.h */
>>> + switch (value) {
>>> +#define PRINT_ENUM_PERF_TYPE_ID_CASE(x) \
>>> + case x: \
>>> + snprintf(buf, size, "%"PRIu64" (%s)", value, #x); \
>>> + return;
>>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_HARDWARE)
>>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_SOFTWARE)
>>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_TRACEPOINT)
>>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_HW_CACHE)
>>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_RAW)
>>> + PRINT_ENUM_PERF_TYPE_ID_CASE(PERF_TYPE_BREAKPOINT)
>>> +#undef PRINT_ENUM_PERF_TYPE_ID_CASE
>>
>> These are ABI constants so maybe simpler:
>>
>> const char *fixed_types[] = {"HARDWARE", "SOFTWARE", "TRACEPOINT",
>> "HW_CACHE", "RAW", "BREAKPOINT"};
>>
>> if (value < ARRAY_SIZE(fixed_types)) {
>> snprintf(buf, size, "%"PRIu64" (PERF_TYPE_%s)",
>> value, fixed_types[value]);
>> } else {
>> snprintf(buf, size, "%"PRIu64, value);
>> }
>
> Although it is really the repeated snprintf that seems unnecessary
> so maybe use a switch but just to get the stringified name.
>
Ok, will use switch/case to get stringified name for type and id in v2.

Thanks,
Yang