[PKT_SCHED]: Fix regression in PSCHED_TADD{,2}.
authorGuillaume Chazarain <guichaz@yahoo.fr>
Mon, 24 Jul 2006 06:37:24 +0000 (23:37 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Mon, 24 Jul 2006 19:44:23 +0000 (12:44 -0700)
In PSCHED_TADD and PSCHED_TADD2, if delta is less than tv.tv_usec (so,
less than USEC_PER_SEC too) then tv_res will be smaller than tv. The
affectation "(tv_res).tv_usec = __delta;" is wrong.  The fix is to
revert to the original code before
4ee303dfeac6451b402e3d8512723d3a0f861857 and change the 'if' in
'while'.

[Shuya MAEDA: "while (__delta >= USEC_PER_SEC){ ... }" instead of
"while (__delta > USEC_PER_SEC){ ... }"]

Signed-off-by: Guillaume Chazarain <guichaz@yahoo.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/pkt_sched.h

index 1925c65e617b9eddae6e199f660a72232e750235..f6afee73235de8ca5e3ce395a2d53f1ee8c9b650 100644 (file)
@@ -169,23 +169,17 @@ psched_tod_diff(int delta_sec, int bound)
 
 #define PSCHED_TADD2(tv, delta, tv_res) \
 ({ \
-          int __delta = (delta); \
-          (tv_res) = (tv); \
-          while(__delta >= USEC_PER_SEC){ \
-                (tv_res).tv_sec++; \
-                __delta -= USEC_PER_SEC; \
-          } \
+          int __delta = (tv).tv_usec + (delta); \
+          (tv_res).tv_sec = (tv).tv_sec; \
+          while (__delta >= USEC_PER_SEC) { (tv_res).tv_sec++; __delta -= USEC_PER_SEC; } \
           (tv_res).tv_usec = __delta; \
 })
 
 #define PSCHED_TADD(tv, delta) \
 ({ \
-          int __delta = (delta); \
-          while(__delta >= USEC_PER_SEC){ \
-                (tv).tv_sec++; \
-                __delta -= USEC_PER_SEC; \
-          } \
-          (tv).tv_usec = __delta; \
+          (tv).tv_usec += (delta); \
+          while ((tv).tv_usec >= USEC_PER_SEC) { (tv).tv_sec++; \
+                (tv).tv_usec -= USEC_PER_SEC; } \
 })
 
 /* Set/check that time is in the "past perfect";