Skip to content

Commit 393c841

Browse files
liuhangbinPaolo Abeni
authored andcommitted
hsr: use hsr_for_each_port_rtnl in hsr_port_get_hsr
hsr_port_get_hsr() iterates over ports using hsr_for_each_port(), but many of its callers do not hold the required RCU lock. Switch to hsr_for_each_port_rtnl(), since most callers already hold the rtnl lock. After review, all callers are covered by either the rtnl lock or the RCU lock, except hsr_dev_xmit(). Fix this by adding an RCU read lock there. Fixes: c5a7591 ("net/hsr: Use list_head (and rcu) instead of array for slave devices.") Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> Reviewed-by: Simon Horman <horms@kernel.org> Link: https://patch.msgid.link/20250905091533.377443-3-liuhangbin@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 8884c69 commit 393c841

File tree

2 files changed

+4
-1
lines changed

2 files changed

+4
-1
lines changed

net/hsr/hsr_device.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ static netdev_tx_t hsr_dev_xmit(struct sk_buff *skb, struct net_device *dev)
226226
struct hsr_priv *hsr = netdev_priv(dev);
227227
struct hsr_port *master;
228228

229+
rcu_read_lock();
229230
master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
230231
if (master) {
231232
skb->dev = master->dev;
@@ -238,6 +239,8 @@ static netdev_tx_t hsr_dev_xmit(struct sk_buff *skb, struct net_device *dev)
238239
dev_core_stats_tx_dropped_inc(dev);
239240
dev_kfree_skb_any(skb);
240241
}
242+
rcu_read_unlock();
243+
241244
return NETDEV_TX_OK;
242245
}
243246

net/hsr/hsr_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ struct hsr_port *hsr_port_get_hsr(struct hsr_priv *hsr, enum hsr_port_type pt)
134134
{
135135
struct hsr_port *port;
136136

137-
hsr_for_each_port(hsr, port)
137+
hsr_for_each_port_rtnl(hsr, port)
138138
if (port->type == pt)
139139
return port;
140140
return NULL;

0 commit comments

Comments
 (0)