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:
Athira Rajeev
2025-09-16 10:55:31 +05:30
committed by Arnaldo Carvalho de Melo
parent 58a606149c
commit 1dbfaf94cf
5 changed files with 122 additions and 0 deletions

View File

@@ -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

View 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;
}

View File

@@ -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;

View File

@@ -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 {

View 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