• Xiaoliang (David) Wei's avatar
    [TCP] tcp_highspeed: Fix AI updates. · 6150c22e
    Xiaoliang (David) Wei authored
    I think there is still a problem with the AIMD parameter update in
    HighSpeed TCP code.
    
    Line 125~138 of the code (net/ipv4/tcp_highspeed.c):
    
    	/* Update AIMD parameters */
    	if (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd) {
    		while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd &&
    		       ca->ai < HSTCP_AIMD_MAX - 1)
    			ca->ai++;
    	} else if (tp->snd_cwnd < hstcp_aimd_vals[ca->ai].cwnd) {
    		while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd &&
    		       ca->ai > 0)
    			ca->ai--;
    
    In fact, the second part (decreasing ca->ai) never decreases since the
    while loop's inequality is in the reverse direction. This leads to
    unfairness with multiple flows (once a flow happens to enjoy a higher
    ca->ai, it keeps enjoying that even its cwnd decreases)
    
    Here is a tentative fix (I also added a comment, trying to keep the
    change clear):
    Acked-by: default avatarStephen Hemminger <shemminger@osdl.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6150c22e
tcp_highspeed.c 5.5 KB