Re: [PATCHv6 net-next 10/14] ipvs: show the current conn_tab size to users
Pablo Neira Ayuso <[email protected]> Mon, 24 Nov 2025 22:21:53 +0100
| Newsgroups | org.kernel.vger.lvs-devel,org.kernel.vger.netfilter-devel,org.kernel.vger.rcu |
|---|---|
| Message-ID | <aSTMcYl8bt6MLJ6o@calendula> |
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 <[email protected]> > --- > 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 > > >