@@ -231,9 +231,7 @@ static netdev_tx_t hsr_dev_xmit(struct sk_buff *skb, struct net_device *dev)
231231 skb -> dev = master -> dev ;
232232 skb_reset_mac_header (skb );
233233 skb_reset_mac_len (skb );
234- spin_lock_bh (& hsr -> seqnr_lock );
235234 hsr_forward_skb (skb , master );
236- spin_unlock_bh (& hsr -> seqnr_lock );
237235 } else {
238236 dev_core_stats_tx_dropped_inc (dev );
239237 dev_kfree_skb_any (skb );
@@ -314,14 +312,10 @@ static void send_hsr_supervision_frame(struct hsr_port *port,
314312 set_hsr_stag_HSR_ver (hsr_stag , hsr -> prot_version );
315313
316314 /* 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 ));
325319
326320 hsr_stag -> tlv .HSR_TLV_type = type ;
327321 /* TODO: Why 12 in HSRv0? */
@@ -343,13 +337,11 @@ static void send_hsr_supervision_frame(struct hsr_port *port,
343337 ether_addr_copy (hsr_sp -> macaddress_A , hsr -> macaddress_redbox );
344338 }
345339
346- if (skb_put_padto (skb , ETH_ZLEN )) {
347- spin_unlock_bh (& hsr -> seqnr_lock );
340+ if (skb_put_padto (skb , ETH_ZLEN ))
348341 return ;
349- }
350342
351343 hsr_forward_skb (skb , port );
352- spin_unlock_bh ( & hsr -> seqnr_lock );
344+
353345 return ;
354346}
355347
@@ -374,23 +366,18 @@ static void send_prp_supervision_frame(struct hsr_port *master,
374366 set_hsr_stag_HSR_ver (hsr_stag , (hsr -> prot_version ? 1 : 0 ));
375367
376368 /* 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 ));
380370 hsr_stag -> tlv .HSR_TLV_type = PRP_TLV_LIFE_CHECK_DD ;
381371 hsr_stag -> tlv .HSR_TLV_length = sizeof (struct hsr_sup_payload );
382372
383373 /* Payload: MacAddressA */
384374 hsr_sp = skb_put (skb , sizeof (struct hsr_sup_payload ));
385375 ether_addr_copy (hsr_sp -> macaddress_A , master -> dev -> dev_addr );
386376
387- if (skb_put_padto (skb , ETH_ZLEN )) {
388- spin_unlock_bh (& hsr -> seqnr_lock );
377+ if (skb_put_padto (skb , ETH_ZLEN ))
389378 return ;
390- }
391379
392380 hsr_forward_skb (skb , master );
393- spin_unlock_bh (& hsr -> seqnr_lock );
394381}
395382
396383/* Announce (supervision frame) timer function
@@ -621,11 +608,9 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
621608 if (res < 0 )
622609 return res ;
623610
624- spin_lock_init (& hsr -> seqnr_lock );
625611 /* 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 );
629614
630615 timer_setup (& hsr -> announce_timer , hsr_announce , 0 );
631616 timer_setup (& hsr -> prune_timer , hsr_prune_nodes , 0 );
0 commit comments