LVS
lvs-devel
Google
 
Web LinuxVirtualServer.org

[PATCH] ipvs: Use flexible array for MH lookup table

To: netfilter-devel@xxxxxxxxxxxxxxx
Subject: [PATCH] ipvs: Use flexible array for MH lookup table
Cc: Simon Horman <horms@xxxxxxxxxxxx>, Julian Anastasov <ja@xxxxxx>, Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx>, Florian Westphal <fw@xxxxxxxxx>, Phil Sutter <phil@xxxxxx>, "David S. Miller" <davem@xxxxxxxxxxxxx>, Eric Dumazet <edumazet@xxxxxxxxxx>, Jakub Kicinski <kuba@xxxxxxxxxx>, Paolo Abeni <pabeni@xxxxxxxxxx>, netdev@xxxxxxxxxxxxxxx (open list:IPVS), lvs-devel@xxxxxxxxxxxxxxx (open list:IPVS), coreteam@xxxxxxxxxxxxx (open list:NETFILTER), linux-kernel@xxxxxxxxxxxxxxx (open list)
From: Rosen Penev <rosenp@xxxxxxxxx>
Date: Mon, 18 May 2026 18:55:06 -0700
Store the Maglev hash lookup table in the scheduler state
allocation instead of allocating it separately.

This keeps the lookup table tied to the RCU-freed state lifetime and
simplifies the allocation and cleanup paths.

Assisted-by: Codex:GPT-5.5
Signed-off-by: Rosen Penev <rosenp@xxxxxxxxx>
---
 net/netfilter/ipvs/ip_vs_mh.c | 11 ++---------
 1 file changed, 2 insertions(+), 9 deletions(-)

diff --git a/net/netfilter/ipvs/ip_vs_mh.c b/net/netfilter/ipvs/ip_vs_mh.c
index 020863047562..d31d3c6d4216 100644
--- a/net/netfilter/ipvs/ip_vs_mh.c
+++ b/net/netfilter/ipvs/ip_vs_mh.c
@@ -59,11 +59,11 @@ static int primes[] = {251, 509, 1021, 2039, 4093,
 
 struct ip_vs_mh_state {
        struct rcu_head                 rcu_head;
-       struct ip_vs_mh_lookup          *lookup;
        struct ip_vs_mh_dest_setup      *dest_setup;
        hsiphash_key_t                  hash1, hash2;
        int                             gcd;
        int                             rshift;
+       struct ip_vs_mh_lookup          lookup[];
 };
 
 static inline void generate_hash_secret(hsiphash_key_t *hash1,
@@ -372,7 +372,6 @@ static void ip_vs_mh_state_free(struct rcu_head *head)
        struct ip_vs_mh_state *s;
 
        s = container_of(head, struct ip_vs_mh_state, rcu_head);
-       kfree(s->lookup);
        kfree(s);
 }
 
@@ -382,16 +381,10 @@ static int ip_vs_mh_init_svc(struct ip_vs_service *svc)
        struct ip_vs_mh_state *s;
 
        /* Allocate the MH table for this service */
-       s = kzalloc_obj(*s);
+       s = kzalloc_flex(*s, lookup, IP_VS_MH_TAB_SIZE);
        if (!s)
                return -ENOMEM;
 
-       s->lookup = kzalloc_objs(struct ip_vs_mh_lookup, IP_VS_MH_TAB_SIZE);
-       if (!s->lookup) {
-               kfree(s);
-               return -ENOMEM;
-       }
-
        generate_hash_secret(&s->hash1, &s->hash2);
        s->gcd = ip_vs_mh_gcd_weight(svc);
        s->rshift = ip_vs_mh_shift_weight(svc, s->gcd);
-- 
2.54.0



<Prev in Thread] Current Thread [Next in Thread>