aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (Google) <rostedt@goodmis.org>2023-06-15 13:12:16 -0400
committerSteven Rostedt (Google) <rostedt@goodmis.org>2023-07-05 20:28:36 -0400
commit7f0a59aef63c1d9040e04be8d4c5eacfcf90c5ef (patch)
tree467f0b7ef1d133ae35525e2671213cd740392628
parentac643dee477a9c9933bf8b3c22c9a76771bd137a (diff)
downloadtrace-cmd-7f0a59aef63c1d9040e04be8d4c5eacfcf90c5ef.tar.gz
trace-cmd library: Have tracecmd_iterate_events() start where it left off
When a callback to tracecmd_iterate_events() returns non-zero, it exits the iteration. Allow a sequential call to tracecmd_iterate_events() to start were it left off. The iterator peeks at the data which needs to be cleared. But the peek itself set the next read to be the next record. On a sequential iterator call, it will not include the cached records that were left over from the previous iterator call. Make sure at the end of the iterator to reset the indexes so that the next reads will be the recorders that were not processed by the iterator. Also do the same for tracecmd_iterate_events_multi() and remove the stale comment about not needing to free the records. Link: https://lore.kernel.org/linux-trace-devel/20230615131216.1fc36f0f@gandalf.local.home Fixes: 2cb6cc2f4e556 ("tracecmd library: Add tracecmd_iterate_events()") Fixes: b37903ae5fb53 ("tracecmd library: Add tracecmd_iterate_events_multi()") Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
-rw-r--r--lib/trace-cmd/trace-input.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c
index 51420c13..5279f581 100644
--- a/lib/trace-cmd/trace-input.c
+++ b/lib/trace-cmd/trace-input.c
@@ -2820,10 +2820,15 @@ int tracecmd_iterate_events(struct tracecmd_input *handle,
/* Need to unlock and free the records */
for (cpu = 0; cpu < handle->max_cpu; cpu++) {
+ int offset;
+
if (!records[cpu])
continue;
- record = tracecmd_read_data(handle, cpu);
- tracecmd_free_record(record);
+
+ offset = (int)(records[cpu]->offset & (handle->page_size - 1));
+ free_next(handle, cpu);
+ /* Reset the buffer to read the cached record again */
+ kbuffer_read_at_offset(handle->cpu_data[cpu].kbuf, offset, NULL);
}
free(records);
@@ -2917,20 +2922,20 @@ int tracecmd_iterate_events_multi(struct tracecmd_input **handles,
/* Unlock and free the records */
for (cpu = 0; cpu < all_cpus; cpu++) {
int local_cpu;
+ int offset;
if (!records[cpu].record)
continue;
handle = records[cpu].handle;
local_cpu = cpu - handle->start_cpu;
- record = tracecmd_read_data(handle, local_cpu);
- tracecmd_free_record(record);
+
+ offset = (int)(records[cpu].record->offset & (handle->page_size - 1));
+ free_next(handle, local_cpu);
+ /* Reset the buffer to read the cached record again */
+ kbuffer_read_at_offset(handle->cpu_data[cpu].kbuf, offset, NULL);
}
- /*
- * The records array contains only records that were taken via
- * tracecmd_peek_data(), and do not need to be freed.
- */
free(records);
return ret;