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);

Reply via email to