]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: bridge: use atomic ops to read/change p->flags (I)
authorEric Dumazet <edumazet@google.com>
Thu, 11 Jun 2026 20:34:51 +0000 (20:34 +0000)
committerJakub Kicinski <kuba@kernel.org>
Sat, 13 Jun 2026 01:03:46 +0000 (18:03 -0700)
Use test_bit() in net/bridge/br_arp_nd_proxy.c,
net/bridge/br_fdb.c and net/bridge/br_forward.c.

Use READ_ONCE(p->flags) in br_recalculate_neigh_suppress_enabled()
as we test two bits at once.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/20260611203453.3067462-4-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/bridge/br_arp_nd_proxy.c
net/bridge/br_fdb.c
net/bridge/br_forward.c

index 5263232278b4fe95775cfcbba71615197e2f5311..23eb6931a2b4ad9137ef20735d8333f376fd49f2 100644 (file)
@@ -29,7 +29,7 @@ void br_recalculate_neigh_suppress_enabled(struct net_bridge *br)
        bool neigh_suppress = false;
 
        list_for_each_entry(p, &br->port_list, list) {
-               if (p->flags & (BR_NEIGH_SUPPRESS | BR_NEIGH_VLAN_SUPPRESS)) {
+               if (READ_ONCE(p->flags) & (BR_NEIGH_SUPPRESS | BR_NEIGH_VLAN_SUPPRESS)) {
                        neigh_suppress = true;
                        break;
                }
@@ -206,8 +206,8 @@ void br_do_proxy_suppress_arp(struct sk_buff *skb, struct net_bridge *br,
                        const struct net_bridge_port *dst = READ_ONCE(f->dst);
                        bool replied = false;
 
-                       if ((p && (p->flags & BR_PROXYARP)) ||
-                           (dst && (dst->flags & BR_PROXYARP_WIFI)) ||
+                       if ((p && test_bit(BR_PROXYARP_BIT, &p->flags)) ||
+                           (dst && test_bit(BR_PROXYARP_WIFI_BIT, &dst->flags)) ||
                            br_is_neigh_suppress_enabled(dst, vid)) {
                                if (!vid)
                                        br_arp_send(br, p, skb->dev, sip, tip,
@@ -511,10 +511,7 @@ bool br_is_neigh_suppress_enabled(const struct net_bridge_port *p, u16 vid)
        if (!p)
                return false;
 
-       if (!vid)
-               return !!(p->flags & BR_NEIGH_SUPPRESS);
-
-       if (p->flags & BR_NEIGH_VLAN_SUPPRESS) {
+       if (vid && test_bit(BR_NEIGH_VLAN_SUPPRESS_BIT, &p->flags)) {
                struct net_bridge_vlan_group *vg = nbp_vlan_group_rcu(p);
                struct net_bridge_vlan *v;
 
@@ -522,17 +519,13 @@ bool br_is_neigh_suppress_enabled(const struct net_bridge_port *p, u16 vid)
                if (!v)
                        return false;
                return !!(v->priv_flags & BR_VLFLAG_NEIGH_SUPPRESS_ENABLED);
-       } else {
-               return !!(p->flags & BR_NEIGH_SUPPRESS);
        }
+       return test_bit(BR_NEIGH_SUPPRESS_BIT, &p->flags);
 }
 
 bool br_is_neigh_forward_grat_enabled(const struct net_bridge_port *p, u16 vid)
 {
-       if (!vid)
-               return !!(p->flags & BR_NEIGH_FORWARD_GRAT);
-
-       if (p->flags & BR_NEIGH_VLAN_SUPPRESS) {
+       if (vid && test_bit(BR_NEIGH_VLAN_SUPPRESS_BIT, &p->flags)) {
                struct net_bridge_vlan_group *vg = nbp_vlan_group_rcu(p);
                struct net_bridge_vlan *v;
 
@@ -540,7 +533,6 @@ bool br_is_neigh_forward_grat_enabled(const struct net_bridge_port *p, u16 vid)
                if (!v)
                        return false;
                return !!(v->priv_flags & BR_VLFLAG_NEIGH_FORWARD_GRAT_ENABLED);
-       } else {
-               return !!(p->flags & BR_NEIGH_FORWARD_GRAT);
        }
+       return test_bit(BR_NEIGH_FORWARD_GRAT_BIT, &p->flags);
 }
index a114373c98163d1e81b090b9c799adcb1bfeed77..e4570bbed85445bcda08537b81c78bacd163f28d 100644 (file)
@@ -1514,7 +1514,7 @@ int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
 
        trace_br_fdb_external_learn_add(br, p, addr, vid);
 
-       if (locked && (!p || !(p->flags & BR_PORT_MAB)))
+       if (locked && (!p || !test_bit(BR_PORT_MAB_BIT, &p->flags)))
                return -EINVAL;
 
        spin_lock_bh(&br->hash_lock);
index 4a77d07433745152241789818949bd228aa95be0..46c762ca5177e5ffb8bc21077cdb14ca25a4a453 100644 (file)
@@ -24,7 +24,7 @@ static inline int should_deliver(const struct net_bridge_port *p,
        struct net_bridge_vlan_group *vg;
 
        vg = nbp_vlan_group_rcu(p);
-       return ((p->flags & BR_HAIRPIN_MODE) || skb->dev != p->dev) &&
+       return (test_bit(BR_HAIRPIN_MODE_BIT, &p->flags) || skb->dev != p->dev) &&
                (br_mst_is_enabled(p) || p->state == BR_STATE_FORWARDING) &&
                br_allowed_egress(vg, skb) && nbp_switchdev_allowed_egress(p, skb) &&
                !br_skb_isolated(p, skb);
@@ -214,24 +214,24 @@ void br_flood(struct net_bridge *br, struct sk_buff *skb,
                 */
                switch (pkt_type) {
                case BR_PKT_UNICAST:
-                       if (!(p->flags & BR_FLOOD))
+                       if (!test_bit(BR_FLOOD_BIT, &p->flags))
                                continue;
                        break;
                case BR_PKT_MULTICAST:
-                       if (!(p->flags & BR_MCAST_FLOOD) && skb->dev != br->dev)
+                       if (!test_bit(BR_MCAST_FLOOD_BIT, &p->flags) && skb->dev != br->dev)
                                continue;
                        break;
                case BR_PKT_BROADCAST:
-                       if (!(p->flags & BR_BCAST_FLOOD) && skb->dev != br->dev)
+                       if (!test_bit(BR_BCAST_FLOOD_BIT, &p->flags) && skb->dev != br->dev)
                                continue;
                        break;
                }
 
                /* Do not flood to ports that enable proxy ARP */
-               if (p->flags & BR_PROXYARP)
+               if (test_bit(BR_PROXYARP_BIT, &p->flags))
                        continue;
                if (BR_INPUT_SKB_CB(skb)->proxyarp_replied) {
-                       if (p->flags & BR_PROXYARP_WIFI)
+                       if (test_bit(BR_PROXYARP_WIFI_BIT, &p->flags))
                                continue;
                        /* For gratuitous ARPs/NAs, check neigh_forward_grat.
                         * For regular ARPs/NDs, check only neigh_suppress.
@@ -328,7 +328,8 @@ void br_multicast_flood(struct net_bridge_mdb_entry *mdst,
                if ((unsigned long)lport > (unsigned long)rport) {
                        port = lport;
 
-                       if (port->flags & BR_MULTICAST_TO_UNICAST) {
+                       if (test_bit(BR_MULTICAST_TO_UNICAST_BIT,
+                                    &port->flags)) {
                                maybe_deliver_addr(lport, skb, p->eth_addr,
                                                   local_orig);
                                goto delivered;