.. | .. |
---|
606 | 606 | spin_unlock(&app->lock); |
---|
607 | 607 | |
---|
608 | 608 | 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); |
---|
610 | 613 | } |
---|
611 | 614 | |
---|
612 | 615 | static void mrp_periodic_timer_arm(struct mrp_applicant *app) |
---|
.. | .. |
---|
620 | 623 | struct mrp_applicant *app = from_timer(app, t, periodic_timer); |
---|
621 | 624 | |
---|
622 | 625 | 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 | + } |
---|
625 | 631 | spin_unlock(&app->lock); |
---|
626 | | - |
---|
627 | | - mrp_periodic_timer_arm(app); |
---|
628 | 632 | } |
---|
629 | 633 | |
---|
630 | 634 | static int mrp_pdu_parse_end_mark(struct sk_buff *skb, int *offset) |
---|
.. | .. |
---|
872 | 876 | app->dev = dev; |
---|
873 | 877 | app->app = appl; |
---|
874 | 878 | app->mad = RB_ROOT; |
---|
| 879 | + app->active = true; |
---|
875 | 880 | spin_lock_init(&app->lock); |
---|
876 | 881 | skb_queue_head_init(&app->queue); |
---|
877 | 882 | rcu_assign_pointer(dev->mrp_port->applicants[appl->type], app); |
---|
.. | .. |
---|
900 | 905 | |
---|
901 | 906 | RCU_INIT_POINTER(port->applicants[appl->type], NULL); |
---|
902 | 907 | |
---|
| 908 | + spin_lock_bh(&app->lock); |
---|
| 909 | + app->active = false; |
---|
| 910 | + spin_unlock_bh(&app->lock); |
---|
903 | 911 | /* Delete timer and generate a final TX event to flush out |
---|
904 | 912 | * all pending messages before the applicant is gone. |
---|
905 | 913 | */ |
---|