I do not see how a TSO patch could hurt a flow not using TSO/GSO. This makes no sense. ath10k tx completions being batched/deferred to a tasklet might increase probability to hit this condition in tcp_wfree() : /* If this softirq is serviced by ksoftirqd, we are likely under stress. * Wait until our queues (qdisc + devices) are drained. * This gives : * - less callbacks to tcp_write_xmit(), reducing stress (batches) * - chance for incoming ACK (processed by another cpu maybe) * to migrate this flow (skb->ooo_okay will be eventually set) */ if (wmem >= SKB_TRUESIZE(1) && this_cpu_ksoftirqd() == current) goto out; Meaning tcp stack waits all skbs left qdisc/NIC queues before queuing additional packets. I would try to call skb_orphan() in ath10k if you really want to keep these batches. I have hard time to understand why tx completed packets go through ath10k_htc_rx_completion_handler().. anyway... Most conservative patch would be : diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c index 9c782a42665e1aaf43bfbca441631ee58da50c09..6a36317d6bb0447202dee15528130bd5e21248c4 100644 --- a/drivers/net/wireless/ath/ath10k/htt_rx.c +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c @@ -1642,6 +1642,7 @@ void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb) break; } case HTT_T2H_MSG_TYPE_TX_COMPL_IND: + skb_orphan(skb); spin_lock_bh(&htt->tx_lock); __skb_queue_tail(&htt->tx_compl_q, skb); spin_unlock_bh(&htt->tx_lock); -- 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