Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dac341e

Browse files
liuhangbingregkh
authored andcommitted
hsr: use hsr_for_each_port_rtnl in hsr_port_get_hsr
[ Upstream commit 393c841 ] 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 <[email protected]> Reviewed-by: Simon Horman <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent d04d9d1 commit dac341e

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
@@ -125,7 +125,7 @@ struct hsr_port *hsr_port_get_hsr(struct hsr_priv *hsr, enum hsr_port_type pt)
125125
{
126126
struct hsr_port *port;
127127

128-
hsr_for_each_port(hsr, port)
128+
hsr_for_each_port_rtnl(hsr, port)
129129
if (port->type == pt)
130130
return port;
131131
return NULL;

0 commit comments

Comments
 (0)