@@ -49,7 +49,7 @@ static bool hsr_check_carrier(struct hsr_port *master)
49
49
50
50
ASSERT_RTNL ();
51
51
52
- hsr_for_each_port (master -> hsr , port ) {
52
+ hsr_for_each_port_rtnl (master -> hsr , port ) {
53
53
if (port -> type != HSR_PT_MASTER && is_slave_up (port -> dev )) {
54
54
netif_carrier_on (master -> dev );
55
55
return true;
@@ -105,7 +105,7 @@ int hsr_get_max_mtu(struct hsr_priv *hsr)
105
105
struct hsr_port * port ;
106
106
107
107
mtu_max = ETH_DATA_LEN ;
108
- hsr_for_each_port (hsr , port )
108
+ hsr_for_each_port_rtnl (hsr , port )
109
109
if (port -> type != HSR_PT_MASTER )
110
110
mtu_max = min (port -> dev -> mtu , mtu_max );
111
111
@@ -139,7 +139,7 @@ static int hsr_dev_open(struct net_device *dev)
139
139
140
140
hsr = netdev_priv (dev );
141
141
142
- hsr_for_each_port (hsr , port ) {
142
+ hsr_for_each_port_rtnl (hsr , port ) {
143
143
if (port -> type == HSR_PT_MASTER )
144
144
continue ;
145
145
switch (port -> type ) {
@@ -172,7 +172,7 @@ static int hsr_dev_close(struct net_device *dev)
172
172
struct hsr_priv * hsr ;
173
173
174
174
hsr = netdev_priv (dev );
175
- hsr_for_each_port (hsr , port ) {
175
+ hsr_for_each_port_rtnl (hsr , port ) {
176
176
if (port -> type == HSR_PT_MASTER )
177
177
continue ;
178
178
switch (port -> type ) {
@@ -205,7 +205,7 @@ static netdev_features_t hsr_features_recompute(struct hsr_priv *hsr,
205
205
* may become enabled.
206
206
*/
207
207
features &= ~NETIF_F_ONE_FOR_ALL ;
208
- hsr_for_each_port (hsr , port )
208
+ hsr_for_each_port_rtnl (hsr , port )
209
209
features = netdev_increment_features (features ,
210
210
port -> dev -> features ,
211
211
mask );
@@ -226,6 +226,7 @@ static netdev_tx_t hsr_dev_xmit(struct sk_buff *skb, struct net_device *dev)
226
226
struct hsr_priv * hsr = netdev_priv (dev );
227
227
struct hsr_port * master ;
228
228
229
+ rcu_read_lock ();
229
230
master = hsr_port_get_hsr (hsr , HSR_PT_MASTER );
230
231
if (master ) {
231
232
skb -> dev = master -> dev ;
@@ -238,6 +239,8 @@ static netdev_tx_t hsr_dev_xmit(struct sk_buff *skb, struct net_device *dev)
238
239
dev_core_stats_tx_dropped_inc (dev );
239
240
dev_kfree_skb_any (skb );
240
241
}
242
+ rcu_read_unlock ();
243
+
241
244
return NETDEV_TX_OK ;
242
245
}
243
246
@@ -484,7 +487,7 @@ static void hsr_set_rx_mode(struct net_device *dev)
484
487
485
488
hsr = netdev_priv (dev );
486
489
487
- hsr_for_each_port (hsr , port ) {
490
+ hsr_for_each_port_rtnl (hsr , port ) {
488
491
if (port -> type == HSR_PT_MASTER )
489
492
continue ;
490
493
switch (port -> type ) {
@@ -506,7 +509,7 @@ static void hsr_change_rx_flags(struct net_device *dev, int change)
506
509
507
510
hsr = netdev_priv (dev );
508
511
509
- hsr_for_each_port (hsr , port ) {
512
+ hsr_for_each_port_rtnl (hsr , port ) {
510
513
if (port -> type == HSR_PT_MASTER )
511
514
continue ;
512
515
switch (port -> type ) {
@@ -534,7 +537,7 @@ static int hsr_ndo_vlan_rx_add_vid(struct net_device *dev,
534
537
535
538
hsr = netdev_priv (dev );
536
539
537
- hsr_for_each_port (hsr , port ) {
540
+ hsr_for_each_port_rtnl (hsr , port ) {
538
541
if (port -> type == HSR_PT_MASTER ||
539
542
port -> type == HSR_PT_INTERLINK )
540
543
continue ;
@@ -580,7 +583,7 @@ static int hsr_ndo_vlan_rx_kill_vid(struct net_device *dev,
580
583
581
584
hsr = netdev_priv (dev );
582
585
583
- hsr_for_each_port (hsr , port ) {
586
+ hsr_for_each_port_rtnl (hsr , port ) {
584
587
switch (port -> type ) {
585
588
case HSR_PT_SLAVE_A :
586
589
case HSR_PT_SLAVE_B :
@@ -672,9 +675,14 @@ struct net_device *hsr_get_port_ndev(struct net_device *ndev,
672
675
struct hsr_priv * hsr = netdev_priv (ndev );
673
676
struct hsr_port * port ;
674
677
678
+ rcu_read_lock ();
675
679
hsr_for_each_port (hsr , port )
676
- if (port -> type == pt )
680
+ if (port -> type == pt ) {
681
+ dev_hold (port -> dev );
682
+ rcu_read_unlock ();
677
683
return port -> dev ;
684
+ }
685
+ rcu_read_unlock ();
678
686
return NULL ;
679
687
}
680
688
EXPORT_SYMBOL (hsr_get_port_ndev );
0 commit comments