neighbor: Fix state check in neigh_forced_gc
authorDavid Ahern <dsahern@gmail.com>
Wed, 12 Dec 2018 01:57:22 +0000 (18:57 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 14 Dec 2018 23:44:47 +0000 (15:44 -0800)
PERMANENT entries are not on the gc_list so the state check is now
redundant. Also, the move to not purge entries until after 5 seconds
should not apply to FAILED entries; those can be removed immediately
to make way for newer ones. This restores the previous logic prior to
the gc_list.

Fixes: 58956317c8de ("neighbor: Improve garbage collection")
Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/neighbour.c

index 010784123bc1eb2d4b002d1d2dac065e46e8e035..acaa1a64150de9a000a92bf89c2ae5bff42af128 100644 (file)
@@ -204,7 +204,6 @@ static int neigh_forced_gc(struct neigh_table *tbl)
        unsigned long tref = jiffies - 5 * HZ;
        u8 flags = NTF_EXT_LEARNED;
        struct neighbour *n, *tmp;
-       u8 state = NUD_PERMANENT;
        int shrunk = 0;
 
        NEIGH_CACHE_STAT_INC(tbl, forced_gc_runs);
@@ -216,8 +215,8 @@ static int neigh_forced_gc(struct neigh_table *tbl)
                        bool remove = false;
 
                        write_lock(&n->lock);
-                       if (!(n->nud_state & state) && !(n->flags & flags) &&
-                           time_after(tref, n->updated))
+                       if ((n->nud_state == NUD_FAILED) ||
+                           (!(n->flags & flags) && time_after(tref, n->updated)))
                                remove = true;
                        write_unlock(&n->lock);