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