netfilter: nft_set_rbtree: skip elements in transaction from garbage collection
[platform/kernel/linux-rpi.git] / net / 802 / mrp.c
index 35e04cc..c10a432 100644 (file)
@@ -606,7 +606,10 @@ static void mrp_join_timer(struct timer_list *t)
        spin_unlock(&app->lock);
 
        mrp_queue_xmit(app);
-       mrp_join_timer_arm(app);
+       spin_lock(&app->lock);
+       if (likely(app->active))
+               mrp_join_timer_arm(app);
+       spin_unlock(&app->lock);
 }
 
 static void mrp_periodic_timer_arm(struct mrp_applicant *app)
@@ -620,11 +623,12 @@ static void mrp_periodic_timer(struct timer_list *t)
        struct mrp_applicant *app = from_timer(app, t, periodic_timer);
 
        spin_lock(&app->lock);
-       mrp_mad_event(app, MRP_EVENT_PERIODIC);
-       mrp_pdu_queue(app);
+       if (likely(app->active)) {
+               mrp_mad_event(app, MRP_EVENT_PERIODIC);
+               mrp_pdu_queue(app);
+               mrp_periodic_timer_arm(app);
+       }
        spin_unlock(&app->lock);
-
-       mrp_periodic_timer_arm(app);
 }
 
 static int mrp_pdu_parse_end_mark(struct sk_buff *skb, int *offset)
@@ -872,6 +876,7 @@ int mrp_init_applicant(struct net_device *dev, struct mrp_application *appl)
        app->dev = dev;
        app->app = appl;
        app->mad = RB_ROOT;
+       app->active = true;
        spin_lock_init(&app->lock);
        skb_queue_head_init(&app->queue);
        rcu_assign_pointer(dev->mrp_port->applicants[appl->type], app);
@@ -900,6 +905,9 @@ void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *appl)
 
        RCU_INIT_POINTER(port->applicants[appl->type], NULL);
 
+       spin_lock_bh(&app->lock);
+       app->active = false;
+       spin_unlock_bh(&app->lock);
        /* Delete timer and generate a final TX event to flush out
         * all pending messages before the applicant is gone.
         */