Herbert, Both Krisztian and myself independently bumped into this problem. Summary is: it is problematic to do reasonably timed failovers without that timer that was initially in the original patch.
So i am attaching a patch against Linus' tree. Dave, If Herbert acks, please apply this to Linus tree. We could consider this to be a bug fix. 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]> --- net/xfrm/xfrm_state.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index a8e14dc..2c7b68b 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -814,7 +814,7 @@ void xfrm_replay_notify(struct xfrm_stat 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 @@ void xfrm_replay_notify(struct xfrm_stat 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);