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.

Tested-by: Venkat Rao Bagalkote <venka...@linux.ibm.com>
Signed-off-by: Athira Rajeev <atraj...@linux.ibm.com>
---
Changelog:
v3:
Addressed review comments from Adrian:
- Remove unused header files from arch/powerpc/util/auxtrace.c
- Use evsel name instead of using new variable
- Remove unused POWERPC_VPADTL_NAME

- Added Tested by from Venkat

v2:
Addressed review comments from Adrian:
- Return VPADTL_AUXTRACE_PRIV_SIZE in powerpc_vpadtl_info_priv_size
- Remove unused powerpc_vpadtl_parse_snapshot_options
- Some of the function parameters had "__maybe_unused", corrected it.
- Used PERF_AUXTRACE_VPA_DTL instead of PERF_AUXTRACE_VPA_PMU
- Moved powerpc_vpadtl_process_auxtrace_info to next patch

 tools/perf/arch/powerpc/util/Build      |   1 +
 tools/perf/arch/powerpc/util/auxtrace.c | 103 ++++++++++++++++++++++++
 tools/perf/util/auxtrace.c              |   1 +
 tools/perf/util/auxtrace.h              |   1 +
 tools/perf/util/powerpc-vpadtl.h        |  16 ++++
 5 files changed, 122 insertions(+)
 create mode 100644 tools/perf/arch/powerpc/util/auxtrace.c
 create mode 100644 tools/perf/util/powerpc-vpadtl.h

diff --git a/tools/perf/arch/powerpc/util/Build 
b/tools/perf/arch/powerpc/util/Build
index fdd6a77a3432..a5b0babd307e 100644
--- a/tools/perf/arch/powerpc/util/Build
+++ b/tools/perf/arch/powerpc/util/Build
@@ -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
index 000000000000..62c6f67f1bbe
--- /dev/null
+++ b/tools/perf/arch/powerpc/util/auxtrace.c
@@ -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;
+}
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
index ebd32f1b8f12..f294658bb948 100644
--- a/tools/perf/util/auxtrace.c
+++ b/tools/perf/util/auxtrace.c
@@ -1393,6 +1393,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;
diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h
index f001cbb68f8e..e0a5b39fed12 100644
--- a/tools/perf/util/auxtrace.h
+++ b/tools/perf/util/auxtrace.h
@@ -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
index 000000000000..0bca9b56379d
--- /dev/null
+++ b/tools/perf/util/powerpc-vpadtl.h
@@ -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
-- 
2.47.1


Reply via email to