Commit ae245557f87fffe2e1c39ba07524024e650e822b
Committed by
David S. Miller
1 parent
f3ad288c56
tipc: donot create timers if subscription timeout = TIPC_WAIT_FOREVER
Until now, we create timers even for the subscription requests with timeout = TIPC_WAIT_FOREVER. This can be improved by avoiding timer creation when the timeout is set to TIPC_WAIT_FOREVER. In this commit, we introduce a check to creates timers only when timeout != TIPC_WAIT_FOREVER. Acked-by: Ying Xue <ying.xue@windriver.com> Reviewed-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: Parthasarathy Bhuvaragan <parthasarathy.bhuvaragan@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 1 changed file with 11 additions and 3 deletions Side-by-side Diff
net/tipc/subscr.c
... | ... | @@ -188,12 +188,14 @@ |
188 | 188 | static void tipc_subscrb_delete(struct tipc_subscriber *subscriber) |
189 | 189 | { |
190 | 190 | struct tipc_subscription *sub, *temp; |
191 | + u32 timeout; | |
191 | 192 | |
192 | 193 | spin_lock_bh(&subscriber->lock); |
193 | 194 | /* Destroy any existing subscriptions for subscriber */ |
194 | 195 | list_for_each_entry_safe(sub, temp, &subscriber->subscrp_list, |
195 | 196 | subscrp_list) { |
196 | - if (del_timer(&sub->timer)) { | |
197 | + timeout = htohl(sub->evt.s.timeout, sub->swap); | |
198 | + if ((timeout == TIPC_WAIT_FOREVER) || del_timer(&sub->timer)) { | |
197 | 199 | tipc_subscrp_delete(sub); |
198 | 200 | tipc_subscrb_put(subscriber); |
199 | 201 | } |
200 | 202 | |
... | ... | @@ -217,13 +219,16 @@ |
217 | 219 | struct tipc_subscriber *subscriber) |
218 | 220 | { |
219 | 221 | struct tipc_subscription *sub, *temp; |
222 | + u32 timeout; | |
220 | 223 | |
221 | 224 | spin_lock_bh(&subscriber->lock); |
222 | 225 | /* Find first matching subscription, exit if not found */ |
223 | 226 | list_for_each_entry_safe(sub, temp, &subscriber->subscrp_list, |
224 | 227 | subscrp_list) { |
225 | 228 | if (!memcmp(s, &sub->evt.s, sizeof(struct tipc_subscr))) { |
226 | - if (del_timer(&sub->timer)) { | |
229 | + timeout = htohl(sub->evt.s.timeout, sub->swap); | |
230 | + if ((timeout == TIPC_WAIT_FOREVER) || | |
231 | + del_timer(&sub->timer)) { | |
227 | 232 | tipc_subscrp_delete(sub); |
228 | 233 | tipc_subscrb_put(subscriber); |
229 | 234 | } |
... | ... | @@ -267,7 +272,6 @@ |
267 | 272 | sub->swap = swap; |
268 | 273 | memcpy(&sub->evt.s, s, sizeof(*s)); |
269 | 274 | atomic_inc(&tn->subscription_count); |
270 | - setup_timer(&sub->timer, tipc_subscrp_timeout, (unsigned long)sub); | |
271 | 275 | return sub; |
272 | 276 | } |
273 | 277 | |
... | ... | @@ -290,6 +294,10 @@ |
290 | 294 | spin_unlock_bh(&subscriber->lock); |
291 | 295 | |
292 | 296 | timeout = htohl(sub->evt.s.timeout, swap); |
297 | + if (timeout == TIPC_WAIT_FOREVER) | |
298 | + return; | |
299 | + | |
300 | + setup_timer(&sub->timer, tipc_subscrp_timeout, (unsigned long)sub); | |
293 | 301 | mod_timer(&sub->timer, jiffies + msecs_to_jiffies(timeout)); |
294 | 302 | } |
295 | 303 |