| .. | .. |
|---|
| 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 | */ |
|---|