diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-09-17 10:07:52 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-09-17 10:07:52 +0000 |
commit | 9158a089836052f275342119b9e2a91de4335dbb (patch) | |
tree | 2ffd454f5240a82466e6fd0eaeabecd7382ab237 /target/linux | |
parent | 5d8cdd84e8ce9e422b22b7e798600778d5188150 (diff) | |
download | upstream-9158a089836052f275342119b9e2a91de4335dbb.tar.gz upstream-9158a089836052f275342119b9e2a91de4335dbb.tar.bz2 upstream-9158a089836052f275342119b9e2a91de4335dbb.zip |
kernel: backport a fix for multiqueue selection to prevent tcp reordering with fair queueing
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
SVN-Revision: 38016
Diffstat (limited to 'target/linux')
-rw-r--r-- | target/linux/generic/patches-3.10/110-net_fix_multiqueue_selection.patch | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/target/linux/generic/patches-3.10/110-net_fix_multiqueue_selection.patch b/target/linux/generic/patches-3.10/110-net_fix_multiqueue_selection.patch new file mode 100644 index 0000000000..6a07ee8c0d --- /dev/null +++ b/target/linux/generic/patches-3.10/110-net_fix_multiqueue_selection.patch @@ -0,0 +1,41 @@ +From: Eric Dumazet <edumazet@google.com> + +commit 416186fbf8c5b4e4465 ("net: Split core bits of netdev_pick_tx +into __netdev_pick_tx") added a bug that disables caching of queue +index in the socket. + +This is the source of packet reorders for TCP flows, and +again this is happening more often when using FQ pacing. + +Old code was doing + +if (queue_index != old_index) + sk_tx_queue_set(sk, queue_index); + +Alexander renamed the variables but forgot to change sk_tx_queue_set() +2nd parameter. + +if (queue_index != new_index) + sk_tx_queue_set(sk, queue_index); + +This means we store -1 over and over in sk->sk_tx_queue_mapping + +Signed-off-by: Eric Dumazet <edumazet@google.com> +Cc: Alexander Duyck <alexander.h.duyck@intel.com> +Acked-by: Alexander Duyck <alexander.h.duyck@intel.com> + +--- +net/core/flow_dissector.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/net/core/flow_dissector.c ++++ b/net/core/flow_dissector.c +@@ -347,7 +347,7 @@ u16 __netdev_pick_tx(struct net_device * + + if (queue_index != new_index && sk && + rcu_access_pointer(sk->sk_dst_cache)) +- sk_tx_queue_set(sk, queue_index); ++ sk_tx_queue_set(sk, new_index); + + queue_index = new_index; + } |