net: Use sk_tx_queue_mapping for connected sockets
[firefly-linux-kernel-4.4.55.git] / net / core / dev.c
index 560c8c9c03ab3ccfef96bfd1eed5fc195c4b1a75..fa88dcd476d6f75e6505b2a2d1c04cdf150be08e 100644 (file)
@@ -1791,13 +1791,25 @@ EXPORT_SYMBOL(skb_tx_hash);
 static struct netdev_queue *dev_pick_tx(struct net_device *dev,
                                        struct sk_buff *skb)
 {
-       const struct net_device_ops *ops = dev->netdev_ops;
-       u16 queue_index = 0;
+       u16 queue_index;
+       struct sock *sk = skb->sk;
+
+       if (sk_tx_queue_recorded(sk)) {
+               queue_index = sk_tx_queue_get(sk);
+       } else {
+               const struct net_device_ops *ops = dev->netdev_ops;
 
-       if (ops->ndo_select_queue)
-               queue_index = ops->ndo_select_queue(dev, skb);
-       else if (dev->real_num_tx_queues > 1)
-               queue_index = skb_tx_hash(dev, skb);
+               if (ops->ndo_select_queue) {
+                       queue_index = ops->ndo_select_queue(dev, skb);
+               } else {
+                       queue_index = 0;
+                       if (dev->real_num_tx_queues > 1)
+                               queue_index = skb_tx_hash(dev, skb);
+
+                       if (sk && sk->sk_dst_cache)
+                               sk_tx_queue_set(sk, queue_index);
+               }
+       }
 
        skb_set_queue_mapping(skb, queue_index);
        return netdev_get_tx_queue(dev, queue_index);
@@ -2288,6 +2300,9 @@ int netif_receive_skb(struct sk_buff *skb)
        int ret = NET_RX_DROP;
        __be16 type;
 
+       if (!skb->tstamp.tv64)
+               net_timestamp(skb);
+
        if (skb->vlan_tci && vlan_hwaccel_do_receive(skb))
                return NET_RX_SUCCESS;
 
@@ -2295,9 +2310,6 @@ int netif_receive_skb(struct sk_buff *skb)
        if (netpoll_receive_skb(skb))
                return NET_RX_DROP;
 
-       if (!skb->tstamp.tv64)
-               net_timestamp(skb);
-
        if (!skb->iif)
                skb->iif = skb->dev->ifindex;
 
@@ -2604,20 +2616,13 @@ EXPORT_SYMBOL(napi_reuse_skb);
 
 struct sk_buff *napi_get_frags(struct napi_struct *napi)
 {
-       struct net_device *dev = napi->dev;
        struct sk_buff *skb = napi->skb;
 
        if (!skb) {
-               skb = netdev_alloc_skb(dev, GRO_MAX_HEAD + NET_IP_ALIGN);
-               if (!skb)
-                       goto out;
-
-               skb_reserve(skb, NET_IP_ALIGN);
-
-               napi->skb = skb;
+               skb = netdev_alloc_skb_ip_align(napi->dev, GRO_MAX_HEAD);
+               if (skb)
+                       napi->skb = skb;
        }
-
-out:
        return skb;
 }
 EXPORT_SYMBOL(napi_get_frags);
@@ -4836,6 +4841,12 @@ int register_netdevice(struct net_device *dev)
                dev->features |= NETIF_F_GSO;
 
        netdev_initialize_kobject(dev);
+
+       ret = call_netdevice_notifiers(NETDEV_POST_INIT, dev);
+       ret = notifier_to_errno(ret);
+       if (ret)
+               goto err_uninit;
+
        ret = netdev_register_kobject(dev);
        if (ret)
                goto err_uninit;
@@ -5483,7 +5494,7 @@ unsigned long netdev_increment_features(unsigned long all, unsigned long one,
        one |= NETIF_F_ALL_CSUM;
 
        one |= all & NETIF_F_ONE_FOR_ALL;
-       all &= one | NETIF_F_LLTX | NETIF_F_GSO;
+       all &= one | NETIF_F_LLTX | NETIF_F_GSO | NETIF_F_UFO;
        all |= one & mask & NETIF_F_ONE_FOR_ALL;
 
        return all;