How does CFS prevent a long sleeping task from occupying the CPU?
Just found it out by myself:

each time CFS places a new/old task into the rbtree it does not reuse its old runtime but rather assigns a new one:
se-&gt;vruntime = max(se-&gt;vruntime, vruntime) where vruntime is the current minimum virtual runtime.

That is basically what is expressed through "sleeper fairness": each task gets a fair share of CPU time, no matter whether it is running or not.