Repeat my fix for fair share token bucket
[linux-2.6.git] / linux-2.6-210-vserver-cpu-sched.patch
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-20 17:15:35.000000000 -0400
3 +++ linux-2.6.22-210/kernel/vserver/sched.c     2008-03-31 17:55:55.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]);
6  #endif
7                 /* advance time */
8 -               sched_pc->norm_time += delta;
9 +               sched_pc->norm_time += integral;
10  
11                 /* add tokens */
12                 sched_pc->tokens += tokens;
13 @@ -161,10 +161,12 @@ on_hold:
14         /* next interval? */
15         if (!sched_pc->fill_rate[0])
16                 delta_min[0] = HZ;
17 -       else if (tokens > sched_pc->fill_rate[0])
18 -               delta_min[0] += sched_pc->interval[0] *
19 -                       tokens / sched_pc->fill_rate[0];
20 -       else
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]; 
26 +       } else 
27                 delta_min[0] = sched_pc->interval[0] - delta_min[0];
28         vxd_check_range(delta_min[0], 0, INT_MAX);
29  
30 @@ -175,10 +177,12 @@ on_hold:
31         /* next interval? */
32         if (!sched_pc->fill_rate[1])
33                 delta_min[1] = HZ;
34 -       else if (tokens > sched_pc->fill_rate[1])
35 +       else if (tokens > sched_pc->fill_rate[1]) {
36                 delta_min[1] += sched_pc->interval[1] *
37 -                       tokens / sched_pc->fill_rate[1];
38 -       else
39 +                       tokens / sched_pc->fill_rate[1] - delta_min[1];
40 +               if (tokens % sched_pc->fill_rate[1]) 
41 +                       delta_min[1] += sched_pc->interval[1];
42 +       } else
43                 delta_min[1] = sched_pc->interval[1] - delta_min[1];
44         vxd_check_range(delta_min[1], 0, INT_MAX);
45