| From 81cad5a7f3d8ba936b5551baeed7cc21f8e41be2 Mon Sep 17 00:00:00 2001 |
| From: Eric Dumazet <edumazet@google.com> |
| Date: Sat, 7 Sep 2013 12:02:57 -0700 |
| Subject: net: fix multiqueue selection |
| |
| From: Eric Dumazet <edumazet@google.com> |
| |
| [ Upstream commit 50d1784ee4683f073c0362ee360bfae7a3333d6c ] |
| |
| 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> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| 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 |
| @@ -348,7 +348,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; |
| } |