]> Git Repo - linux.git/commitdiff
ipv4: avoid quadratic behavior in FIB insertion of common address
authorAlexandre Ferrieux <[email protected]>
Tue, 1 Oct 2024 23:14:38 +0000 (01:14 +0200)
committerJakub Kicinski <[email protected]>
Thu, 3 Oct 2024 23:15:30 +0000 (16:15 -0700)
Mix netns into all IPv4 FIB hashes to avoid massive collision when
inserting the same address in many netns.

Signed-off-by: Alexandre Ferrieux <[email protected]>
Reviewed-by: Eric Dumazet <[email protected]>
Reviewed-by: Kuniyuki Iwashima <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Jakub Kicinski <[email protected]>
net/ipv4/fib_semantics.c

index ba2df3d2ac15cffb95dedddf40103a865c909363..1a847ba4045876c91948bcec45cb5eccc0ef1f31 100644 (file)
@@ -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) {
This page took 0.054808 seconds and 4 git commands to generate.