Skip to content

Teach perf_trace_##call() to check hlist_empty(perf_events)

Oleg Nesterov lkml 2 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v1 Latest posting 2/23 patches 5 repliesIn review
  2. v1 posting 1/23 patches 15 repliesSuperseded

Patches in v1 posting 2/2 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/3tracing/perf: expand TRACE_EVENT(sched_stat_runtime)include/trace/events/sched.h include/trace/ftrace.h+8 -50 replies
2/3tracing/perf: reimplement TP_perf_assign() logicinclude/trace/events/sched.h include/trace/ftrace.h+14 -210 replies
3/3tracing/perf: Avoid perf_trace_buf_*() in perf_trace_##call() when possibleinclude/trace/ftrace.h+6 -10 replies

Reviews trailers per patch

None of the 3 patches has a Reviewed-by or Acked-by.

PatchSteven RostedtDavid Ahern
SeriesReviewed-and-Acked-by T-b
1/3
2/3
3/3

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v1 thread

Cover letter [PATCH RESEND 0/3] Teach perf_trace_##call() to check hlist_empty(perf_events)

Hello.

The patches are the same, I only tried to update the changelogs a bit. I am also quoting my old email below, to explain what this hack tries to do.

Say, "perf record -e sched:sched_switch -p1".

Every task except /sbin/init will do perf_trace_sched_switch() and perf_trace_buf_prepare() + perf_trace_buf_submit for no reason(), it doesn't have a counter.

So it makes sense to add the fast-path check at the start of perf_trace_##call(),

if (hlist_empty(event_call->perf_events))
return;

The problem is, we should not do this if __task != NULL (iow, if DECLARE_EVENT_CLASS() uses __perf_task()), perf_tp_event() has the additional code for this case.

So we should do

if (!__task && hlist_empty(event_call->perf_events))
return;

But __task is changed by "{ assign; }" block right before perf_trace_buf_submit(). Too late for the fast-path check, we already called perf_trace_buf_prepare/fetch_regs.

So. After 2/3 __perf_task() (and __perf_count/addr) is called when ftrace_get_offsets_##call(args) evaluates the arguments, and we can check !__task && hlist_empty() right after that.

Oleg.