aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index d540ced1f6c6..e7d68ed8aafe 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1545,7 +1545,6 @@ void net_enable_timestamp(void)
1545 return; 1545 return;
1546 } 1546 }
1547#endif 1547#endif
1548 WARN_ON(in_interrupt());
1549 static_key_slow_inc(&netstamp_needed); 1548 static_key_slow_inc(&netstamp_needed);
1550} 1549}
1551EXPORT_SYMBOL(net_enable_timestamp); 1550EXPORT_SYMBOL(net_enable_timestamp);
@@ -1625,7 +1624,6 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb)
1625 } 1624 }
1626 1625
1627 skb_orphan(skb); 1626 skb_orphan(skb);
1628 nf_reset(skb);
1629 1627
1630 if (unlikely(!is_skb_forwardable(dev, skb))) { 1628 if (unlikely(!is_skb_forwardable(dev, skb))) {
1631 atomic_long_inc(&dev->rx_dropped); 1629 atomic_long_inc(&dev->rx_dropped);
@@ -1641,6 +1639,7 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb)
1641 skb->mark = 0; 1639 skb->mark = 0;
1642 secpath_reset(skb); 1640 secpath_reset(skb);
1643 nf_reset(skb); 1641 nf_reset(skb);
1642 nf_reset_trace(skb);
1644 return netif_rx(skb); 1643 return netif_rx(skb);
1645} 1644}
1646EXPORT_SYMBOL_GPL(dev_forward_skb); 1645EXPORT_SYMBOL_GPL(dev_forward_skb);
@@ -3315,6 +3314,7 @@ int netdev_rx_handler_register(struct net_device *dev,
3315 if (dev->rx_handler) 3314 if (dev->rx_handler)
3316 return -EBUSY; 3315 return -EBUSY;
3317 3316
3317 /* Note: rx_handler_data must be set before rx_handler */
3318 rcu_assign_pointer(dev->rx_handler_data, rx_handler_data); 3318 rcu_assign_pointer(dev->rx_handler_data, rx_handler_data);
3319 rcu_assign_pointer(dev->rx_handler, rx_handler); 3319 rcu_assign_pointer(dev->rx_handler, rx_handler);
3320 3320
@@ -3335,6 +3335,11 @@ void netdev_rx_handler_unregister(struct net_device *dev)
3335 3335
3336 ASSERT_RTNL(); 3336 ASSERT_RTNL();
3337 RCU_INIT_POINTER(dev->rx_handler, NULL); 3337 RCU_INIT_POINTER(dev->rx_handler, NULL);
3338 /* a reader seeing a non NULL rx_handler in a rcu_read_lock()
3339 * section has a guarantee to see a non NULL rx_handler_data
3340 * as well.
3341 */
3342 synchronize_net();
3338 RCU_INIT_POINTER(dev->rx_handler_data, NULL); 3343 RCU_INIT_POINTER(dev->rx_handler_data, NULL);
3339} 3344}
3340EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister); 3345EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister);