Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f494554 authored by Thomas Graf's avatar Thomas Graf Committed by David S. Miller
Browse files

[NEIGH]: Combine neighbour cleanup and release



Introduces neigh_cleanup_and_release() to be used after a
neighbour has been removed from its neighbour table. Serves
as preparation to add event notifications.

Signed-off-by: default avatarThomas Graf <tgraf@suug.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1e6e9342
Loading
Loading
Loading
Loading
+13 −14
Original line number Diff line number Diff line
@@ -105,6 +105,14 @@ static int neigh_blackhole(struct sk_buff *skb)
	return -ENETDOWN;
}

static void neigh_cleanup_and_release(struct neighbour *neigh)
{
	if (neigh->parms->neigh_cleanup)
		neigh->parms->neigh_cleanup(neigh);

	neigh_release(neigh);
}

/*
 * It is random distribution in the interval (1/2)*base...(3/2)*base.
 * It corresponds to default IPv6 settings and is not overridable,
@@ -141,9 +149,7 @@ static int neigh_forced_gc(struct neigh_table *tbl)
				n->dead = 1;
				shrunk	= 1;
				write_unlock(&n->lock);
				if (n->parms->neigh_cleanup)
					n->parms->neigh_cleanup(n);
				neigh_release(n);
				neigh_cleanup_and_release(n);
				continue;
			}
			write_unlock(&n->lock);
@@ -214,9 +220,7 @@ static void neigh_flush_dev(struct neigh_table *tbl, struct net_device *dev)
				NEIGH_PRINTK2("neigh %p is stray.\n", n);
			}
			write_unlock(&n->lock);
			if (n->parms->neigh_cleanup)
				n->parms->neigh_cleanup(n);
			neigh_release(n);
			neigh_cleanup_and_release(n);
		}
	}
}
@@ -677,9 +681,7 @@ static void neigh_periodic_timer(unsigned long arg)
			*np = n->next;
			n->dead = 1;
			write_unlock(&n->lock);
			if (n->parms->neigh_cleanup)
				n->parms->neigh_cleanup(n);
			neigh_release(n);
			neigh_cleanup_and_release(n);
			continue;
		}
		write_unlock(&n->lock);
@@ -2095,11 +2097,8 @@ void __neigh_for_each_release(struct neigh_table *tbl,
			} else
				np = &n->next;
			write_unlock(&n->lock);
			if (release) {
				if (n->parms->neigh_cleanup)
					n->parms->neigh_cleanup(n);
				neigh_release(n);
			}
			if (release)
				neigh_cleanup_and_release(n);
		}
	}
}