LVS
lvs-devel
Google
 
Web LinuxVirtualServer.org

Re: [PATCHv6 net-next 10/14] ipvs: show the current conn_tab size to use

To: Julian Anastasov <ja@xxxxxx>
Subject: Re: [PATCHv6 net-next 10/14] ipvs: show the current conn_tab size to users
Cc: Simon Horman <horms@xxxxxxxxxxxx>, lvs-devel@xxxxxxxxxxxxxxx, netfilter-devel@xxxxxxxxxxxxxxx, Dust Li <dust.li@xxxxxxxxxxxxxxxxx>, Jiejian Wu <jiejian@xxxxxxxxxxxxxxxxx>, rcu@xxxxxxxxxxxxxxx
From: Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx>
Date: Mon, 24 Nov 2025 22:21:53 +0100
On Sun, Oct 19, 2025 at 06:57:07PM +0300, Julian Anastasov wrote:
> As conn_tab is per-net, better to show the current hash table size
> to users instead of the ip_vs_conn_tab_size (max).
> 
> Signed-off-by: Julian Anastasov <ja@xxxxxx>
> ---
>  net/netfilter/ipvs/ip_vs_ctl.c | 36 +++++++++++++++++++++++++++++-----
>  1 file changed, 31 insertions(+), 5 deletions(-)
> 
> diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
> index c7683a9241e5..3dfc01ef1890 100644
> --- a/net/netfilter/ipvs/ip_vs_ctl.c
> +++ b/net/netfilter/ipvs/ip_vs_ctl.c
> @@ -2743,10 +2743,16 @@ static void ip_vs_info_seq_stop(struct seq_file *seq, 
> void *v)
>  
>  static int ip_vs_info_seq_show(struct seq_file *seq, void *v)
>  {
> +     struct net *net = seq_file_net(seq);
> +     struct netns_ipvs *ipvs = net_ipvs(net);
> +
>       if (v == SEQ_START_TOKEN) {
> +             struct ip_vs_rht *tc = rcu_dereference(ipvs->conn_tab);
> +             int csize = tc ? tc->size : 0;
> +
>               seq_printf(seq,
>                       "IP Virtual Server version %d.%d.%d (size=%d)\n",
> -                     NVERSION(IP_VS_VERSION_CODE), ip_vs_conn_tab_size);
> +                     NVERSION(IP_VS_VERSION_CODE), csize);
>               seq_puts(seq,
>                        "Prot LocalAddress:Port Scheduler Flags\n");
>               seq_puts(seq,
> @@ -3424,10 +3430,17 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void 
> __user *user, int *len)
>       switch (cmd) {
>       case IP_VS_SO_GET_VERSION:
>       {
> +             struct ip_vs_rht *t;
> +             int csize = 0;
>               char buf[64];
>  
> +             rcu_read_lock();
> +             t = rcu_dereference(ipvs->conn_tab);
> +             if (t)
> +                     csize = t->size;
> +             rcu_read_unlock();

here too, maybe add helper function?

>               sprintf(buf, "IP Virtual Server version %d.%d.%d (size=%d)",
> -                     NVERSION(IP_VS_VERSION_CODE), ip_vs_conn_tab_size);
> +                     NVERSION(IP_VS_VERSION_CODE), csize);
>               if (copy_to_user(user, buf, strlen(buf)+1) != 0) {
>                       ret = -EFAULT;
>                       goto out;
> @@ -3439,8 +3452,16 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user 
> *user, int *len)
>       case IP_VS_SO_GET_INFO:
>       {
>               struct ip_vs_getinfo info;
> +             struct ip_vs_rht *t;
> +             int csize = 0;
> +
> +             rcu_read_lock();
> +             t = rcu_dereference(ipvs->conn_tab);
> +             if (t)
> +                     csize = t->size;
> +             rcu_read_unlock();

... that can be used here?

>               info.version = IP_VS_VERSION_CODE;
> -             info.size = ip_vs_conn_tab_size;
> +             info.size = csize;
>               info.num_services =
>                       atomic_read(&ipvs->num_services[IP_VS_AF_INET]);
>               if (copy_to_user(user, &info, sizeof(info)) != 0)
> @@ -4379,6 +4400,8 @@ static int ip_vs_genl_get_cmd(struct sk_buff *skb, 
> struct genl_info *info)
>       int ret, cmd, reply_cmd;
>       struct net *net = sock_net(skb->sk);
>       struct netns_ipvs *ipvs = net_ipvs(net);
> +     struct ip_vs_rht *t;
> +     int csize;
>  
>       cmd = info->genlhdr->cmd;
>  
> @@ -4446,10 +4469,13 @@ static int ip_vs_genl_get_cmd(struct sk_buff *skb, 
> struct genl_info *info)
>       }
>  
>       case IPVS_CMD_GET_INFO:
> +             csize = 0;
> +             t = rcu_dereference(ipvs->conn_tab);
> +             if (t)
> +                     csize = t->size;

... I found another candidate to use the helper here :)

If you add the helper function first, then I think this patch will be
super-small when switching to per-netns, because only the helper
function to get the size will need to be adjusted.

>               if (nla_put_u32(msg, IPVS_INFO_ATTR_VERSION,
>                               IP_VS_VERSION_CODE) ||
> -                 nla_put_u32(msg, IPVS_INFO_ATTR_CONN_TAB_SIZE,
> -                             ip_vs_conn_tab_size))
> +                 nla_put_u32(msg, IPVS_INFO_ATTR_CONN_TAB_SIZE, csize))
>                       goto nla_put_failure;
>               break;
>       }
> -- 
> 2.51.0
> 
> 
> 


<Prev in Thread] Current Thread [Next in Thread>
  • Re: [PATCHv6 net-next 10/14] ipvs: show the current conn_tab size to users, Pablo Neira Ayuso <=