1 diff -Nurp linux-2.6.22-200/kernel/vserver/sched.c linux-2.6.22-210/kernel/vserver/sched.c
2 --- linux-2.6.22-200/kernel/vserver/sched.c 2008-03-31 17:57:47.000000000 -0400
3 +++ linux-2.6.22-210/kernel/vserver/sched.c 2008-03-31 18:22:46.000000000 -0400
4 @@ -91,7 +91,7 @@ int vx_tokens_recalc(struct _vx_sched_pc
5 vxd_check_range(delta_min[0], 0, sched_pc->interval[0]);
8 - sched_pc->norm_time += delta;
9 + sched_pc->norm_time += integral;
12 sched_pc->tokens += tokens;
13 @@ -161,10 +161,12 @@ on_hold:
15 if (!sched_pc->fill_rate[0])
17 - else if (tokens > sched_pc->fill_rate[0])
18 - delta_min[0] += sched_pc->interval[0] *
19 - tokens / sched_pc->fill_rate[0];
21 + else if (tokens > sched_pc->fill_rate[0]) {
22 + delta_min[0] = sched_pc->interval[0] *
23 + (tokens / sched_pc->fill_rate[0]) - delta_min[0];
24 + if (tokens % sched_pc->fill_rate[0])
25 + delta_min[0] += sched_pc->interval[0];
27 delta_min[0] = sched_pc->interval[0] - delta_min[0];
28 vxd_check_range(delta_min[0], 0, INT_MAX);
30 @@ -175,10 +177,12 @@ on_hold:
32 if (!sched_pc->fill_rate[1])
34 - else if (tokens > sched_pc->fill_rate[1])
35 - delta_min[1] += sched_pc->interval[1] *
36 - tokens / sched_pc->fill_rate[1];
38 + else if (tokens > sched_pc->fill_rate[1]) {
39 + delta_min[1] = sched_pc->interval[1] *
40 + (tokens / sched_pc->fill_rate[1]) - delta_min[1];
41 + if (tokens % sched_pc->fill_rate[1])
42 + delta_min[1] += sched_pc->interval[1];
44 delta_min[1] = sched_pc->interval[1] - delta_min[1];
45 vxd_check_range(delta_min[1], 0, INT_MAX);