linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` symbol in perf_event_attr__fprintf()
@ 2023-04-19 12:29 Yang Jihong
  2023-04-19 12:29 ` [PATCH 1/4] perf trace-event-info: Add tracepoint_id_to_name() helper Yang Jihong
                   ` (4 more replies)
  0 siblings, 5 replies; 11+ messages in thread
From: Yang Jihong @ 2023-04-19 12:29 UTC (permalink / raw)
  To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa,
	namhyung, irogers, adrian.hunter, anshuman.khandual, jesussanp,
	linux-perf-users, linux-kernel
  Cc: yangjihong1

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


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/4] perf trace-event-info: Add tracepoint_id_to_name() helper
  2023-04-19 12:29 [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` symbol in perf_event_attr__fprintf() Yang Jihong
@ 2023-04-19 12:29 ` Yang Jihong
  2023-05-10  7:48   ` Adrian Hunter
  2023-04-19 12:29 ` [PATCH 2/4] perf tools: Extend PRINT_ATTRf to support printing of members with a value of 0 Yang Jihong
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 11+ messages in thread
From: Yang Jihong @ 2023-04-19 12:29 UTC (permalink / raw)
  To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa,
	namhyung, irogers, adrian.hunter, anshuman.khandual, jesussanp,
	linux-perf-users, linux-kernel
  Cc: yangjihong1

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 <yangjihong1@huawei.com>
---
 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


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/4] perf tools: Extend PRINT_ATTRf to support printing of members with a value of 0
  2023-04-19 12:29 [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` symbol in perf_event_attr__fprintf() Yang Jihong
  2023-04-19 12:29 ` [PATCH 1/4] perf trace-event-info: Add tracepoint_id_to_name() helper Yang Jihong
@ 2023-04-19 12:29 ` Yang Jihong
  2023-04-19 12:29 ` [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf() Yang Jihong
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 11+ messages in thread
From: Yang Jihong @ 2023-04-19 12:29 UTC (permalink / raw)
  To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa,
	namhyung, irogers, adrian.hunter, anshuman.khandual, jesussanp,
	linux-perf-users, linux-kernel
  Cc: yangjihong1

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 <yangjihong1@huawei.com>
---
 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


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf()
  2023-04-19 12:29 [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` symbol in perf_event_attr__fprintf() Yang Jihong
  2023-04-19 12:29 ` [PATCH 1/4] perf trace-event-info: Add tracepoint_id_to_name() helper Yang Jihong
  2023-04-19 12:29 ` [PATCH 2/4] perf tools: Extend PRINT_ATTRf to support printing of members with a value of 0 Yang Jihong
@ 2023-04-19 12:29 ` Yang Jihong
  2023-05-10  8:32   ` Adrian Hunter
  2023-04-19 12:29 ` [PATCH 4/4] perf tools: Add printing perf_event_attr->config " Yang Jihong
  2023-05-10  7:22 ` [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` " Yang Jihong
  4 siblings, 1 reply; 11+ messages in thread
From: Yang Jihong @ 2023-04-19 12:29 UTC (permalink / raw)
  To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa,
	namhyung, irogers, adrian.hunter, anshuman.khandual, jesussanp,
	linux-perf-users, linux-kernel
  Cc: yangjihong1

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 <yangjihong1@huawei.com>
---
 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


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/4] perf tools: Add printing perf_event_attr->config symbol in perf_event_attr__fprintf()
  2023-04-19 12:29 [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` symbol in perf_event_attr__fprintf() Yang Jihong
                   ` (2 preceding siblings ...)
  2023-04-19 12:29 ` [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf() Yang Jihong
@ 2023-04-19 12:29 ` Yang Jihong
  2023-05-10  7:22 ` [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` " Yang Jihong
  4 siblings, 0 replies; 11+ messages in thread
From: Yang Jihong @ 2023-04-19 12:29 UTC (permalink / raw)
  To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa,
	namhyung, irogers, adrian.hunter, anshuman.khandual, jesussanp,
	linux-perf-users, linux-kernel
  Cc: yangjihong1

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 <yangjihong1@huawei.com>
---
 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


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` symbol in perf_event_attr__fprintf()
  2023-04-19 12:29 [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` symbol in perf_event_attr__fprintf() Yang Jihong
                   ` (3 preceding siblings ...)
  2023-04-19 12:29 ` [PATCH 4/4] perf tools: Add printing perf_event_attr->config " Yang Jihong
@ 2023-05-10  7:22 ` Yang Jihong
  4 siblings, 0 replies; 11+ messages in thread
From: Yang Jihong @ 2023-05-10  7:22 UTC (permalink / raw)
  To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa,
	namhyung, irogers, adrian.hunter, anshuman.khandual, jesussanp,
	linux-perf-users, linux-kernel

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

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] perf trace-event-info: Add tracepoint_id_to_name() helper
  2023-04-19 12:29 ` [PATCH 1/4] perf trace-event-info: Add tracepoint_id_to_name() helper Yang Jihong
@ 2023-05-10  7:48   ` Adrian Hunter
  2023-05-10  8:09     ` Yang Jihong
  0 siblings, 1 reply; 11+ messages in thread
From: Adrian Hunter @ 2023-05-10  7:48 UTC (permalink / raw)
  To: Yang Jihong, peterz, mingo, acme, mark.rutland,
	alexander.shishkin, jolsa, namhyung, irogers, anshuman.khandual,
	jesussanp, linux-perf-users, linux-kernel

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 <yangjihong1@huawei.com>
> ---
>  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;


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] perf trace-event-info: Add tracepoint_id_to_name() helper
  2023-05-10  7:48   ` Adrian Hunter
@ 2023-05-10  8:09     ` Yang Jihong
  0 siblings, 0 replies; 11+ messages in thread
From: Yang Jihong @ 2023-05-10  8:09 UTC (permalink / raw)
  To: Adrian Hunter, peterz, mingo, acme, mark.rutland,
	alexander.shishkin, jolsa, namhyung, irogers, anshuman.khandual,
	jesussanp, linux-perf-users, linux-kernel

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 <yangjihong1@huawei.com>
>> ---
>>   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

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf()
  2023-04-19 12:29 ` [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf() Yang Jihong
@ 2023-05-10  8:32   ` Adrian Hunter
  2023-05-10 15:51     ` Adrian Hunter
  0 siblings, 1 reply; 11+ messages in thread
From: Adrian Hunter @ 2023-05-10  8:32 UTC (permalink / raw)
  To: Yang Jihong, peterz, mingo, acme, mark.rutland,
	alexander.shishkin, jolsa, namhyung, irogers, anshuman.khandual,
	jesussanp, linux-perf-users, linux-kernel

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 <yangjihong1@huawei.com>
> ---
>  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);


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf()
  2023-05-10  8:32   ` Adrian Hunter
@ 2023-05-10 15:51     ` Adrian Hunter
  2023-05-11  7:42       ` Yang Jihong
  0 siblings, 1 reply; 11+ messages in thread
From: Adrian Hunter @ 2023-05-10 15:51 UTC (permalink / raw)
  To: Yang Jihong, peterz, mingo, acme, mark.rutland,
	alexander.shishkin, jolsa, namhyung, irogers, anshuman.khandual,
	jesussanp, linux-perf-users, linux-kernel

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 <yangjihong1@huawei.com>
>> ---
>>  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);
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf()
  2023-05-10 15:51     ` Adrian Hunter
@ 2023-05-11  7:42       ` Yang Jihong
  0 siblings, 0 replies; 11+ messages in thread
From: Yang Jihong @ 2023-05-11  7:42 UTC (permalink / raw)
  To: Adrian Hunter, peterz, mingo, acme, mark.rutland,
	alexander.shishkin, jolsa, namhyung, irogers, anshuman.khandual,
	jesussanp, linux-perf-users, linux-kernel

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 <yangjihong1@huawei.com>
>>> ---
>>>   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

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2023-05-11  7:42 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-19 12:29 [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` symbol in perf_event_attr__fprintf() Yang Jihong
2023-04-19 12:29 ` [PATCH 1/4] perf trace-event-info: Add tracepoint_id_to_name() helper Yang Jihong
2023-05-10  7:48   ` Adrian Hunter
2023-05-10  8:09     ` Yang Jihong
2023-04-19 12:29 ` [PATCH 2/4] perf tools: Extend PRINT_ATTRf to support printing of members with a value of 0 Yang Jihong
2023-04-19 12:29 ` [PATCH 3/4] perf tools: Add printing perf_event_attr->type symbol in perf_event_attr__fprintf() Yang Jihong
2023-05-10  8:32   ` Adrian Hunter
2023-05-10 15:51     ` Adrian Hunter
2023-05-11  7:42       ` Yang Jihong
2023-04-19 12:29 ` [PATCH 4/4] perf tools: Add printing perf_event_attr->config " Yang Jihong
2023-05-10  7:22 ` [PATCH 0/4] perf tools: Add printing perf_event_attr `config` and `id` " Yang Jihong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).