--- sched_fair-old.c 2007-10-03 12:45:17.010306000 +0200 +++ sched_fair.c 2007-10-03 12:44:46.899851000 +0200 @@ -803,7 +803,35 @@ static void yield_task_fair(struct rq *r update_curr(cfs_rq); return; + } else if (sysctl_sched_compat_yield == 2) { + unsigned long ideal_runtime, delta_exec, + delta_exec_weighted; + + __update_rq_clock(rq); + /* + * Update run-time statistics of the 'current'. + */ + update_curr(cfs_rq); + + /* + * Emulate the effect of us being preempted + * by scheduler_tick(). + */ + ideal_runtime = sched_slice(cfs_rq, curr); + delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; + + if (ideal_runtime > delta_exec) { + delta_exec_weighted = ideal_runtime - delta_exec; + + if (unlikely(curr->load.weight != NICE_0_LOAD)) { + delta_exec_weighted = calc_delta_fair(delta_exec_weighted, + &se->load); + } + se->vruntime += delta_exec_weighted; + } + return; } + /* * Find the rightmost entry in the rbtree: */