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>
This commit is contained in:
parent
d5a8bd0fcd
commit
79e157b008
|
@ -42,6 +42,8 @@
|
|||
#include "ui/ui.h"
|
||||
#include "ui/progress.h"
|
||||
#include "../perf.h"
|
||||
#include "pmu.h"
|
||||
#include "pmu-hybrid.h"
|
||||
|
||||
struct c2c_hists {
|
||||
struct hists hists;
|
||||
|
@ -2907,8 +2909,9 @@ static const char * const *record_mem_usage = __usage_record;
|
|||
|
||||
static int perf_c2c__record(int argc, const char **argv)
|
||||
{
|
||||
int rec_argc, i = 0, j;
|
||||
int rec_argc, i = 0, j, rec_tmp_nr = 0;
|
||||
const char **rec_argv;
|
||||
char **rec_tmp;
|
||||
int ret;
|
||||
bool all_user = false, all_kernel = false;
|
||||
bool event_set = false;
|
||||
|
@ -2932,11 +2935,21 @@ static int perf_c2c__record(int argc, const char **argv)
|
|||
argc = parse_options(argc, argv, options, record_mem_usage,
|
||||
PARSE_OPT_KEEP_UNKNOWN);
|
||||
|
||||
rec_argc = argc + 11; /* max number of arguments */
|
||||
if (!perf_pmu__has_hybrid())
|
||||
rec_argc = argc + 11; /* max number of arguments */
|
||||
else
|
||||
rec_argc = argc + 11 * perf_pmu__hybrid_pmu_num();
|
||||
|
||||
rec_argv = calloc(rec_argc + 1, sizeof(char *));
|
||||
if (!rec_argv)
|
||||
return -1;
|
||||
|
||||
rec_tmp = calloc(rec_argc + 1, sizeof(char *));
|
||||
if (!rec_tmp) {
|
||||
free(rec_argv);
|
||||
return -1;
|
||||
}
|
||||
|
||||
rec_argv[i++] = "record";
|
||||
|
||||
if (!event_set) {
|
||||
|
@ -2964,21 +2977,9 @@ static int perf_c2c__record(int argc, const char **argv)
|
|||
rec_argv[i++] = "--phys-data";
|
||||
rec_argv[i++] = "--sample-cpu";
|
||||
|
||||
for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
|
||||
e = perf_mem_events__ptr(j);
|
||||
if (!e->record)
|
||||
continue;
|
||||
|
||||
if (!e->supported) {
|
||||
pr_err("failed: event '%s' not supported\n",
|
||||
perf_mem_events__name(j, NULL));
|
||||
free(rec_argv);
|
||||
return -1;
|
||||
}
|
||||
|
||||
rec_argv[i++] = "-e";
|
||||
rec_argv[i++] = perf_mem_events__name(j, NULL);
|
||||
}
|
||||
ret = perf_mem_events__record_args(rec_argv, &i, rec_tmp, &rec_tmp_nr);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (all_user)
|
||||
rec_argv[i++] = "--all-user";
|
||||
|
@ -3002,6 +3003,11 @@ static int perf_c2c__record(int argc, const char **argv)
|
|||
}
|
||||
|
||||
ret = cmd_record(i, rec_argv);
|
||||
out:
|
||||
for (i = 0; i < rec_tmp_nr; i++)
|
||||
free(rec_tmp[i]);
|
||||
|
||||
free(rec_tmp);
|
||||
free(rec_argv);
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue