hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/802/mrp.c
....@@ -606,7 +606,10 @@
606606 spin_unlock(&app->lock);
607607
608608 mrp_queue_xmit(app);
609
- mrp_join_timer_arm(app);
609
+ spin_lock(&app->lock);
610
+ if (likely(app->active))
611
+ mrp_join_timer_arm(app);
612
+ spin_unlock(&app->lock);
610613 }
611614
612615 static void mrp_periodic_timer_arm(struct mrp_applicant *app)
....@@ -620,11 +623,12 @@
620623 struct mrp_applicant *app = from_timer(app, t, periodic_timer);
621624
622625 spin_lock(&app->lock);
623
- mrp_mad_event(app, MRP_EVENT_PERIODIC);
624
- mrp_pdu_queue(app);
626
+ if (likely(app->active)) {
627
+ mrp_mad_event(app, MRP_EVENT_PERIODIC);
628
+ mrp_pdu_queue(app);
629
+ mrp_periodic_timer_arm(app);
630
+ }
625631 spin_unlock(&app->lock);
626
-
627
- mrp_periodic_timer_arm(app);
628632 }
629633
630634 static int mrp_pdu_parse_end_mark(struct sk_buff *skb, int *offset)
....@@ -872,6 +876,7 @@
872876 app->dev = dev;
873877 app->app = appl;
874878 app->mad = RB_ROOT;
879
+ app->active = true;
875880 spin_lock_init(&app->lock);
876881 skb_queue_head_init(&app->queue);
877882 rcu_assign_pointer(dev->mrp_port->applicants[appl->type], app);
....@@ -900,6 +905,9 @@
900905
901906 RCU_INIT_POINTER(port->applicants[appl->type], NULL);
902907
908
+ spin_lock_bh(&app->lock);
909
+ app->active = false;
910
+ spin_unlock_bh(&app->lock);
903911 /* Delete timer and generate a final TX event to flush out
904912 * all pending messages before the applicant is gone.
905913 */