mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	neighbour: skip NTF_EXT_LEARNED entries during forced gc
Commit9ce33e4653("neighbour: support for NTF_EXT_LEARNED flag") added support for NTF_EXT_LEARNED for neighbour entries. NTF_EXT_LEARNED entries are neigh entries managed by control plane (eg: Ethernet VPN implementation in FRR routing suite). Periodic gc already excludes these entries. This patch extends it to forced gc which the earlier patch missed. Fixes:9ce33e4653("neighbour: support for NTF_EXT_LEARNED flag") Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									7c099773b0
								
							
						
					
					
						commit
						f6a6f203d5
					
				
					 1 changed files with 6 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -119,13 +119,14 @@ unsigned long neigh_rand_reach_time(unsigned long base)
 | 
			
		|||
EXPORT_SYMBOL(neigh_rand_reach_time);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool neigh_del(struct neighbour *n, __u8 state,
 | 
			
		||||
static bool neigh_del(struct neighbour *n, __u8 state, __u8 flags,
 | 
			
		||||
		      struct neighbour __rcu **np, struct neigh_table *tbl)
 | 
			
		||||
{
 | 
			
		||||
	bool retval = false;
 | 
			
		||||
 | 
			
		||||
	write_lock(&n->lock);
 | 
			
		||||
	if (refcount_read(&n->refcnt) == 1 && !(n->nud_state & state)) {
 | 
			
		||||
	if (refcount_read(&n->refcnt) == 1 && !(n->nud_state & state) &&
 | 
			
		||||
	    !(n->flags & flags)) {
 | 
			
		||||
		struct neighbour *neigh;
 | 
			
		||||
 | 
			
		||||
		neigh = rcu_dereference_protected(n->next,
 | 
			
		||||
| 
						 | 
				
			
			@ -157,7 +158,7 @@ bool neigh_remove_one(struct neighbour *ndel, struct neigh_table *tbl)
 | 
			
		|||
	while ((n = rcu_dereference_protected(*np,
 | 
			
		||||
					      lockdep_is_held(&tbl->lock)))) {
 | 
			
		||||
		if (n == ndel)
 | 
			
		||||
			return neigh_del(n, 0, np, tbl);
 | 
			
		||||
			return neigh_del(n, 0, 0, np, tbl);
 | 
			
		||||
		np = &n->next;
 | 
			
		||||
	}
 | 
			
		||||
	return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -185,7 +186,8 @@ static int neigh_forced_gc(struct neigh_table *tbl)
 | 
			
		|||
			 * - nobody refers to it.
 | 
			
		||||
			 * - it is not permanent
 | 
			
		||||
			 */
 | 
			
		||||
			if (neigh_del(n, NUD_PERMANENT, np, tbl)) {
 | 
			
		||||
			if (neigh_del(n, NUD_PERMANENT, NTF_EXT_LEARNED, np,
 | 
			
		||||
				      tbl)) {
 | 
			
		||||
				shrunk = 1;
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue