diff -Nurp linux-2.6.22-200/kernel/vserver/sched.c linux-2.6.22-210/kernel/vserver/sched.c --- linux-2.6.22-200/kernel/vserver/sched.c 2008-02-01 10:44:49.000000000 -0500 +++ linux-2.6.22-210/kernel/vserver/sched.c 2008-02-01 11:14:33.000000000 -0500 @@ -89,6 +89,7 @@ int vx_tokens_recalc(struct _vx_sched_pc #ifdef CONFIG_VSERVER_HARDCPU delta_min[0] = delta - integral; vxd_check_range(delta_min[0], 0, sched_pc->interval[0]); + delta = integral; #endif /* advance time */ sched_pc->norm_time += delta; @@ -161,10 +162,12 @@ on_hold: /* next interval? */ if (!sched_pc->fill_rate[0]) delta_min[0] = HZ; - else if (tokens > sched_pc->fill_rate[0]) - delta_min[0] += sched_pc->interval[0] * - tokens / sched_pc->fill_rate[0]; - else + else if (tokens > sched_pc->fill_rate[0]) { + delta_min[0] = sched_pc->interval[0] * + (tokens / sched_pc->fill_rate[0]) - delta_min[0]; + if (tokens % sched_pc->fill_rate[0]) + delta_min[0] += sched_pc->interval[0]; + } else delta_min[0] = sched_pc->interval[0] - delta_min[0]; vxd_check_range(delta_min[0], 0, INT_MAX);