Skip to content

tracing: Kill the buggy trace_cpu

Oleg Nesterov lkml 2 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v2 Latest7 patches 1 replyIn review
  2. v17 patches 9 repliesSuperseded

Patches in v2 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/7tracing: Introduce trace_create_cpu_file() and tracing_get_cpu()kernel/trace/trace.c+36 -140 replies
2/7tracing: Change tracing_pipe_fops() to rely on tracing_get_cpu()kernel/trace/trace.c+7 -90 replies
3/7tracing: Change tracing_buffers_fops to rely on tracing_get_cpu()kernel/trace/trace.c+4 -50 replies
4/7tracing: Change tracing_stats_fops to rely on tracing_get_cpu()kernel/trace/trace.c+6 -70 replies
5/7tracing: Change tracing_entries_fops to rely on tracing_get_cpu()kernel/trace/trace.c+12 -370 replies
6/7tracing: Change tracing_fops/snapshot_fops to rely on tracing_get_cpu()kernel/trace/trace.c+22 -280 replies
7/7tracing: Kill trace_cpu struct/memberskernel/trace/trace.c kernel/trace/trace.h+0 -290 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v2 yet.

Read the v2 thread

Cover letter [PATCH v2 0/7] tracing: Kill the buggy trace_cpu

Hello.

This series kills tracing_open_generic_tc/trace_cpu/etc.

trace_array_get(inode->i_private) is mostly fine, we do not dereference this pointer untill trace_array_get() succeeds. But trace_array_get(tc->tr) is wrong by the same reason why tracing_open_generic_file/etc are wrong, see 1/7.

(Steven, I think you are right and we can also remove the
list_for_each_entry() loop from trace_array_get() later, and avoid the (harmless but still) race with rmdir + mkdir. Lets discuss this after we fix the problems with file/call).

Changes:

1/7: Fix the whitespace problems.

Add the comment above tracing_get_cpu() and update the changelog. tracing_get_cpu() is always safe but the code like

cpu = tracing_get_cpu(inode);
if (trace_array_get(tr) == 0)
do_something(tr, cpu);

is racy, it can wrongly use RING_BUFFER_ALL_CPUS. IOW, tracing_get_cpu() should be used only after trace_array_get() or something else which takes trace_types_lock at least once.

5/7: No changes. checkpatch.pl complains, but that
"line over 80 characters" in tracing_entries_read() was not added by this patch and I do not know how can I make checkpatch.pl happy without adding a helper for per_cpu_ptr(tr->trace_buffer.data).

6/7: Incorporated the fix from Steven (thanks!).

Oleg.

 kernel/trace/trace.c |  194 +++++++++++++++++++++-----------------------------
 kernel/trace/trace.h |    8 --
 2 files changed, 80 insertions(+), 122 deletions(-)