Commit a43d8994 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller

[NEIGH]: Make neigh_add_timer symmetrical to neigh_del_timer.

The neigh_del_timer() looks sane - it removes the timer and
(conditionally) puts the neighbor. I expected, that the
neigh_add_timer() is symmetrical to the del one - i.e. it
holds the neighbor and arms the timer - but it turned out
that it was not so.

I think, that making them look symmetrical makes the code
more readable.
Signed-off-by: default avatarPavel Emelyanov <xemul@openvz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7054fb93
...@@ -165,6 +165,16 @@ static int neigh_forced_gc(struct neigh_table *tbl) ...@@ -165,6 +165,16 @@ static int neigh_forced_gc(struct neigh_table *tbl)
return shrunk; return shrunk;
} }
static void neigh_add_timer(struct neighbour *n, unsigned long when)
{
neigh_hold(n);
if (unlikely(mod_timer(&n->timer, when))) {
printk("NEIGH: BUG, double timer add, state is %x\n",
n->nud_state);
dump_stack();
}
}
static int neigh_del_timer(struct neighbour *n) static int neigh_del_timer(struct neighbour *n)
{ {
if ((n->nud_state & NUD_IN_TIMER) && if ((n->nud_state & NUD_IN_TIMER) &&
...@@ -716,15 +726,6 @@ static __inline__ int neigh_max_probes(struct neighbour *n) ...@@ -716,15 +726,6 @@ static __inline__ int neigh_max_probes(struct neighbour *n)
p->ucast_probes + p->app_probes + p->mcast_probes); p->ucast_probes + p->app_probes + p->mcast_probes);
} }
static inline void neigh_add_timer(struct neighbour *n, unsigned long when)
{
if (unlikely(mod_timer(&n->timer, when))) {
printk("NEIGH: BUG, double timer add, state is %x\n",
n->nud_state);
dump_stack();
}
}
/* Called when a timer expires for a neighbour entry. */ /* Called when a timer expires for a neighbour entry. */
static void neigh_timer_handler(unsigned long arg) static void neigh_timer_handler(unsigned long arg)
...@@ -856,7 +857,6 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) ...@@ -856,7 +857,6 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
atomic_set(&neigh->probes, neigh->parms->ucast_probes); atomic_set(&neigh->probes, neigh->parms->ucast_probes);
neigh->nud_state = NUD_INCOMPLETE; neigh->nud_state = NUD_INCOMPLETE;
neigh->updated = jiffies; neigh->updated = jiffies;
neigh_hold(neigh);
neigh_add_timer(neigh, now + 1); neigh_add_timer(neigh, now + 1);
} else { } else {
neigh->nud_state = NUD_FAILED; neigh->nud_state = NUD_FAILED;
...@@ -869,7 +869,6 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) ...@@ -869,7 +869,6 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
} }
} else if (neigh->nud_state & NUD_STALE) { } else if (neigh->nud_state & NUD_STALE) {
NEIGH_PRINTK2("neigh %p is delayed.\n", neigh); NEIGH_PRINTK2("neigh %p is delayed.\n", neigh);
neigh_hold(neigh);
neigh->nud_state = NUD_DELAY; neigh->nud_state = NUD_DELAY;
neigh->updated = jiffies; neigh->updated = jiffies;
neigh_add_timer(neigh, neigh_add_timer(neigh,
...@@ -1013,13 +1012,11 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, ...@@ -1013,13 +1012,11 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
if (new != old) { if (new != old) {
neigh_del_timer(neigh); neigh_del_timer(neigh);
if (new & NUD_IN_TIMER) { if (new & NUD_IN_TIMER)
neigh_hold(neigh);
neigh_add_timer(neigh, (jiffies + neigh_add_timer(neigh, (jiffies +
((new & NUD_REACHABLE) ? ((new & NUD_REACHABLE) ?
neigh->parms->reachable_time : neigh->parms->reachable_time :
0))); 0)));
}
neigh->nud_state = new; neigh->nud_state = new;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment