On Thu, 2006-06-04 at 11:18 -0400, jamal wrote:
> After a little testing (i missed the scenario where a user subscribes
> and then leaves and then resubscribes; in such a case, the timer never
> gets restarted) i have updated the patch to do it the brute force way.
> What you propose is more optimal, I will let Krisztian comment and then
> whip a patch.
Patch attached for real this time ;->
cheers,
jamal
Restore timer rescheduling to fix a corner case where the packet
threshold is very high, the timer low and a very low packet rate
input. We may end in a rot situation.
Signed-off-by: Jamal Hadi Salim <[EMAIL PROTECTED]>
---
--- a/net/xfrm/xfrm_state.c 2006-04-05 07:25:33.000000000 -0400
+++ b/net/xfrm/xfrm_state.c 2006-04-06 10:52:56.000000000 -0400
@@ -814,7 +814,7 @@
if ((x->replay.seq == x->preplay.seq) &&
(x->replay.bitmap == x->preplay.bitmap) &&
(x->replay.oseq == x->preplay.oseq))
- return;
+ goto resched;
break;
}
@@ -824,6 +824,7 @@
c.data.aevent = event;
km_state_notify(x, &c);
+resched:
if (x->replay_maxage &&
!mod_timer(&x->rtimer, jiffies + x->replay_maxage))
xfrm_state_hold(x);
@@ -836,8 +837,13 @@
spin_lock(&x->lock);
- if (xfrm_aevent_is_on() && x->km.state == XFRM_STATE_VALID)
- xfrm_replay_notify(x, XFRM_REPLAY_TIMEOUT);
+ if (x->km.state == XFRM_STATE_VALID) {
+ if (xfrm_aevent_is_on())
+ xfrm_replay_notify(x, XFRM_REPLAY_TIMEOUT);
+ else if (x->replay_maxage &&
+ !mod_timer(&x->rtimer, jiffies + x->replay_maxage))
+ xfrm_state_hold(x);
+ }
spin_unlock(&x->lock);
}