From: Nikolay Aleksandrov <razor@blackwall.org>
To: netdev@vger.kernel.org
Cc: idosch@nvidia.com, davem@davemloft.net, edumazet@google.com,
kuba@kernel.org, pabeni@redhat.com, horms@kernel.org,
bridge@lists.linux.dev, Nikolay Aleksandrov <razor@blackwall.org>
Subject: [PATCH net-next v2 9/9] net: bridge: use br_vlan_get_state to get vlan state
Date: Thu, 3 Sep 2026 17:31:38 +0300 [thread overview]
Message-ID: <20260903143138.1574598-10-razor@blackwall.org> (raw)
In-Reply-To: <20260903143138.1574598-1-razor@blackwall.org>
The vlan state can change under RTNL or RCU (mst), so use the helper
to get the state properly throughout the bridge driver.
Signed-off-by: Nikolay Aleksandrov <razor@blackwall.org>
---
v2: use br_vlan_get_state consistently where needed (Ido)
net/bridge/br_mst.c | 7 ++++---
net/bridge/br_private.h | 21 +++++++++++----------
net/bridge/br_vlan.c | 2 +-
net/bridge/br_vlan_options.c | 2 +-
4 files changed, 17 insertions(+), 15 deletions(-)
diff --git a/net/bridge/br_mst.c b/net/bridge/br_mst.c
index 76a5bf287578..ecd8bba7430e 100644
--- a/net/bridge/br_mst.c
+++ b/net/bridge/br_mst.c
@@ -70,7 +70,7 @@ int br_mst_get_state(const struct net_device *dev, u16 msti, u8 *state)
list_for_each_entry(v, &vg->vlan_list, vlist) {
if (v->brvlan->msti == msti) {
- *state = v->state;
+ *state = br_vlan_get_state(v);
return 0;
}
}
@@ -145,7 +145,7 @@ static void br_mst_vlan_sync_state(struct net_bridge_vlan *pv, u16 msti)
* it.
*/
if (v != pv && v->brvlan->msti == msti) {
- br_mst_vlan_set_state(vg, pv, v->state);
+ br_mst_vlan_set_state(vg, pv, br_vlan_get_state(v));
return;
}
}
@@ -282,7 +282,8 @@ int br_mst_fill_info(struct sk_buff *skb,
nest = nla_nest_start_noflag(skb, IFLA_BRIDGE_MST_ENTRY);
if (!nest ||
nla_put_u16(skb, IFLA_BRIDGE_MST_ENTRY_MSTI, v->brvlan->msti) ||
- nla_put_u8(skb, IFLA_BRIDGE_MST_ENTRY_STATE, v->state)) {
+ nla_put_u8(skb, IFLA_BRIDGE_MST_ENTRY_STATE,
+ br_vlan_get_state(v))) {
err = -EMSGSIZE;
break;
}
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index c7b64b5da012..df1500391f1d 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -687,6 +687,15 @@ static inline bool br_vlan_should_use(const struct net_bridge_vlan *v)
return true;
}
+/* The vlan state can be changed with only rcu held by the mst code so
+ * annotate the lock-free read. br_vlan_set_state() is kept further down
+ * because it needs br_multicast_update_vlan_mcast_ctx().
+ */
+static inline u8 br_vlan_get_state(const struct net_bridge_vlan *v)
+{
+ return READ_ONCE(v->state);
+}
+
static inline bool nbp_state_should_learn(const struct net_bridge_port *p)
{
return p->state == BR_STATE_LEARNING || p->state == BR_STATE_FORWARDING;
@@ -1299,7 +1308,7 @@ br_multicast_port_ctx_state_disabled(const struct net_bridge_mcast_port *pmctx)
return pmctx->port->state == BR_STATE_DISABLED ||
(br_multicast_port_ctx_is_vlan(pmctx) &&
(br_multicast_port_ctx_vlan_disabled(pmctx) ||
- pmctx->vlan->state == BR_STATE_DISABLED));
+ br_vlan_get_state(pmctx->vlan) == BR_STATE_DISABLED));
}
static inline bool
@@ -1308,7 +1317,7 @@ br_multicast_port_ctx_state_stopped(const struct net_bridge_mcast_port *pmctx)
return br_multicast_port_ctx_state_disabled(pmctx) ||
pmctx->port->state == BR_STATE_BLOCKING ||
(br_multicast_port_ctx_is_vlan(pmctx) &&
- pmctx->vlan->state == BR_STATE_BLOCKING);
+ br_vlan_get_state(pmctx->vlan) == BR_STATE_BLOCKING);
}
static inline bool
@@ -1916,14 +1925,6 @@ bool br_vlan_global_opts_can_enter_range(const struct net_bridge_vlan *v_curr,
bool br_vlan_global_opts_fill(struct sk_buff *skb, u16 vid, u16 vid_range,
const struct net_bridge_vlan *v_opts);
-/* vlan state manipulation helpers using *_ONCE to annotate lock-free access,
- * while br_vlan_set_state() may access data protected by multicast_lock.
- */
-static inline u8 br_vlan_get_state(const struct net_bridge_vlan *v)
-{
- return READ_ONCE(v->state);
-}
-
static inline void br_vlan_set_state(struct net_bridge_vlan *v, u8 state)
{
WRITE_ONCE(v->state, state);
diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c
index 95187a607ec2..72b75757ac85 100644
--- a/net/bridge/br_vlan.c
+++ b/net/bridge/br_vlan.c
@@ -40,7 +40,7 @@ static void __vlan_add_pvid(struct net_bridge_vlan_group *vg,
if (vg->pvid == v->vid)
return;
- br_vlan_set_pvid_state(vg, v->state);
+ br_vlan_set_pvid_state(vg, br_vlan_get_state(v));
WRITE_ONCE(vg->pvid, v->vid);
}
diff --git a/net/bridge/br_vlan_options.c b/net/bridge/br_vlan_options.c
index bd049d268fe7..506668fc31d9 100644
--- a/net/bridge/br_vlan_options.c
+++ b/net/bridge/br_vlan_options.c
@@ -43,7 +43,7 @@ bool br_vlan_opts_eq_range(const struct net_bridge_vlan *v_curr,
u8 range_mc_rtr = br_vlan_multicast_router(range_end);
u8 curr_mc_rtr = br_vlan_multicast_router(v_curr);
- if (v_curr->state != range_end->state)
+ if (br_vlan_get_state(v_curr) != br_vlan_get_state(range_end))
return false;
if (!__vlan_tun_can_enter_range(v_curr, range_end))
--
2.47.3
prev parent reply other threads:[~2026-09-03 14:32 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 14:31 [PATCH net-next v2 0/9] net: bridge: vlan: minor cleanups and annotations Nikolay Aleksandrov
2026-09-03 14:31 ` [PATCH net-next v2 1/9] net: bridge: vlan: drop legacy memory barriers Nikolay Aleksandrov
2026-09-05 20:27 ` netdev-bot+sashiko
2026-09-05 21:17 ` Nikolay Aleksandrov
2026-09-03 14:31 ` [PATCH net-next v2 2/9] net: bridge: vlan: annotate lockless pvid use Nikolay Aleksandrov
2026-09-03 14:31 ` [PATCH net-next v2 3/9] net: bridge: mst: use br_get_pvid helper Nikolay Aleksandrov
2026-09-03 14:31 ` [PATCH net-next v2 4/9] net: bridge: vlan: annotate lockless vlan flags use Nikolay Aleksandrov
2026-09-03 14:31 ` [PATCH net-next v2 5/9] net: bridge: vlan: annotate lockless use of private flags Nikolay Aleksandrov
2026-09-03 14:31 ` [PATCH net-next v2 6/9] net: bridge: vlan: annotate lockless use of num_vlans Nikolay Aleksandrov
2026-09-03 14:31 ` [PATCH net-next v2 7/9] net: bridge: vlan: annotate lockless use of msti Nikolay Aleksandrov
2026-09-03 14:31 ` [PATCH net-next v2 8/9] net: bridge: vlan: add missing tinfo.tunnel_id annotations Nikolay Aleksandrov
2026-09-03 14:31 ` Nikolay Aleksandrov [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260903143138.1574598-10-razor@blackwall.org \
--to=razor@blackwall.org \
--cc=bridge@lists.linux.dev \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=idosch@nvidia.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox