Skip to content

Commit 30def61

Browse files
Jin Yaoacmel
authored andcommitted
perf parse-events: Create two hybrid cache events
For cache events, they have pre-defined configs. The kernel needs to know where the cache event comes from (e.g. from cpu_core pmu or from cpu_atom pmu). But the perf type PERF_TYPE_HW_CACHE can't carry pmu information. Now the type PERF_TYPE_HW_CACHE is extended to be PMU aware type. The PMU type ID is stored at attr.config[63:32]. When enabling a hybrid cache event without specified pmu, such as, 'perf stat -e LLC-loads -a', two events are created automatically. One is for atom, the other is for core. # perf stat -e LLC-loads -a -vv -- sleep 1 Control descriptor is not initialized ------------------------------------------------------------ perf_event_attr: type 3 size 120 config 0x400000002 sample_type IDENTIFIER read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING disabled 1 inherit 1 exclude_guest 1 ------------------------------------------------------------ sys_perf_event_open: pid -1 cpu 0 group_fd -1 flags 0x8 = 3 ------------------------------------------------------------ ... ------------------------------------------------------------ perf_event_attr: type 3 size 120 config 0x400000002 sample_type IDENTIFIER read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING disabled 1 inherit 1 exclude_guest 1 ------------------------------------------------------------ sys_perf_event_open: pid -1 cpu 15 group_fd -1 flags 0x8 = 19 ------------------------------------------------------------ perf_event_attr: type 3 size 120 config 0x800000002 sample_type IDENTIFIER read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING disabled 1 inherit 1 exclude_guest 1 ------------------------------------------------------------ sys_perf_event_open: pid -1 cpu 16 group_fd -1 flags 0x8 = 20 ------------------------------------------------------------ ... ------------------------------------------------------------ perf_event_attr: type 3 size 120 config 0x800000002 sample_type IDENTIFIER read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING disabled 1 inherit 1 exclude_guest 1 ------------------------------------------------------------ sys_perf_event_open: pid -1 cpu 23 group_fd -1 flags 0x8 = 27 LLC-loads: 0: 1507 1001800280 1001800280 LLC-loads: 1: 666 1001812250 1001812250 LLC-loads: 2: 3353 1001813453 1001813453 LLC-loads: 3: 514 1001848795 1001848795 LLC-loads: 4: 627 1001952832 1001952832 LLC-loads: 5: 4399 1001451154 1001451154 LLC-loads: 6: 1240 1001481052 1001481052 LLC-loads: 7: 478 1001520348 1001520348 LLC-loads: 8: 691 1001551236 1001551236 LLC-loads: 9: 310 1001578945 1001578945 LLC-loads: 10: 1018 1001594354 1001594354 LLC-loads: 11: 3656 1001622355 1001622355 LLC-loads: 12: 882 1001661416 1001661416 LLC-loads: 13: 506 1001693963 1001693963 LLC-loads: 14: 3547 1001721013 1001721013 LLC-loads: 15: 1399 1001734818 1001734818 LLC-loads: 0: 1314 1001793826 1001793826 LLC-loads: 1: 2857 1001752764 1001752764 LLC-loads: 2: 646 1001830694 1001830694 LLC-loads: 3: 1612 1001864861 1001864861 LLC-loads: 4: 2244 1001912381 1001912381 LLC-loads: 5: 1255 1001943889 1001943889 LLC-loads: 6: 4624 1002021109 1002021109 LLC-loads: 7: 2703 1001959302 1001959302 LLC-loads: 24793 16026838264 16026838264 LLC-loads: 17255 8015078826 8015078826 Performance counter stats for 'system wide': 24,793 cpu_core/LLC-loads/ 17,255 cpu_atom/LLC-loads/ 1.001970988 seconds time elapsed 0x4 in 0x400000002 indicates the cpu_core pmu. 0x8 in 0x800000002 indicates the cpu_atom pmu. Signed-off-by: Jin Yao <[email protected]> Reviewed-by: Jiri Olsa <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Kan Liang <[email protected]> Cc: Peter Zijlstra <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 9cbfa2f commit 30def61

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

tools/perf/util/parse-events-hybrid.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,26 @@ int parse_events__add_numeric_hybrid(struct parse_events_state *parse_state,
9898

9999
return -1;
100100
}
101+
102+
int parse_events__add_cache_hybrid(struct list_head *list, int *idx,
103+
struct perf_event_attr *attr, char *name,
104+
struct list_head *config_terms,
105+
bool *hybrid)
106+
{
107+
struct perf_pmu *pmu;
108+
int ret;
109+
110+
*hybrid = false;
111+
if (!perf_pmu__has_hybrid())
112+
return 0;
113+
114+
*hybrid = true;
115+
perf_pmu__for_each_hybrid_pmu(pmu) {
116+
ret = create_event_hybrid(PERF_TYPE_HW_CACHE, idx, list,
117+
attr, name, config_terms, pmu);
118+
if (ret)
119+
return ret;
120+
}
121+
122+
return 0;
123+
}

tools/perf/util/parse-events-hybrid.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,9 @@ int parse_events__add_numeric_hybrid(struct parse_events_state *parse_state,
1414
char *name, struct list_head *config_terms,
1515
bool *hybrid);
1616

17+
int parse_events__add_cache_hybrid(struct list_head *list, int *idx,
18+
struct perf_event_attr *attr, char *name,
19+
struct list_head *config_terms,
20+
bool *hybrid);
21+
1722
#endif /* __PERF_PARSE_EVENTS_HYBRID_H */

tools/perf/util/parse-events.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,8 @@ int parse_events_add_cache(struct list_head *list, int *idx,
460460
char name[MAX_NAME_LEN], *config_name;
461461
int cache_type = -1, cache_op = -1, cache_result = -1;
462462
char *op_result[2] = { op_result1, op_result2 };
463-
int i, n;
463+
int i, n, ret;
464+
bool hybrid;
464465

465466
/*
466467
* No fallback - if we cannot get a clear cache type
@@ -520,6 +521,13 @@ int parse_events_add_cache(struct list_head *list, int *idx,
520521
if (get_config_terms(head_config, &config_terms))
521522
return -ENOMEM;
522523
}
524+
525+
ret = parse_events__add_cache_hybrid(list, idx, &attr,
526+
config_name ? : name, &config_terms,
527+
&hybrid);
528+
if (hybrid)
529+
return ret;
530+
523531
return add_event(list, idx, &attr, config_name ? : name, &config_terms);
524532
}
525533

0 commit comments

Comments
 (0)