[PATCH 08/14] perf auxtrace: intel-pt: Use new snapshot_has_wrapped callback
James Clark
james.clark at linaro.org
Tue Aug 11 08:30:11 PDT 2026
The new callback is only for the search, and auxtrace.c fixes up the
pointers after a wrap is found. Update Intel PT to use the new callback
and finish removal of the old one now that there are no more users.
No functional changes intended.
Signed-off-by: James Clark <james.clark at linaro.org>
---
tools/perf/arch/x86/util/intel-pt.c | 58 ++++++++++---------------------------
tools/perf/util/auxtrace.c | 14 +++------
tools/perf/util/auxtrace.h | 7 -----
3 files changed, 19 insertions(+), 60 deletions(-)
diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
index a533114c0048..b8de129a218e 100644
--- a/tools/perf/arch/x86/util/intel-pt.c
+++ b/tools/perf/arch/x86/util/intel-pt.c
@@ -1080,17 +1080,17 @@ static void intel_pt_copy_ref(void *ref_buf, size_t ref_size, size_t buf_size,
}
static bool intel_pt_wrapped(struct intel_pt_recording *ptr, int idx,
- struct auxtrace_mmap *mm, unsigned char *data,
+ size_t size, unsigned char *data,
u64 head)
{
struct intel_pt_snapshot_ref *ref = &ptr->snapshot_refs[idx];
bool wrapped;
wrapped = intel_pt_compare_ref(ref->ref_buf, ref->ref_offset,
- ptr->snapshot_ref_buf_size, mm->len,
+ ptr->snapshot_ref_buf_size, size,
data, head);
- intel_pt_copy_ref(ref->ref_buf, ptr->snapshot_ref_buf_size, mm->len,
+ intel_pt_copy_ref(ref->ref_buf, ptr->snapshot_ref_buf_size, size,
data, head);
return wrapped;
@@ -1113,69 +1113,41 @@ static bool intel_pt_first_wrap(u64 *data, size_t buf_size)
return false;
}
-static int intel_pt_find_snapshot(struct auxtrace_record *itr, int idx,
- struct auxtrace_mmap *mm, unsigned char *data,
- u64 *head, u64 *old)
+static int intel_pt_snapshot_has_wrapped(struct auxtrace_record *itr, int idx,
+ unsigned char *data, size_t size,
+ u64 head)
{
struct intel_pt_recording *ptr =
container_of(itr, struct intel_pt_recording, itr);
bool wrapped;
int err;
- pr_debug3("%s: mmap index %d old head %zu new head %zu\n",
- __func__, idx, (size_t)*old, (size_t)*head);
-
- err = intel_pt_snapshot_init(ptr, mm->len);
+ err = intel_pt_snapshot_init(ptr, size);
if (err)
- goto out_err;
+ return err;
if (idx >= ptr->snapshot_ref_cnt) {
err = intel_pt_alloc_snapshot_refs(ptr, idx);
if (err)
- goto out_err;
+ return err;
}
if (ptr->snapshot_ref_buf_size) {
if (!ptr->snapshot_refs[idx].ref_buf) {
- err = intel_pt_alloc_snapshot_ref(ptr, idx, mm->len);
+ err = intel_pt_alloc_snapshot_ref(ptr, idx, size);
if (err)
- goto out_err;
+ return err;
}
- wrapped = intel_pt_wrapped(ptr, idx, mm, data, *head);
+ wrapped = intel_pt_wrapped(ptr, idx, size, data, head);
} else {
wrapped = ptr->snapshot_refs[idx].wrapped;
- if (!wrapped && intel_pt_first_wrap((u64 *)data, mm->len)) {
+ if (!wrapped && intel_pt_first_wrap((u64 *)data, size)) {
ptr->snapshot_refs[idx].wrapped = true;
wrapped = true;
}
}
- /*
- * In full trace mode 'head' continually increases. However in snapshot
- * mode 'head' is an offset within the buffer. Here 'old' and 'head'
- * are adjusted to match the full trace case which expects that 'old' is
- * always less than 'head'.
- */
- if (wrapped) {
- *old = *head;
- *head += mm->len;
- } else {
- if (mm->mask)
- *old &= mm->mask;
- else
- *old %= mm->len;
- if (*old > *head)
- *head += mm->len;
- }
-
- pr_debug3("%s: wrap-around %sdetected, adjusted old head %zu adjusted new head %zu\n",
- __func__, wrapped ? "" : "not ", (size_t)*old, (size_t)*head);
-
- return 0;
-
-out_err:
- pr_err("%s: failed, error %d\n", __func__, err);
- return err;
+ return wrapped;
}
static u64 intel_pt_reference(struct auxtrace_record *itr __maybe_unused)
@@ -1221,7 +1193,7 @@ struct auxtrace_record *intel_pt_recording_init(int *err)
ptr->itr.free = intel_pt_recording_free;
ptr->itr.snapshot_start = intel_pt_snapshot_start;
ptr->itr.snapshot_finish = intel_pt_snapshot_finish;
- ptr->itr.find_snapshot = intel_pt_find_snapshot;
+ ptr->itr.snapshot_has_wrapped = intel_pt_snapshot_has_wrapped;
ptr->itr.parse_snapshot_options = intel_pt_parse_snapshot_options;
ptr->itr.reference = intel_pt_reference;
ptr->itr.read_finish = auxtrace_record__read_finish;
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
index 9586989e645e..8ca872e6d465 100644
--- a/tools/perf/util/auxtrace.c
+++ b/tools/perf/util/auxtrace.c
@@ -2061,16 +2061,10 @@ static int __auxtrace_mmap__read(struct mmap *map,
head = auxtrace_mmap__read_head(mm, kernel_is_64_bit);
- if (snapshot) {
- if (itr->find_snapshot) {
- err = itr->find_snapshot(itr, mm->idx, mm, data, &head, &old);
- if (err)
- return err;
- } else if (itr->snapshot_has_wrapped) {
- err = auxtrace_find_snapshot(itr, mm->idx, mm, data, &head, &old);
- if (err)
- return err;
- }
+ if (snapshot && itr->snapshot_has_wrapped) {
+ err = auxtrace_find_snapshot(itr, mm->idx, mm, data, &head, &old);
+ if (err)
+ return err;
}
if (old == head)
diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h
index c2342d0f4afb..a9d0c84184c5 100644
--- a/tools/perf/util/auxtrace.h
+++ b/tools/perf/util/auxtrace.h
@@ -375,7 +375,6 @@ struct auxtrace_mmap_params {
* @free: free this auxtrace record structure
* @snapshot_start: starting a snapshot
* @snapshot_finish: finishing a snapshot
- * @find_snapshot: find data to snapshot within auxtrace mmap
* @snapshot_has_wrapped: callback to check if the buffer has wrapped in snapshot mode
* @parse_snapshot_options: parse snapshot options
* @reference: provide a 64-bit reference number for auxtrace_event
@@ -400,9 +399,6 @@ struct auxtrace_record {
void (*free)(struct auxtrace_record *itr);
int (*snapshot_start)(struct auxtrace_record *itr);
int (*snapshot_finish)(struct auxtrace_record *itr);
- int (*find_snapshot)(struct auxtrace_record *itr, int idx,
- struct auxtrace_mmap *mm, unsigned char *data,
- u64 *head, u64 *old);
int (*snapshot_has_wrapped)(struct auxtrace_record *itr, int idx,
unsigned char *data, size_t size, u64 head);
int (*parse_snapshot_options)(struct auxtrace_record *itr,
@@ -595,9 +591,6 @@ int auxtrace_record__info_fill(struct auxtrace_record *itr,
void auxtrace_record__free(struct auxtrace_record *itr);
int auxtrace_record__snapshot_start(struct auxtrace_record *itr);
int auxtrace_record__snapshot_finish(struct auxtrace_record *itr, bool on_exit);
-int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,
- struct auxtrace_mmap *mm,
- unsigned char *data, u64 *head, u64 *old);
int auxtrace_record__has_wrapped(struct auxtrace_record *itr, int idx,
unsigned char *data, size_t buf_size,
u64 head __maybe_unused);
--
2.43.0
More information about the linux-arm-kernel
mailing list