neighbour: force neigh_invalidate when NUD_FAILED update is from admin
authorRoopa Prabhu <roopa@cumulusnetworks.com>
Tue, 26 Jun 2018 03:32:53 +0000 (20:32 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 27 Jun 2018 06:40:45 +0000 (15:40 +0900)
In systems where neigh gc thresh holds are set to high values,
admin deleted neigh entries (eg ip neigh flush or ip neigh del) can
linger around in NUD_FAILED state for a long time until periodic gc kicks
in. This patch forces neigh_invalidate when NUD_FAILED neigh_update is
from an admin.

Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/neighbour.c

index 8e3fda9e725cba97973ed2ce85ebe6f2e926e7cf..cbe85d8d4cc21239288a09927f60a08642781c3d 100644 (file)
@@ -1148,7 +1148,8 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
                neigh->nud_state = new;
                err = 0;
                notify = old & NUD_VALID;
-               if ((old & (NUD_INCOMPLETE | NUD_PROBE)) &&
+               if (((old & (NUD_INCOMPLETE | NUD_PROBE)) ||
+                    (flags & NEIGH_UPDATE_F_ADMIN)) &&
                    (new & NUD_FAILED)) {
                        neigh_invalidate(neigh);
                        notify = 1;