Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=b2449fdc30ccac550344df5e60d38bb8427b109c
Commit:     b2449fdc30ccac550344df5e60d38bb8427b109c
Parent:     cb8c181f288a1157bc717cc7a02412d4d1dc19bc
Author:     Gerrit Renker <[EMAIL PROTECTED]>
AuthorDate: Fri Apr 20 13:02:55 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Apr 25 22:28:54 2007 -0700

    [DCCP]: Fix bug in the calculation of very low sending rates
    
    This fixes an error in the calculation of t_ipi when X converges towards
    very low sending rates (between 1 and 64 bytes per second).
    
    Although this case may not sound likely, it can be reproduced by connecting,
    hitting enter (1 byte sent) and waiting for some time, during which the
    nofeedback timer halves the sending rate until finally it reaches the region
    1..64 bytes/sec. Computing X is handled correctly (tested separately); but 
by
    dividing X _before_ entering the calculation of t_ipi, X becomes zero as
    a result.  This in turn triggers a BUG condition caught in scaled_div().
    
    Fixed by replacing with equivalent statement and explicit typecast for good
    measure.
    
    Calculation verified and effect of patch tested - reduced never below 1 byte
    per 64 seconds afterwards, i.e. not allowing divide-by-zero.
    
    Signed-off-by: Gerrit Renker <[EMAIL PROTECTED]>
    Acked-by: Ian McDonald <[EMAIL PROTECTED]>
    Signed-off-by: Arnaldo Carvalho de Melo <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/dccp/ccids/ccid3.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index c3abd76..d7d9ce7 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -102,8 +102,8 @@ static inline u64 rfc3390_initial_rate(struct sock *sk)
 static inline void ccid3_update_send_interval(struct ccid3_hc_tx_sock *hctx)
 {
        /* Calculate new t_ipi = s / X_inst (X_inst is in 64 * bytes/second) */
-       hctx->ccid3hctx_t_ipi = scaled_div(hctx->ccid3hctx_s,
-                                          hctx->ccid3hctx_x >> 6);
+       hctx->ccid3hctx_t_ipi = scaled_div32(((u64)hctx->ccid3hctx_s) << 6,
+                                            hctx->ccid3hctx_x);
 
        /* Calculate new delta by delta = min(t_ipi / 2, t_gran / 2) */
        hctx->ccid3hctx_delta = min_t(u32, hctx->ccid3hctx_t_ipi / 2,
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to