[lkml]   [2008]   [Apr]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    SubjectTCP: Let skbs grow over a page on fast peers
    -stable review patch.  If anyone has any objections, please let us know.

    From: Herbert Xu <>

    Upstream commit: 69d1506731168d6845a76a303b2c45f7c05f3f2c

    While testing the virtio-net driver on KVM with TSO I noticed
    that TSO performance with a 1500 MTU is significantly worse
    compared to the performance of non-TSO with a 16436 MTU. The
    packet dump shows that most of the packets sent are smaller
    than a page.

    Looking at the code this actually is quite obvious as it always
    stop extending the packet if it's the first packet yet to be
    sent and if it's larger than the MSS. Since each extension is
    bound by the page size, this means that (given a 1500 MTU) we're
    very unlikely to construct packets greater than a page, provided
    that the receiver and the path is fast enough so that packets can
    always be sent immediately.

    The fix is also quite obvious. The push calls inside the loop
    is just an optimisation so that we don't end up doing all the
    sending at the end of the loop. Therefore there is no specific
    reason why it has to do so at MSS boundaries. For TSO, the
    most natural extension of this optimisation is to do the pushing
    once the skb exceeds the TSO size goal.

    This is what the patch does and testing with KVM shows that the
    TSO performance with a 1500 MTU easily surpasses that of a 16436
    MTU and indeed the packet sizes sent are generally larger than

    I don't see any obvious downsides for slower peers or connections,
    but it would be prudent to test this extensively to ensure that
    those cases don't regress.

    Signed-off-by: Herbert Xu <>
    Signed-off-by: David S. Miller <>
    Signed-off-by: Chris Wright <>
    net/ipv4/tcp.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/net/ipv4/tcp.c
    +++ b/net/ipv4/tcp.c
    @@ -583,7 +583,7 @@ new_segment:
    if (!(psize -= copy))
    goto out;

    - if (skb->len < mss_now || (flags & MSG_OOB))
    + if (skb->len < size_goal || (flags & MSG_OOB))

    if (forced_push(tp)) {
    @@ -829,7 +829,7 @@ new_segment:
    if ((seglen -= copy) == 0 && iovlen == 0)
    goto out;

    - if (skb->len < mss_now || (flags & MSG_OOB))
    + if (skb->len < size_goal || (flags & MSG_OOB))

    if (forced_push(tp)) {

     \ /
      Last update: 2008-04-17 03:17    [W:0.022 / U:1.524 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site