Skip to content

RFC optimize ctx switch with rb-tree

David Carrillo-Cisneros lkml oe-lkp 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 RFC Latest6 patches 24 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/6perf/core: create active and inactive event groupsinclude/linux/perf_event.h kernel/events/core.c+82 -174 replies
2/6perf/core: add a rb-tree index to inactive_groupsinclude/linux/perf_event.h kernel/events/core.c+87 -04 replies
3/6perf/core: use rb-tree to sched in event groupskernel/events/core.c+190 -29 replies
4/6perf/core: avoid rb-tree traversal when no inactive eventsinclude/linux/perf_event.h kernel/events/core.c+17 -20 replies
5/6perf/core: rotation no longer necessary. Behavior has changed. Bewarekernel/events/core.c+5 -170 replies
6/6perf/core: use rb-tree index to optimize filtered perf_iterate_ctxkernel/events/core.c+47 -170 replies

Reviews trailers per patch

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

Read the v1 thread

Cover letter [RFC 0/6] optimize ctx switch with rb-tree

Following the discussion in:
https://patchwork.kernel.org/patch/9420035/

This is is an early version of a series of perf context switches optimizations.

The main idea is to create and maintain a list of inactive events sorted by timestamp, and a rb-tree index to index it. The rb-tree's key are {cpu,flexible,stamp} for task contexts and {cgroup,flexible,stamp} for CPU contexts.

The rb-tree provides functions to find intervals in the inactive event list so that ctx_sched_in only has to visit the events that can be potentially be scheduled (i.e. avoid iterations over events bound to CPUs or cgroups that are not current).

Since the inactive list is sort by timestamp, rotation can be done by simply scheduling out and in the events. This implies that each timer interrupt, the events will rotate by q events (where q is the number of hardware counters). This changes the current behavior of rotation. Feedback welcome!

I haven't profiled the new approach. I am only assuming it will be superior when the number of per-cpu or distict cgroup events is large.

The last patch shows how perf_iterate_ctx can use the new rb-tree index to reduce the number of visited events. I haven't looked carefully if locking and other things are correct.

If this changes are in the right direction. A next version could remove some existing code, specifically the lists ctx->pinned_groups and ctx->flexible_groups could be removed. Also, event_filter_match could be simplified when called on events groups filtered using the rb-tree, since both perform similar checks.

David Carrillo-Cisneros (6):
perf/core: create active and inactive event groups perf/core: add a rb-tree index to inactive_groups perf/core: use rb-tree to sched in event groups
perf/core: avoid rb-tree traversal when no inactive events perf/core: rotation no longer neccesary. Behavior has changed. Beware perf/core: use rb-tree index to optimize filtered perf_iterate_ctx

 include/linux/perf_event.h |  13 ++
 kernel/events/core.c       | 466 +++++++++++++++++++++++++++++++++++++++------
 2 files changed, 426 insertions(+), 53 deletions(-)
Signature · 1 line
2.11.0.390.gc69c2f50cf-goog