LVS
lvs-devel
Google
 
Web LinuxVirtualServer.org

[PATCHv3 net-next 10/14] ipvs: show the current conn_tab size to users

To: Simon Horman <horms@xxxxxxxxxxxx>
Subject: [PATCHv3 net-next 10/14] ipvs: show the current conn_tab size to users
Cc: lvs-devel@xxxxxxxxxxxxxxx, netfilter-devel@xxxxxxxxxxxxxxx, Dust Li <dust.li@xxxxxxxxxxxxxxxxx>, Jiejian Wu <jiejian@xxxxxxxxxxxxxxxxx>, rcu@xxxxxxxxxxxxxxx
From: Julian Anastasov <ja@xxxxxx>
Date: Sun, 31 Mar 2024 17:03:57 +0300
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 a5a7d7027237..5e9babed6799 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -2742,10 +2742,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,
@@ -3423,10 +3429,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();
                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;
@@ -3438,8 +3451,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();
                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)
@@ -4381,6 +4402,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;
 
@@ -4448,10 +4471,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;
                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.44.0




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