Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[platform/kernel/linux-starfive.git] / net / core / dev.c
index 722d50d..7542848 100644 (file)
@@ -162,6 +162,9 @@ static struct list_head offload_base __read_mostly;
 static int netif_rx_internal(struct sk_buff *skb);
 static int call_netdevice_notifiers_info(unsigned long val,
                                         struct netdev_notifier_info *info);
+static int call_netdevice_notifiers_extack(unsigned long val,
+                                          struct net_device *dev,
+                                          struct netlink_ext_ack *extack);
 static struct napi_struct *napi_by_id(unsigned int napi_id);
 
 /*
@@ -1361,7 +1364,7 @@ void netdev_notify_peers(struct net_device *dev)
 }
 EXPORT_SYMBOL(netdev_notify_peers);
 
-static int __dev_open(struct net_device *dev)
+static int __dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
 {
        const struct net_device_ops *ops = dev->netdev_ops;
        int ret;
@@ -1377,7 +1380,7 @@ static int __dev_open(struct net_device *dev)
         */
        netpoll_poll_disable(dev);
 
-       ret = call_netdevice_notifiers(NETDEV_PRE_UP, dev);
+       ret = call_netdevice_notifiers_extack(NETDEV_PRE_UP, dev, extack);
        ret = notifier_to_errno(ret);
        if (ret)
                return ret;
@@ -1406,7 +1409,8 @@ static int __dev_open(struct net_device *dev)
 
 /**
  *     dev_open        - prepare an interface for use.
- *     @dev:   device to open
+ *     @dev: device to open
+ *     @extack: netlink extended ack
  *
  *     Takes a device from down to up state. The device's private open
  *     function is invoked and then the multicast lists are loaded. Finally
@@ -1416,14 +1420,14 @@ static int __dev_open(struct net_device *dev)
  *     Calling this function on an active interface is a nop. On a failure
  *     a negative errno code is returned.
  */
-int dev_open(struct net_device *dev)
+int dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
 {
        int ret;
 
        if (dev->flags & IFF_UP)
                return 0;
 
-       ret = __dev_open(dev);
+       ret = __dev_open(dev, extack);
        if (ret < 0)
                return ret;
 
@@ -1733,6 +1737,18 @@ static int call_netdevice_notifiers_info(unsigned long val,
        return raw_notifier_call_chain(&netdev_chain, val, info);
 }
 
+static int call_netdevice_notifiers_extack(unsigned long val,
+                                          struct net_device *dev,
+                                          struct netlink_ext_ack *extack)
+{
+       struct netdev_notifier_info info = {
+               .dev = dev,
+               .extack = extack,
+       };
+
+       return call_netdevice_notifiers_info(val, &info);
+}
+
 /**
  *     call_netdevice_notifiers - call all network notifier blocks
  *      @val: value passed unmodified to notifier function
@@ -1744,11 +1760,7 @@ static int call_netdevice_notifiers_info(unsigned long val,
 
 int call_netdevice_notifiers(unsigned long val, struct net_device *dev)
 {
-       struct netdev_notifier_info info = {
-               .dev = dev,
-       };
-
-       return call_netdevice_notifiers_info(val, &info);
+       return call_netdevice_notifiers_extack(val, dev, NULL);
 }
 EXPORT_SYMBOL(call_netdevice_notifiers);
 
@@ -3096,10 +3108,17 @@ EXPORT_SYMBOL(__skb_gso_segment);
 
 /* Take action when hardware reception checksum errors are detected. */
 #ifdef CONFIG_BUG
-void netdev_rx_csum_fault(struct net_device *dev)
+void netdev_rx_csum_fault(struct net_device *dev, struct sk_buff *skb)
 {
        if (net_ratelimit()) {
                pr_err("%s: hw csum failure\n", dev ? dev->name : "<unknown>");
+               if (dev)
+                       pr_err("dev features: %pNF\n", &dev->features);
+               pr_err("skb len=%u data_len=%u pkt_type=%u gso_size=%u gso_type=%u nr_frags=%u ip_summed=%u csum=%x csum_complete_sw=%d csum_valid=%d csum_level=%u\n",
+                      skb->len, skb->data_len, skb->pkt_type,
+                      skb_shinfo(skb)->gso_size, skb_shinfo(skb)->gso_type,
+                      skb_shinfo(skb)->nr_frags, skb->ip_summed, skb->csum,
+                      skb->csum_complete_sw, skb->csum_valid, skb->csum_level);
                dump_stack();
        }
 }
@@ -4525,9 +4544,14 @@ static int netif_rx_internal(struct sk_buff *skb)
 
 int netif_rx(struct sk_buff *skb)
 {
+       int ret;
+
        trace_netif_rx_entry(skb);
 
-       return netif_rx_internal(skb);
+       ret = netif_rx_internal(skb);
+       trace_netif_rx_exit(ret);
+
+       return ret;
 }
 EXPORT_SYMBOL(netif_rx);
 
@@ -4542,6 +4566,7 @@ int netif_rx_ni(struct sk_buff *skb)
        if (local_softirq_pending())
                do_softirq();
        preempt_enable();
+       trace_netif_rx_ni_exit(err);
 
        return err;
 }
@@ -4894,7 +4919,7 @@ skip_classify:
                 * and set skb->priority like in vlan_do_receive()
                 * For the time being, just ignore Priority Code Point
                 */
-               skb->vlan_tci = 0;
+               __vlan_hwaccel_clear_tag(skb);
        }
 
        type = skb->protocol;
@@ -5227,9 +5252,14 @@ static void netif_receive_skb_list_internal(struct list_head *head)
  */
 int netif_receive_skb(struct sk_buff *skb)
 {
+       int ret;
+
        trace_netif_receive_skb_entry(skb);
 
-       return netif_receive_skb_internal(skb);
+       ret = netif_receive_skb_internal(skb);
+       trace_netif_receive_skb_exit(ret);
+
+       return ret;
 }
 EXPORT_SYMBOL(netif_receive_skb);
 
@@ -5249,9 +5279,12 @@ void netif_receive_skb_list(struct list_head *head)
 
        if (list_empty(head))
                return;
-       list_for_each_entry(skb, head, list)
-               trace_netif_receive_skb_list_entry(skb);
+       if (trace_netif_receive_skb_list_entry_enabled()) {
+               list_for_each_entry(skb, head, list)
+                       trace_netif_receive_skb_list_entry(skb);
+       }
        netif_receive_skb_list_internal(head);
+       trace_netif_receive_skb_list_exit(0);
 }
 EXPORT_SYMBOL(netif_receive_skb_list);
 
@@ -5362,11 +5395,13 @@ static void __napi_gro_flush_chain(struct napi_struct *napi, u32 index,
  */
 void napi_gro_flush(struct napi_struct *napi, bool flush_old)
 {
-       u32 i;
+       unsigned long bitmask = napi->gro_bitmask;
+       unsigned int i, base = ~0U;
 
-       for (i = 0; i < GRO_HASH_BUCKETS; i++) {
-               if (test_bit(i, &napi->gro_bitmask))
-                       __napi_gro_flush_chain(napi, i, flush_old);
+       while ((i = ffs(bitmask)) != 0) {
+               bitmask >>= i;
+               base += i;
+               __napi_gro_flush_chain(napi, base, flush_old);
        }
 }
 EXPORT_SYMBOL(napi_gro_flush);
@@ -5391,7 +5426,9 @@ static struct list_head *gro_list_prepare(struct napi_struct *napi,
                }
 
                diffs = (unsigned long)p->dev ^ (unsigned long)skb->dev;
-               diffs |= p->vlan_tci ^ skb->vlan_tci;
+               diffs |= skb_vlan_tag_present(p) ^ skb_vlan_tag_present(skb);
+               if (skb_vlan_tag_present(p))
+                       diffs |= p->vlan_tci ^ skb->vlan_tci;
                diffs |= skb_metadata_dst_cmp(p, skb);
                diffs |= skb_metadata_differs(p, skb);
                if (maclen == ETH_HLEN)
@@ -5639,12 +5676,17 @@ static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
 
 gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
 {
+       gro_result_t ret;
+
        skb_mark_napi_id(skb, napi);
        trace_napi_gro_receive_entry(skb);
 
        skb_gro_reset_offset(skb);
 
-       return napi_skb_finish(dev_gro_receive(napi, skb), skb);
+       ret = napi_skb_finish(dev_gro_receive(napi, skb), skb);
+       trace_napi_gro_receive_exit(ret);
+
+       return ret;
 }
 EXPORT_SYMBOL(napi_gro_receive);
 
@@ -5657,7 +5699,7 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb)
        __skb_pull(skb, skb_headlen(skb));
        /* restore the reserve we had after netdev_alloc_skb_ip_align() */
        skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN - skb_headroom(skb));
-       skb->vlan_tci = 0;
+       __vlan_hwaccel_clear_tag(skb);
        skb->dev = napi->dev;
        skb->skb_iif = 0;
 
@@ -5762,6 +5804,7 @@ static struct sk_buff *napi_frags_skb(struct napi_struct *napi)
 
 gro_result_t napi_gro_frags(struct napi_struct *napi)
 {
+       gro_result_t ret;
        struct sk_buff *skb = napi_frags_skb(napi);
 
        if (!skb)
@@ -5769,7 +5812,10 @@ gro_result_t napi_gro_frags(struct napi_struct *napi)
 
        trace_napi_gro_frags_entry(skb);
 
-       return napi_frags_finish(napi, skb, dev_gro_receive(napi, skb));
+       ret = napi_frags_finish(napi, skb, dev_gro_receive(napi, skb));
+       trace_napi_gro_frags_exit(ret);
+
+       return ret;
 }
 EXPORT_SYMBOL(napi_gro_frags);
 
@@ -5785,10 +5831,11 @@ __sum16 __skb_gro_checksum_complete(struct sk_buff *skb)
 
        /* NAPI_GRO_CB(skb)->csum holds pseudo checksum */
        sum = csum_fold(csum_add(NAPI_GRO_CB(skb)->csum, wsum));
+       /* See comments in __skb_checksum_complete(). */
        if (likely(!sum)) {
                if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
                    !skb->csum_complete_sw)
-                       netdev_rx_csum_fault(skb->dev);
+                       netdev_rx_csum_fault(skb->dev, skb);
        }
 
        NAPI_GRO_CB(skb)->csum = wsum;
@@ -7467,7 +7514,8 @@ unsigned int dev_get_flags(const struct net_device *dev)
 }
 EXPORT_SYMBOL(dev_get_flags);
 
-int __dev_change_flags(struct net_device *dev, unsigned int flags)
+int __dev_change_flags(struct net_device *dev, unsigned int flags,
+                      struct netlink_ext_ack *extack)
 {
        unsigned int old_flags = dev->flags;
        int ret;
@@ -7504,7 +7552,7 @@ int __dev_change_flags(struct net_device *dev, unsigned int flags)
                if (old_flags & IFF_UP)
                        __dev_close(dev);
                else
-                       ret = __dev_open(dev);
+                       ret = __dev_open(dev, extack);
        }
 
        if ((flags ^ dev->gflags) & IFF_PROMISC) {
@@ -7564,16 +7612,18 @@ void __dev_notify_flags(struct net_device *dev, unsigned int old_flags,
  *     dev_change_flags - change device settings
  *     @dev: device
  *     @flags: device state flags
+ *     @extack: netlink extended ack
  *
  *     Change settings on device based state flags. The flags are
  *     in the userspace exported format.
  */
-int dev_change_flags(struct net_device *dev, unsigned int flags)
+int dev_change_flags(struct net_device *dev, unsigned int flags,
+                    struct netlink_ext_ack *extack)
 {
        int ret;
        unsigned int changes, old_flags = dev->flags, old_gflags = dev->gflags;
 
-       ret = __dev_change_flags(dev, flags);
+       ret = __dev_change_flags(dev, flags, extack);
        if (ret < 0)
                return ret;