Skip to content

Commit

Permalink
tracecmd library: Unlock records in tracecmd_iterate_events()
Browse files Browse the repository at this point in the history
The tracecmd_iterate_events() and tracecmd_iterate_events_multi() uses
tracecmd_peek_data() to look at the next record. But when this is done,
the record is "cached" and "locked" in the handle. Which means they can
not be freed.

At the end of the iterators, make sure to read the data to unlock them,
and then free them.

Link: https://lore.kernel.org/linux-trace-devel/[email protected]

Signed-off-by: Steven Rostedt (Google) <[email protected]>
  • Loading branch information
rostedt committed Jun 7, 2023
1 parent 2668b13 commit 8908555
Showing 1 changed file with 20 additions and 2 deletions.
22 changes: 20 additions & 2 deletions lib/trace-cmd/trace-input.c
Original file line number Diff line number Diff line change
Expand Up @@ -2818,8 +2818,13 @@ int tracecmd_iterate_events(struct tracecmd_input *handle,
}
} while (next_cpu >= 0 && ret >= 0);

for (cpu = 0; cpu < handle->max_cpu; cpu++)
tracecmd_free_record(records[cpu]);
/* Need to unlock and free the records */
for (cpu = 0; cpu < handle->max_cpu; cpu++) {
if (!records[cpu])
continue;
record = tracecmd_read_data(handle, cpu);
tracecmd_free_record(record);
}

free(records);

Expand Down Expand Up @@ -2909,6 +2914,19 @@ int tracecmd_iterate_events_multi(struct tracecmd_input **handles,

} while (next_cpu >= 0 && ret >= 0);

/* Unlock and free the records */
for (cpu = 0; cpu < all_cpus; cpu++) {
int local_cpu;

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

/*
* The records array contains only records that were taken via
* tracecmd_peek_data(), and do not need to be freed.
Expand Down

0 comments on commit 8908555

Please sign in to comment.