#endif
 }
 
-struct netdev_queue *netdev_pick_tx(struct net_device *dev,
-                                   struct sk_buff *skb)
+u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb)
 {
-       int queue_index;
-       const struct net_device_ops *ops = dev->netdev_ops;
-
-       if (dev->real_num_tx_queues == 1)
-               queue_index = 0;
-       else if (ops->ndo_select_queue) {
-               queue_index = ops->ndo_select_queue(dev, skb);
-               queue_index = dev_cap_txqueue(dev, queue_index);
-       } else {
-               struct sock *sk = skb->sk;
-               queue_index = sk_tx_queue_get(sk);
+       struct sock *sk = skb->sk;
+       int queue_index = sk_tx_queue_get(sk);
 
-               if (queue_index < 0 || skb->ooo_okay ||
-                   queue_index >= dev->real_num_tx_queues) {
-                       int old_index = queue_index;
+       if (queue_index < 0 || skb->ooo_okay ||
+           queue_index >= dev->real_num_tx_queues) {
+               int new_index = get_xps_queue(dev, skb);
+               if (new_index < 0)
+                       new_index = skb_tx_hash(dev, skb);
 
-                       queue_index = get_xps_queue(dev, skb);
-                       if (queue_index < 0)
-                               queue_index = skb_tx_hash(dev, skb);
-
-                       if (queue_index != old_index && sk) {
-                               struct dst_entry *dst =
+               if (queue_index != new_index && sk) {
+                       struct dst_entry *dst =
                                    rcu_dereference_check(sk->sk_dst_cache, 1);
 
-                               if (dst && skb_dst(skb) == dst)
-                                       sk_tx_queue_set(sk, queue_index);
-                       }
+                       if (dst && skb_dst(skb) == dst)
+                               sk_tx_queue_set(sk, queue_index);
+
                }
+
+               queue_index = new_index;
+       }
+
+       return queue_index;
+}
+
+struct netdev_queue *netdev_pick_tx(struct net_device *dev,
+                                   struct sk_buff *skb)
+{
+       int queue_index = 0;
+
+       if (dev->real_num_tx_queues != 1) {
+               const struct net_device_ops *ops = dev->netdev_ops;
+               if (ops->ndo_select_queue)
+                       queue_index = ops->ndo_select_queue(dev, skb);
+               else
+                       queue_index = __netdev_pick_tx(dev, skb);
+               queue_index = dev_cap_txqueue(dev, queue_index);
        }
 
        skb_set_queue_mapping(skb, queue_index);