From 1e496fdbc2589e47dc3039cb58550c58e9c9720a Mon Sep 17 00:00:00 2001
From: Andy Bavier <acb@cs.princeton.edu>
Date: Mon, 31 Mar 2008 22:17:42 +0000
Subject: [PATCH] Repeat my fix for fair share token bucket

---
 linux-2.6-210-vserver-cpu-sched.patch | 33 ++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 8 deletions(-)

diff --git a/linux-2.6-210-vserver-cpu-sched.patch b/linux-2.6-210-vserver-cpu-sched.patch
index fac58b767..154d6eaf2 100644
--- a/linux-2.6-210-vserver-cpu-sched.patch
+++ b/linux-2.6-210-vserver-cpu-sched.patch
@@ -1,15 +1,16 @@
 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;
+--- linux-2.6.22-200/kernel/vserver/sched.c	2008-03-20 17:15:35.000000000 -0400
++++ linux-2.6.22-210/kernel/vserver/sched.c	2008-03-31 17:55:55.000000000 -0400
+@@ -91,7 +91,7 @@ int vx_tokens_recalc(struct _vx_sched_pc
  		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:
+-		sched_pc->norm_time += delta;
++		sched_pc->norm_time += integral;
+ 
+ 		/* add tokens */
+ 		sched_pc->tokens += tokens;
+@@ -161,10 +161,12 @@ on_hold:
  	/* next interval? */
  	if (!sched_pc->fill_rate[0])
  		delta_min[0] = HZ;
@@ -26,3 +27,19 @@ diff -Nurp linux-2.6.22-200/kernel/vserver/sched.c linux-2.6.22-210/kernel/vserv
  		delta_min[0] = sched_pc->interval[0] - delta_min[0];
  	vxd_check_range(delta_min[0], 0, INT_MAX);
  
+@@ -175,10 +177,12 @@ on_hold:
+ 	/* next interval? */
+ 	if (!sched_pc->fill_rate[1])
+ 		delta_min[1] = HZ;
+-	else if (tokens > sched_pc->fill_rate[1])
++	else if (tokens > sched_pc->fill_rate[1]) {
+ 		delta_min[1] += sched_pc->interval[1] *
+-			tokens / sched_pc->fill_rate[1];
+-	else
++			tokens / sched_pc->fill_rate[1] - delta_min[1];
++		if (tokens % sched_pc->fill_rate[1]) 
++			delta_min[1] += sched_pc->interval[1];
++	} else
+ 		delta_min[1] = sched_pc->interval[1] - delta_min[1];
+ 	vxd_check_range(delta_min[1], 0, INT_MAX);
+ 
-- 
2.47.0