| From d6267ee421be7d2d0767a6a694f99500c02080e1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 8 Feb 2026 22:56:02 +0000 |
| Subject: net: mscc: ocelot: add missing lock protection in |
| ocelot_port_xmit_inj() |
| |
| From: Ziyi Guo <n7l8m4@u.northwestern.edu> |
| |
| [ Upstream commit 026f6513c5880c2c89e38ad66bbec2868f978605 ] |
| |
| ocelot_port_xmit_inj() calls ocelot_can_inject() and |
| ocelot_port_inject_frame() without holding the injection group lock. |
| Both functions contain lockdep_assert_held() for the injection lock, |
| and the correct caller felix_port_deferred_xmit() properly acquires |
| the lock using ocelot_lock_inj_grp() before calling these functions. |
| |
| Add ocelot_lock_inj_grp()/ocelot_unlock_inj_grp() around the register |
| injection path to fix the missing lock protection. The FDMA path is not |
| affected as it uses its own locking mechanism. |
| |
| Fixes: c5e12ac3beb0 ("net: mscc: ocelot: serialize access to the injection/extraction groups") |
| Signed-off-by: Ziyi Guo <n7l8m4@u.northwestern.edu> |
| Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com> |
| Link: https://patch.msgid.link/20260208225602.1339325-4-n7l8m4@u.northwestern.edu |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/mscc/ocelot_net.c | 12 ++++++++++-- |
| 1 file changed, 10 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/mscc/ocelot_net.c b/drivers/net/ethernet/mscc/ocelot_net.c |
| index 84b3dcf1d2f5a..b516b4e1ed974 100644 |
| --- a/drivers/net/ethernet/mscc/ocelot_net.c |
| +++ b/drivers/net/ethernet/mscc/ocelot_net.c |
| @@ -597,14 +597,22 @@ static netdev_tx_t ocelot_port_xmit_inj(struct sk_buff *skb, |
| int port = priv->port.index; |
| u32 rew_op = 0; |
| |
| - if (!ocelot_can_inject(ocelot, 0)) |
| + ocelot_lock_inj_grp(ocelot, 0); |
| + |
| + if (!ocelot_can_inject(ocelot, 0)) { |
| + ocelot_unlock_inj_grp(ocelot, 0); |
| return NETDEV_TX_BUSY; |
| + } |
| |
| - if (!ocelot_xmit_timestamp(ocelot, port, skb, &rew_op)) |
| + if (!ocelot_xmit_timestamp(ocelot, port, skb, &rew_op)) { |
| + ocelot_unlock_inj_grp(ocelot, 0); |
| return NETDEV_TX_OK; |
| + } |
| |
| ocelot_port_inject_frame(ocelot, port, 0, rew_op, skb); |
| |
| + ocelot_unlock_inj_grp(ocelot, 0); |
| + |
| consume_skb(skb); |
| |
| return NETDEV_TX_OK; |
| -- |
| 2.51.0 |
| |