[DCCP] CCID2: Code optimizations
authorAndrea Bittau <a.bittau@cs.ucl.ac.uk>
Thu, 16 Nov 2006 16:28:40 +0000 (14:28 -0200)
committerDavid S. Miller <davem@sunset.davemloft.net>
Sun, 3 Dec 2006 05:23:52 +0000 (21:23 -0800)
These are code optimizations which are relevant when dealing with large
windows.  They are not coded the way I would like to, but they do the job for
the short-term.  This patch should be more neat.

Commiter note: Changed the seqno comparisions to use {after,before}48 to handle
               wrapping.

Signed-off-by: Andrea Bittau <a.bittau@cs.ucl.ac.uk>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
net/dccp/ccids/ccid2.c
net/dccp/ccids/ccid2.h

index 162032baeac0acb4fddece61def024fe370c684f..6533cb2f27bbda1a122ae7832454c20b977a41b5 100644 (file)
@@ -619,7 +619,17 @@ static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
        }
 
        ackno = DCCP_SKB_CB(skb)->dccpd_ack_seq;
-       seqp = hctx->ccid2hctx_seqh->ccid2s_prev;
+       if (after48(ackno, hctx->ccid2hctx_high_ack))
+               hctx->ccid2hctx_high_ack = ackno;
+
+       seqp = hctx->ccid2hctx_seqt;
+       while (before48(seqp->ccid2s_seq, ackno)) {
+               seqp = seqp->ccid2s_next;
+               if (seqp == hctx->ccid2hctx_seqh) {
+                       seqp = hctx->ccid2hctx_seqh->ccid2s_prev;
+                       break;
+               }
+       }
 
        /* If in slow-start, cwnd can increase at most Ack Ratio / 2 packets for
         * this single ack.  I round up.
@@ -697,7 +707,14 @@ static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
        /* The state about what is acked should be correct now
         * Check for NUMDUPACK
         */
-       seqp = hctx->ccid2hctx_seqh->ccid2s_prev;
+       seqp = hctx->ccid2hctx_seqt;
+       while (before48(seqp->ccid2s_seq, hctx->ccid2hctx_high_ack)) {
+               seqp = seqp->ccid2s_next;
+               if (seqp == hctx->ccid2hctx_seqh) {
+                       seqp = hctx->ccid2hctx_seqh->ccid2s_prev;
+                       break;
+               }
+       }
        done = 0;
        while (1) {
                if (seqp->ccid2s_acked) {
@@ -771,6 +788,7 @@ static int ccid2_hc_tx_init(struct ccid *ccid, struct sock *sk)
        hctx->ccid2hctx_lastrtt  = 0;
        hctx->ccid2hctx_rpdupack = -1;
        hctx->ccid2hctx_last_cong = jiffies;
+       hctx->ccid2hctx_high_ack = 0;
 
        hctx->ccid2hctx_rtotimer.function = &ccid2_hc_tx_rto_expire;
        hctx->ccid2hctx_rtotimer.data     = (unsigned long)sk;
index 5b2ef4acb300de407396a90d7a4f7208b2a85d63..a97a8992730884aa6adf89b3d653dd2b000b4c9f 100644 (file)
@@ -72,6 +72,7 @@ struct ccid2_hc_tx_sock {
        int                     ccid2hctx_rpdupack;
        int                     ccid2hctx_sendwait;
        unsigned long           ccid2hctx_last_cong;
+       u64                     ccid2hctx_high_ack;
 };
 
 struct ccid2_hc_rx_sock {