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>
Reviewed-by: Jon Maloy <jon.ma...@ericsson.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


------------------------------------------------------------------------------
Announcing the Oxford Dictionaries API! The API offers world-renowned
dictionary content that is easy and intuitive to access. Sign up for an
account today to start using our lexical data to power your apps and
projects. Get started today and enter our developer competition.
http://sdm.link/oxford
_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to