mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
net: bridge: vlan: annotate lockless use of num_vlans
Annotate data races around vlan group's num_vlans, it can be read lockless. Signed-off-by: Nikolay Aleksandrov <razor@blackwall.org> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Link: https://patch.msgid.link/20260903143138.1574598-7-razor@blackwall.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
b0bb0a45ce
commit
5bec8f8611
|
|
@ -81,7 +81,7 @@ static int br_get_num_vlan_infos(struct net_bridge_vlan_group *vg,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (filter_mask & RTEXT_FILTER_BRVLAN)
|
if (filter_mask & RTEXT_FILTER_BRVLAN)
|
||||||
return vg->num_vlans;
|
return READ_ONCE(vg->num_vlans);
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
num_vlans = __get_num_vlan_infos(vg, filter_mask);
|
num_vlans = __get_num_vlan_infos(vg, filter_mask);
|
||||||
|
|
@ -531,7 +531,7 @@ static int br_fill_ifinfo(struct sk_buff *skb,
|
||||||
else
|
else
|
||||||
vg = br_vlan_group_rcu(br);
|
vg = br_vlan_group_rcu(br);
|
||||||
|
|
||||||
if (!vg || !vg->num_vlans) {
|
if (!vg || !READ_ONCE(vg->num_vlans)) {
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -344,7 +344,7 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags,
|
||||||
goto out_filt;
|
goto out_filt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vg->num_vlans++;
|
WRITE_ONCE(vg->num_vlans, vg->num_vlans + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set the state before publishing */
|
/* set the state before publishing */
|
||||||
|
|
@ -367,7 +367,7 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags,
|
||||||
out_fdb_insert:
|
out_fdb_insert:
|
||||||
if (br_vlan_should_use(v)) {
|
if (br_vlan_should_use(v)) {
|
||||||
br_fdb_find_delete_local(br, p, dev->dev_addr, v->vid);
|
br_fdb_find_delete_local(br, p, dev->dev_addr, v->vid);
|
||||||
vg->num_vlans--;
|
WRITE_ONCE(vg->num_vlans, vg->num_vlans - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
out_filt:
|
out_filt:
|
||||||
|
|
@ -417,7 +417,7 @@ static int __vlan_del(struct net_bridge_vlan *v)
|
||||||
|
|
||||||
if (br_vlan_should_use(v)) {
|
if (br_vlan_should_use(v)) {
|
||||||
WRITE_ONCE(v->flags, v->flags & ~BRIDGE_VLAN_INFO_BRENTRY);
|
WRITE_ONCE(v->flags, v->flags & ~BRIDGE_VLAN_INFO_BRENTRY);
|
||||||
vg->num_vlans--;
|
WRITE_ONCE(vg->num_vlans, vg->num_vlans - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (masterv != v) {
|
if (masterv != v) {
|
||||||
|
|
@ -695,7 +695,7 @@ bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
vg = nbp_vlan_group_rcu(p);
|
vg = nbp_vlan_group_rcu(p);
|
||||||
if (!vg || !vg->num_vlans)
|
if (!vg || !READ_ONCE(vg->num_vlans))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!br_vlan_get_tag(skb, vid) && skb->vlan_proto != br->vlan_proto)
|
if (!br_vlan_get_tag(skb, vid) && skb->vlan_proto != br->vlan_proto)
|
||||||
|
|
@ -757,7 +757,7 @@ static int br_vlan_add_existing(struct net_bridge *br,
|
||||||
|
|
||||||
refcount_inc(&vlan->refcnt);
|
refcount_inc(&vlan->refcnt);
|
||||||
WRITE_ONCE(vlan->flags, vlan->flags | BRIDGE_VLAN_INFO_BRENTRY);
|
WRITE_ONCE(vlan->flags, vlan->flags | BRIDGE_VLAN_INFO_BRENTRY);
|
||||||
vg->num_vlans++;
|
WRITE_ONCE(vg->num_vlans, vg->num_vlans + 1);
|
||||||
*changed = true;
|
*changed = true;
|
||||||
br_multicast_toggle_one_vlan(vlan, true);
|
br_multicast_toggle_one_vlan(vlan, true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user