Subject: [PATCH net-next 2/5] neighbor: Fix state check in neigh_forced_gc

From: David Ahern <[email-masked]>
Date: Tue, 11 Dec 2018 18:57:22 -0700

From: David Ahern <[email-masked]>

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 <[email-masked]>
---
 net/core/neighbour.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 010784123bc1..acaa1a64150d 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -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);
 
-- 
2.11.0