mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-28 06:44:36 -05:00
perf powerpc: Add basic CONFIG_AUXTRACE support for VPA pmu on powerpc
The powerpc PMU collecting Dispatch Trace Log (DTL) entries makes use of AUX support in perf infrastructure. The PMU driver has the functionality to collect trace entries in the aux buffer. On the tools side, this data is made available as PERF_RECORD_AUXTRACE records. This record is generated by "perf record" command. To enable the creation of PERF_RECORD_AUXTRACE, add functions to initialize auxtrace records ie "auxtrace_record__init()". Fill in fields for other callbacks like info_priv_size, info_fill, free, recording options etc. Define auxtrace_type as PERF_AUXTRACE_VPA_DTL. Add header file to define vpa dtl pmu specific details. Reviewed-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Athira Rajeev <atrajeev@linux.ibm.com> Tested-by: Tejas Manhas <tejas05@linux.ibm.com> Tested-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com> Cc: Aboorva Devarajan <aboorvad@linux.ibm.com> Cc: Aditya Bodkhe <Aditya.Bodkhe1@ibm.com> Cc: Hari Bathini <hbathini@linux.vnet.ibm.com> Cc: Ian Rogers <irogers@google.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Madhavan Srinivasan <maddy@linux.ibm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Shrikanth Hegde <sshegde@linux.ibm.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
58a606149c
commit
1dbfaf94cf
@@ -10,3 +10,4 @@ perf-util-$(CONFIG_LIBDW) += skip-callchain-idx.o
|
||||
|
||||
perf-util-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
|
||||
perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
perf-util-$(CONFIG_AUXTRACE) += auxtrace.o
|
||||
|
||||
103
tools/perf/arch/powerpc/util/auxtrace.c
Normal file
103
tools/perf/arch/powerpc/util/auxtrace.c
Normal file
@@ -0,0 +1,103 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* VPA support
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include "../../util/evlist.h"
|
||||
#include "../../util/debug.h"
|
||||
#include "../../util/auxtrace.h"
|
||||
#include "../../util/powerpc-vpadtl.h"
|
||||
#include "../../util/record.h"
|
||||
#include <internal/lib.h> // page_size
|
||||
|
||||
#define KiB(x) ((x) * 1024)
|
||||
|
||||
static int
|
||||
powerpc_vpadtl_recording_options(struct auxtrace_record *ar __maybe_unused,
|
||||
struct evlist *evlist __maybe_unused,
|
||||
struct record_opts *opts)
|
||||
{
|
||||
opts->full_auxtrace = true;
|
||||
|
||||
/*
|
||||
* Set auxtrace_mmap_pages to minimum
|
||||
* two pages
|
||||
*/
|
||||
if (!opts->auxtrace_mmap_pages) {
|
||||
opts->auxtrace_mmap_pages = KiB(128) / page_size;
|
||||
if (opts->mmap_pages == UINT_MAX)
|
||||
opts->mmap_pages = KiB(256) / page_size;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t powerpc_vpadtl_info_priv_size(struct auxtrace_record *itr __maybe_unused,
|
||||
struct evlist *evlist __maybe_unused)
|
||||
{
|
||||
return VPADTL_AUXTRACE_PRIV_SIZE;
|
||||
}
|
||||
|
||||
static int
|
||||
powerpc_vpadtl_info_fill(struct auxtrace_record *itr __maybe_unused,
|
||||
struct perf_session *session __maybe_unused,
|
||||
struct perf_record_auxtrace_info *auxtrace_info,
|
||||
size_t priv_size __maybe_unused)
|
||||
{
|
||||
auxtrace_info->type = PERF_AUXTRACE_VPA_DTL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void powerpc_vpadtl_free(struct auxtrace_record *itr)
|
||||
{
|
||||
free(itr);
|
||||
}
|
||||
|
||||
static u64 powerpc_vpadtl_reference(struct auxtrace_record *itr __maybe_unused)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct auxtrace_record *auxtrace_record__init(struct evlist *evlist,
|
||||
int *err)
|
||||
{
|
||||
struct auxtrace_record *aux;
|
||||
struct evsel *pos;
|
||||
int found = 0;
|
||||
|
||||
evlist__for_each_entry(evlist, pos) {
|
||||
if (strstarts(pos->name, "vpa_dtl")) {
|
||||
found = 1;
|
||||
pos->needs_auxtrace_mmap = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* To obtain the auxtrace buffer file descriptor, the auxtrace event
|
||||
* must come first.
|
||||
*/
|
||||
evlist__to_front(pos->evlist, pos);
|
||||
|
||||
aux = zalloc(sizeof(*aux));
|
||||
if (aux == NULL) {
|
||||
pr_debug("aux record is NULL\n");
|
||||
*err = -ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
aux->recording_options = powerpc_vpadtl_recording_options;
|
||||
aux->info_priv_size = powerpc_vpadtl_info_priv_size;
|
||||
aux->info_fill = powerpc_vpadtl_info_fill;
|
||||
aux->free = powerpc_vpadtl_free;
|
||||
aux->reference = powerpc_vpadtl_reference;
|
||||
return aux;
|
||||
}
|
||||
@@ -1390,6 +1390,7 @@ int perf_event__process_auxtrace_info(struct perf_session *session,
|
||||
case PERF_AUXTRACE_HISI_PTT:
|
||||
err = hisi_ptt_process_auxtrace_info(event, session);
|
||||
break;
|
||||
case PERF_AUXTRACE_VPA_DTL:
|
||||
case PERF_AUXTRACE_UNKNOWN:
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
||||
@@ -50,6 +50,7 @@ enum auxtrace_type {
|
||||
PERF_AUXTRACE_ARM_SPE,
|
||||
PERF_AUXTRACE_S390_CPUMSF,
|
||||
PERF_AUXTRACE_HISI_PTT,
|
||||
PERF_AUXTRACE_VPA_DTL,
|
||||
};
|
||||
|
||||
enum itrace_period_type {
|
||||
|
||||
16
tools/perf/util/powerpc-vpadtl.h
Normal file
16
tools/perf/util/powerpc-vpadtl.h
Normal file
@@ -0,0 +1,16 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* VPA DTL PMU Support
|
||||
*/
|
||||
|
||||
#ifndef INCLUDE__PERF_POWERPC_VPADTL_H__
|
||||
#define INCLUDE__PERF_POWERPC_VPADTL_H__
|
||||
|
||||
enum {
|
||||
POWERPC_VPADTL_TYPE,
|
||||
VPADTL_AUXTRACE_PRIV_MAX,
|
||||
};
|
||||
|
||||
#define VPADTL_AUXTRACE_PRIV_SIZE (VPADTL_AUXTRACE_PRIV_MAX * sizeof(u64))
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user