To make it more conventional to hold subscription refcount in timer,
its policy is adjusted as follows:

Before sub->timer is started, subscription refcount is held; when
sub->timer is expired, subscription refcount will be decreased at the
end of the timer timeout function; when the timer is stopped, refcount
also needs to be decreased if the timer is still active.

Signed-off-by: Ying Xue <ying....@windriver.com>
---
 net/tipc/subscr.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c
index 111d33c6..ffd7b9d 100644
--- a/net/tipc/subscr.c
+++ b/net/tipc/subscr.c
@@ -241,8 +241,10 @@ static void tipc_subscrp_delete(struct tipc_subscription 
*sub)
 {
        u32 timeout = htohl(sub->evt.s.timeout, sub->swap);
 
-       if (timeout == TIPC_WAIT_FOREVER || del_timer(&sub->timer))
+       if (timeout != TIPC_WAIT_FOREVER && del_timer(&sub->timer))
                tipc_subscrp_put(sub);
+
+       tipc_subscrp_put(sub);
 }
 
 static void tipc_subscrp_cancel(struct tipc_subscr *s,
@@ -303,16 +305,18 @@ static void tipc_subscrp_subscribe(struct net *net, 
struct tipc_subscr *s,
        spin_lock_bh(&subscriber->lock);
        list_add(&sub->subscrp_list, &subscriber->subscrp_list);
 
+       tipc_subscrb_get(subscriber);
        sub->subscriber = subscriber;
+
        tipc_nametbl_subscribe(sub);
-       tipc_subscrb_get(subscriber);
        spin_unlock_bh(&subscriber->lock);
 
        setup_timer(&sub->timer, tipc_subscrp_timeout, (unsigned long)sub);
        timeout = htohl(sub->evt.s.timeout, swap);
 
-       if (timeout != TIPC_WAIT_FOREVER)
-               mod_timer(&sub->timer, jiffies + msecs_to_jiffies(timeout));
+       if ((timeout != TIPC_WAIT_FOREVER) &&
+           !mod_timer(&sub->timer, jiffies + msecs_to_jiffies(timeout)))
+               tipc_subscrp_get(sub);
 }
 
 /* Handle one termination request for the subscriber */
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to