|
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
>
>
>
|