Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf c2c: Support record for hybrid platform

Support 'perf c2c record' for hybrid platform. On hybrid platform,
such as Alderlake, when executing 'perf c2c record', it actually calls:

record -W -d --phys-data --sample-cpu
-e {cpu_core/mem-loads-aux/,cpu_core/mem-loads,ldlat=30/}:P
-e cpu_atom/mem-loads,ldlat=30/P
-e cpu_core/mem-stores/P
-e cpu_atom/mem-stores/P

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20210527001610.10553-9-yao.jin@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Jin Yao and committed by
Arnaldo Carvalho de Melo
79e157b0 d5a8bd0f

+23 -17
+23 -17
tools/perf/builtin-c2c.c
··· 42 42 #include "ui/ui.h" 43 43 #include "ui/progress.h" 44 44 #include "../perf.h" 45 + #include "pmu.h" 46 + #include "pmu-hybrid.h" 45 47 46 48 struct c2c_hists { 47 49 struct hists hists; ··· 2909 2907 2910 2908 static int perf_c2c__record(int argc, const char **argv) 2911 2909 { 2912 - int rec_argc, i = 0, j; 2910 + int rec_argc, i = 0, j, rec_tmp_nr = 0; 2913 2911 const char **rec_argv; 2912 + char **rec_tmp; 2914 2913 int ret; 2915 2914 bool all_user = false, all_kernel = false; 2916 2915 bool event_set = false; ··· 2935 2932 argc = parse_options(argc, argv, options, record_mem_usage, 2936 2933 PARSE_OPT_KEEP_UNKNOWN); 2937 2934 2938 - rec_argc = argc + 11; /* max number of arguments */ 2935 + if (!perf_pmu__has_hybrid()) 2936 + rec_argc = argc + 11; /* max number of arguments */ 2937 + else 2938 + rec_argc = argc + 11 * perf_pmu__hybrid_pmu_num(); 2939 + 2939 2940 rec_argv = calloc(rec_argc + 1, sizeof(char *)); 2940 2941 if (!rec_argv) 2941 2942 return -1; 2943 + 2944 + rec_tmp = calloc(rec_argc + 1, sizeof(char *)); 2945 + if (!rec_tmp) { 2946 + free(rec_argv); 2947 + return -1; 2948 + } 2942 2949 2943 2950 rec_argv[i++] = "record"; 2944 2951 ··· 2977 2964 rec_argv[i++] = "--phys-data"; 2978 2965 rec_argv[i++] = "--sample-cpu"; 2979 2966 2980 - for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) { 2981 - e = perf_mem_events__ptr(j); 2982 - if (!e->record) 2983 - continue; 2984 - 2985 - if (!e->supported) { 2986 - pr_err("failed: event '%s' not supported\n", 2987 - perf_mem_events__name(j, NULL)); 2988 - free(rec_argv); 2989 - return -1; 2990 - } 2991 - 2992 - rec_argv[i++] = "-e"; 2993 - rec_argv[i++] = perf_mem_events__name(j, NULL); 2994 - } 2967 + ret = perf_mem_events__record_args(rec_argv, &i, rec_tmp, &rec_tmp_nr); 2968 + if (ret) 2969 + goto out; 2995 2970 2996 2971 if (all_user) 2997 2972 rec_argv[i++] = "--all-user"; ··· 3003 3002 } 3004 3003 3005 3004 ret = cmd_record(i, rec_argv); 3005 + out: 3006 + for (i = 0; i < rec_tmp_nr; i++) 3007 + free(rec_tmp[i]); 3008 + 3009 + free(rec_tmp); 3006 3010 free(rec_argv); 3007 3011 return ret; 3008 3012 }