Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied...
[firefly-linux-kernel-4.4.55.git] / net / bridge / br_input.c
index 99647d8f95c84e420f90e40c8b794284851076fa..826cd5221536cadd3b0d13dfec2e9d3639b92a93 100644 (file)
@@ -27,8 +27,10 @@ static int br_pass_frame_up(struct sk_buff *skb)
        struct net_bridge *br = netdev_priv(brdev);
        struct br_cpu_netstats *brstats = this_cpu_ptr(br->stats);
 
+       u64_stats_update_begin(&brstats->syncp);
        brstats->rx_packets++;
        brstats->rx_bytes += skb->len;
+       u64_stats_update_end(&brstats->syncp);
 
        indev = skb->dev;
        skb->dev = brdev;
@@ -37,11 +39,11 @@ static int br_pass_frame_up(struct sk_buff *skb)
                       netif_receive_skb);
 }
 
-/* note: already called with rcu_read_lock (preempt_disabled) */
+/* note: already called with rcu_read_lock */
 int br_handle_frame_finish(struct sk_buff *skb)
 {
        const unsigned char *dest = eth_hdr(skb)->h_dest;
-       struct net_bridge_port *p = rcu_dereference(skb->dev->br_port);
+       struct net_bridge_port *p = br_port_get_rcu(skb->dev);
        struct net_bridge *br;
        struct net_bridge_fdb_entry *dst;
        struct net_bridge_mdb_entry *mdst;
@@ -108,13 +110,12 @@ drop:
        goto out;
 }
 
-/* note: already called with rcu_read_lock (preempt_disabled) */
+/* note: already called with rcu_read_lock */
 static int br_handle_local_finish(struct sk_buff *skb)
 {
-       struct net_bridge_port *p = rcu_dereference(skb->dev->br_port);
+       struct net_bridge_port *p = br_port_get_rcu(skb->dev);
 
-       if (p)
-               br_fdb_update(p->br, p, eth_hdr(skb)->h_source);
+       br_fdb_update(p->br, p, eth_hdr(skb)->h_source);
        return 0;        /* process further */
 }
 
@@ -132,8 +133,7 @@ static inline int is_link_local(const unsigned char *dest)
 
 /*
  * Return NULL if skb is handled
- * note: already called with rcu_read_lock (preempt_disabled) from
- * netif_receive_skb
+ * note: already called with rcu_read_lock
  */
 struct sk_buff *br_handle_frame(struct sk_buff *skb)
 {
@@ -151,7 +151,7 @@ struct sk_buff *br_handle_frame(struct sk_buff *skb)
        if (!skb)
                return NULL;
 
-       p = rcu_dereference(skb->dev->br_port);
+       p = br_port_get_rcu(skb->dev);
 
        if (unlikely(is_link_local(dest))) {
                /* Pause frames shouldn't be passed up by driver anyway */