Commit 9b8ca048 authored by Alexandre Ferrieux's avatar Alexandre Ferrieux Committed by Jakub Kicinski
Browse files

ipv4: avoid quadratic behavior in FIB insertion of common address



Mix netns into all IPv4 FIB hashes to avoid massive collision when
inserting the same address in many netns.

Signed-off-by: default avatarAlexandre Ferrieux <alexandre.ferrieux@orange.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20241001231438.3855035-1-alexandre.ferrieux@orange.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 35d8471e
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -347,11 +347,10 @@ static unsigned int fib_info_hashfn_1(int init_val, u8 protocol, u8 scope,
	return val;
}

static unsigned int fib_info_hashfn_result(unsigned int val)
static unsigned int fib_info_hashfn_result(const struct net *net,
					   unsigned int val)
{
	unsigned int mask = (fib_info_hash_size - 1);

	return (val ^ (val >> 7) ^ (val >> 12)) & mask;
	return hash_32(val ^ net_hash_mix(net), fib_info_hash_bits);
}

static inline unsigned int fib_info_hashfn(struct fib_info *fi)
@@ -370,7 +369,7 @@ static inline unsigned int fib_info_hashfn(struct fib_info *fi)
		} endfor_nexthops(fi)
	}

	return fib_info_hashfn_result(val);
	return fib_info_hashfn_result(fi->fib_net, val);
}

/* no metrics, only nexthop id */
@@ -385,7 +384,7 @@ static struct fib_info *fib_find_info_nh(struct net *net,
				 cfg->fc_protocol, cfg->fc_scope,
				 (__force u32)cfg->fc_prefsrc,
				 cfg->fc_priority);
	hash = fib_info_hashfn_result(hash);
	hash = fib_info_hashfn_result(net, hash);
	head = &fib_info_hash[hash];

	hlist_for_each_entry(fi, head, fib_hash) {