]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nfsd: make svc_stat per-network namespace instead of global
authorJosef Bacik <josef@toxicpanda.com>
Thu, 5 Sep 2024 15:31:01 +0000 (11:31 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Sep 2024 09:06:45 +0000 (11:06 +0200)
[ Upstream commit 16fb9808ab2c99979f081987752abcbc5b092eac ]

The final bit of stats that is global is the rpc svc_stat.  Move this
into the nfsd_net struct and use that everywhere instead of the global
struct.  Remove the unused global struct.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/nfsd/netns.h
fs/nfsd/nfsctl.c
fs/nfsd/nfssvc.c
fs/nfsd/stats.c
fs/nfsd/stats.h

index 55ab923263844e860c50e22c6a3e30e52b8caff3..548422b24a7d785785f5b75d92e4ce3dee118cb7 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/nfs4.h>
 #include <linux/percpu_counter.h>
 #include <linux/siphash.h>
+#include <linux/sunrpc/stats.h>
 
 /* Hash tables for nfs4_clientid state */
 #define CLIENT_HASH_BITS                 4
@@ -183,6 +184,9 @@ struct nfsd_net {
        /* Per-netns stats counters */
        struct percpu_counter    counter[NFSD_STATS_COUNTERS_NUM];
 
+       /* sunrpc svc stats */
+       struct svc_stat          nfsd_svcstats;
+
        /* longest hash chain seen */
        unsigned int             longest_chain;
 
index e7fa64834d7d8dcb6de9df08d3c5602a9a0e95a1..2feaa49fb9fe25fc95448b1c2132eb42b0be4ec3 100644 (file)
@@ -1461,6 +1461,8 @@ static __net_init int nfsd_init_net(struct net *net)
        retval = nfsd_stat_counters_init(nn);
        if (retval)
                goto out_repcache_error;
+       memset(&nn->nfsd_svcstats, 0, sizeof(nn->nfsd_svcstats));
+       nn->nfsd_svcstats.program = &nfsd_program;
        nn->nfsd_versions = NULL;
        nn->nfsd4_minorversions = NULL;
        nfsd4_init_leases_net(nn);
index 3f02a9a44c6b8a30e84cd20c0dead4708355d87e..29eb9861684e3f1baaf4025793b02b420fe950a3 100644 (file)
@@ -664,7 +664,7 @@ int nfsd_create_serv(struct net *net)
        if (nfsd_max_blksize == 0)
                nfsd_max_blksize = nfsd_get_default_max_blksize();
        nfsd_reset_versions(nn);
-       serv = svc_create_pooled(&nfsd_program, &nfsd_svcstats,
+       serv = svc_create_pooled(&nfsd_program, &nn->nfsd_svcstats,
                                 nfsd_max_blksize, nfsd);
        if (serv == NULL)
                return -ENOMEM;
index 6b2135bfb5090b9e2b0d7891f0e38aa766a7126e..7a58dba0045c3bd1a93d02c9661004ad47bb8eaf 100644 (file)
 
 #include "nfsd.h"
 
-struct svc_stat                nfsd_svcstats = {
-       .program        = &nfsd_program,
-};
-
 static int nfsd_show(struct seq_file *seq, void *v)
 {
        struct net *net = PDE_DATA(file_inode(seq->file));
@@ -56,7 +52,7 @@ static int nfsd_show(struct seq_file *seq, void *v)
        seq_puts(seq, "\nra 0 0 0 0 0 0 0 0 0 0 0 0\n");
 
        /* show my rpc info */
-       svc_seq_show(seq, &nfsd_svcstats);
+       svc_seq_show(seq, &nn->nfsd_svcstats);
 
 #ifdef CONFIG_NFSD_V4
        /* Show count for individual nfsv4 operations */
@@ -119,7 +115,9 @@ void nfsd_stat_counters_destroy(struct nfsd_net *nn)
 
 void nfsd_proc_stat_init(struct net *net)
 {
-       svc_proc_register(net, &nfsd_svcstats, &nfsd_proc_ops);
+       struct nfsd_net *nn = net_generic(net, nfsd_net_id);
+
+       svc_proc_register(net, &nn->nfsd_svcstats, &nfsd_proc_ops);
 }
 
 void nfsd_proc_stat_shutdown(struct net *net)
index 9b22b1ae929fe4d0e81abe9623e8f565167b463f..14525e854cbac35a5620fced8e4ba344b06bd688 100644 (file)
@@ -10,8 +10,6 @@
 #include <uapi/linux/nfsd/stats.h>
 #include <linux/percpu_counter.h>
 
-extern struct svc_stat         nfsd_svcstats;
-
 int nfsd_percpu_counters_init(struct percpu_counter *counters, int num);
 void nfsd_percpu_counters_reset(struct percpu_counter *counters, int num);
 void nfsd_percpu_counters_destroy(struct percpu_counter *counters, int num);