]> www.infradead.org Git - users/hch/misc.git/commitdiff
perf powerpc: Add basic CONFIG_AUXTRACE support for VPA pmu on powerpc
authorAthira Rajeev <atrajeev@linux.ibm.com>
Tue, 16 Sep 2025 05:25:31 +0000 (10:55 +0530)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 1 Oct 2025 14:22:04 +0000 (11:22 -0300)
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>
tools/perf/arch/powerpc/util/Build
tools/perf/arch/powerpc/util/auxtrace.c [new file with mode: 0644]
tools/perf/util/auxtrace.c
tools/perf/util/auxtrace.h
tools/perf/util/powerpc-vpadtl.h [new file with mode: 0644]

index fdd6a77a3432c91b92e536ad518713a3c6e07fd9..a5b0babd307e9afea7ca5e15c90d55ce4e1f5fe2 100644 (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
diff --git a/tools/perf/arch/powerpc/util/auxtrace.c b/tools/perf/arch/powerpc/util/auxtrace.c
new file mode 100644 (file)
index 0000000..62c6f67
--- /dev/null
@@ -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;
+}
index 5e437133c75329e0179d07fd2f26ed17353e642a..c0f79652a1b89476dd69ffa4e29aa8dedd036640 100644 (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;
index f001cbb68f8e70972530de1b29db7b121d0e3518..e0a5b39fed1235d05ceeca5390c150b1cb9e4cc8 100644 (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 {
diff --git a/tools/perf/util/powerpc-vpadtl.h b/tools/perf/util/powerpc-vpadtl.h
new file mode 100644 (file)
index 0000000..0bca9b5
--- /dev/null
@@ -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