mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 01:32:21 +02:00
net: bridge: use atomic ops to read/change p->flags (I)
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>
This commit is contained in:
parent
e92df84bcc
commit
65b8de45ae
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user