Skip to contentSkip to conversation

perf and cgroup event scheduling

DISCUSSION Peter Zijlstra 2 participants 3 messages Mar 31, 2011

lore
Share & tools
lore
#0 lore raw

Hi Stephane,

while trying to make sense of various other fun event scheduling issues, I noticed that perf_cgroup_switch() isn't always doing the right thing.

So we typically want to schedule: CPU-pinned, TASK-pinned, CPU-flexible TASK-flexible, however the current code doesn't respect that.

In particular perf_cgroup_sched_in() is placed wrong, it should be _before_ we schedule in the task contexts.

There's further complications with things like perf_install_in_context() and perf_cgroup_move(), but those are either rare or 'interesting' to fix.

#1 lore raw

Peter,

Quoted 8 lines · Peter Zijlstra

Hi Stephane,

while trying to make sense of various other fun event scheduling issues, I noticed that perf_cgroup_switch() isn't always doing the right thing.

So we typically want to schedule: CPU-pinned, TASK-pinned, CPU-flexible TASK-flexible, however the current code doesn't respect that.

Unfortunately, you are right ;-). I think we should try to centralize the scheduling
of per-cpu and per-thread event in a single function that goes through the priority
list. In certain cases, we would sched out and back in per-thread events, but that
would be the only to maintain the priority scheme. I will look into that.

In the meantime, yesterday, I found and fixed one potential kernel crash problem related to mixing cgroup + per-thread events. I will be posting the patch shortly.

Quoted 9 lines

In particular perf_cgroup_sched_in() is placed wrong, it should be _before_ we schedule in the task contexts.

There's further complications with things like perf_install_in_context() and perf_cgroup_move(), but those are either rare or 'interesting' to fix.

#2 lore raw
Quoted 11 lines · Stephane Eranian

Peter,

Quoted 8 lines · Peter Zijlstra

Hi Stephane,

while trying to make sense of various other fun event scheduling issues, I noticed that perf_cgroup_switch() isn't always doing the right thing.

So we typically want to schedule: CPU-pinned, TASK-pinned, CPU-flexible TASK-flexible, however the current code doesn't respect that.

Quoted 7 lines

Unfortunately, you are right ;-). I think we should try to centralize the scheduling
of per-cpu and per-thread event in a single function that goes through the priority
list. In certain cases, we would sched out and back in per-thread events, but that
would be the only to maintain the priority scheme. I will look into that.

I've done something near to that here:
https://lkml.org/lkml/2011/3/31/232

but that patch is very fresh and not tested at all.

Quoted 4 lines

In the meantime, yesterday, I found and fixed one potential kernel crash problem related to mixing cgroup + per-thread events. I will be posting the patch shortly.

Looking fwd to that, Thanks!