On 4 February 2015 at 22:11, Eric Dumazet <eric.dumazet@xxxxxxxxx> wrote: > I do not see how a TSO patch could hurt a flow not using TSO/GSO. > > This makes no sense. Hmm.. @@ -2018,8 +2053,8 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, * of queued bytes to ensure line rate. * One example is wifi aggregation (802.11 AMPDU) */ - limit = max_t(unsigned int, sysctl_tcp_limit_output_bytes, - sk->sk_pacing_rate >> 10); + limit = max(2 * skb->truesize, sk->sk_pacing_rate >> 10); + limit = min_t(u32, limit, sysctl_tcp_limit_output_bytes); if (atomic_read(&sk->sk_wmem_alloc) > limit) { set_bit(TSQ_THROTTLED, &tp->tsq_flags); Doesn't this effectively invert how tcp_limit_output_bytes is used? This would explain why raising the limit wasn't changing anything anymore when you asked me do so. Only decreasing it yielded any change. I've added a printk to show up the new and old values. Excerpt from logs: [ 114.782740] (4608 39126 131072 = 39126) vs (131072 39126 = 131072) (2*truesize, pacing_rate, tcp_limit = limit) vs (tcp_limit, pacing_rate = limit) Reverting this patch hunk alone fixes my TCP problem. Not that I'm saying the old logic was correct (it seems it wasn't, a limit should be applied as min(value, max_value), right?). Anyway the change doesn't seem to be TSO-only oriented so it would explain the "makes no sense". Michał -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html