@@ -231,9 +231,7 @@ static netdev_tx_t hsr_dev_xmit(struct sk_buff *skb, struct net_device *dev)
231
231
skb -> dev = master -> dev ;
232
232
skb_reset_mac_header (skb );
233
233
skb_reset_mac_len (skb );
234
- spin_lock_bh (& hsr -> seqnr_lock );
235
234
hsr_forward_skb (skb , master );
236
- spin_unlock_bh (& hsr -> seqnr_lock );
237
235
} else {
238
236
dev_core_stats_tx_dropped_inc (dev );
239
237
dev_kfree_skb_any (skb );
@@ -314,14 +312,10 @@ static void send_hsr_supervision_frame(struct hsr_port *port,
314
312
set_hsr_stag_HSR_ver (hsr_stag , hsr -> prot_version );
315
313
316
314
/* From HSRv1 on we have separate supervision sequence numbers. */
317
- spin_lock_bh (& hsr -> seqnr_lock );
318
- if (hsr -> prot_version > 0 ) {
319
- hsr_stag -> sequence_nr = htons (hsr -> sup_sequence_nr );
320
- hsr -> sup_sequence_nr ++ ;
321
- } else {
322
- hsr_stag -> sequence_nr = htons (hsr -> sequence_nr );
323
- hsr -> sequence_nr ++ ;
324
- }
315
+ if (hsr -> prot_version > 0 )
316
+ hsr_stag -> sequence_nr = htons (atomic_inc_return (& hsr -> sup_sequence_nr ));
317
+ else
318
+ hsr_stag -> sequence_nr = htons (atomic_inc_return (& hsr -> sequence_nr ));
325
319
326
320
hsr_stag -> tlv .HSR_TLV_type = type ;
327
321
/* TODO: Why 12 in HSRv0? */
@@ -343,13 +337,11 @@ static void send_hsr_supervision_frame(struct hsr_port *port,
343
337
ether_addr_copy (hsr_sp -> macaddress_A , hsr -> macaddress_redbox );
344
338
}
345
339
346
- if (skb_put_padto (skb , ETH_ZLEN )) {
347
- spin_unlock_bh (& hsr -> seqnr_lock );
340
+ if (skb_put_padto (skb , ETH_ZLEN ))
348
341
return ;
349
- }
350
342
351
343
hsr_forward_skb (skb , port );
352
- spin_unlock_bh ( & hsr -> seqnr_lock );
344
+
353
345
return ;
354
346
}
355
347
@@ -374,23 +366,18 @@ static void send_prp_supervision_frame(struct hsr_port *master,
374
366
set_hsr_stag_HSR_ver (hsr_stag , (hsr -> prot_version ? 1 : 0 ));
375
367
376
368
/* From HSRv1 on we have separate supervision sequence numbers. */
377
- spin_lock_bh (& hsr -> seqnr_lock );
378
- hsr_stag -> sequence_nr = htons (hsr -> sup_sequence_nr );
379
- hsr -> sup_sequence_nr ++ ;
369
+ hsr_stag -> sequence_nr = htons (atomic_inc_return (& hsr -> sup_sequence_nr ));
380
370
hsr_stag -> tlv .HSR_TLV_type = PRP_TLV_LIFE_CHECK_DD ;
381
371
hsr_stag -> tlv .HSR_TLV_length = sizeof (struct hsr_sup_payload );
382
372
383
373
/* Payload: MacAddressA */
384
374
hsr_sp = skb_put (skb , sizeof (struct hsr_sup_payload ));
385
375
ether_addr_copy (hsr_sp -> macaddress_A , master -> dev -> dev_addr );
386
376
387
- if (skb_put_padto (skb , ETH_ZLEN )) {
388
- spin_unlock_bh (& hsr -> seqnr_lock );
377
+ if (skb_put_padto (skb , ETH_ZLEN ))
389
378
return ;
390
- }
391
379
392
380
hsr_forward_skb (skb , master );
393
- spin_unlock_bh (& hsr -> seqnr_lock );
394
381
}
395
382
396
383
/* Announce (supervision frame) timer function
@@ -621,11 +608,9 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
621
608
if (res < 0 )
622
609
return res ;
623
610
624
- spin_lock_init (& hsr -> seqnr_lock );
625
611
/* Overflow soon to find bugs easier: */
626
- hsr -> sequence_nr = HSR_SEQNR_START ;
627
- hsr -> sup_sequence_nr = HSR_SUP_SEQNR_START ;
628
- hsr -> interlink_sequence_nr = HSR_SEQNR_START ;
612
+ atomic_set (& hsr -> sequence_nr , HSR_SEQNR_START );
613
+ atomic_set (& hsr -> sup_sequence_nr , HSR_SUP_SEQNR_START );
629
614
630
615
timer_setup (& hsr -> announce_timer , hsr_announce , 0 );
631
616
timer_setup (& hsr -> prune_timer , hsr_prune_nodes , 0 );
0 commit comments