linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global"
@ 2024-08-12 22:35 cel
  2024-08-12 22:35 ` [PATCH 6.6.y 01/12] NFSD: Rewrite synopsis of nfsd_percpu_counters_init() cel
                   ` (13 more replies)
  0 siblings, 14 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:35 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Chuck Lever

From: Chuck Lever <chuck.lever@oracle.com>

Following up on:

https://lore.kernel.org/linux-nfs/d4b235df-4ee5-4824-9d48-e3b3c1f1f4d1@oracle.com/

Here is a backport series targeting origin/linux-6.6.y that closes
the information leak described in the above thread. It passes basic
NFSD regression testing.

Review comments welcome.   

Chuck Lever (2):
  NFSD: Rewrite synopsis of nfsd_percpu_counters_init()
  NFSD: Fix frame size warning in svc_export_parse()

Josef Bacik (10):
  sunrpc: don't change ->sv_stats if it doesn't exist
  nfsd: stop setting ->pg_stats for unused stats
  sunrpc: pass in the sv_stats struct through svc_create_pooled
  sunrpc: remove ->pg_stats from svc_program
  sunrpc: use the struct net as the svc proc private
  nfsd: rename NFSD_NET_* to NFSD_STATS_*
  nfsd: expose /proc/net/sunrpc/nfsd in net namespaces
  nfsd: make all of the nfsd stats per-network namespace
  nfsd: remove nfsd_stats, make th_cnt a global counter
  nfsd: make svc_stat per-network namespace instead of global

 fs/lockd/svc.c             |  3 --
 fs/nfs/callback.c          |  3 --
 fs/nfsd/cache.h            |  2 -
 fs/nfsd/export.c           | 32 ++++++++++----
 fs/nfsd/export.h           |  4 +-
 fs/nfsd/netns.h            | 25 +++++++++--
 fs/nfsd/nfs4proc.c         |  6 +--
 fs/nfsd/nfs4state.c        |  3 +-
 fs/nfsd/nfscache.c         | 40 ++++-------------
 fs/nfsd/nfsctl.c           | 16 +++----
 fs/nfsd/nfsd.h             |  1 +
 fs/nfsd/nfsfh.c            |  3 +-
 fs/nfsd/nfssvc.c           | 14 +++---
 fs/nfsd/stats.c            | 54 ++++++++++-------------
 fs/nfsd/stats.h            | 88 ++++++++++++++------------------------
 fs/nfsd/vfs.c              |  6 ++-
 include/linux/sunrpc/svc.h |  5 ++-
 net/sunrpc/stats.c         |  2 +-
 net/sunrpc/svc.c           | 39 +++++++++++------
 19 files changed, 163 insertions(+), 183 deletions(-)

-- 
2.45.1

^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 01/12] NFSD: Rewrite synopsis of nfsd_percpu_counters_init()
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
@ 2024-08-12 22:35 ` cel
  2024-08-12 22:35 ` [PATCH 6.6.y 02/12] NFSD: Fix frame size warning in svc_export_parse() cel
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:35 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Chuck Lever, Amir Goldstein, Jeff Layton

From: Chuck Lever <chuck.lever@oracle.com>

[ Upstream commit 5ec39944f874e1ecc09f624a70dfaa8ac3bf9d08 ]

In function ‘export_stats_init’,
    inlined from ‘svc_export_alloc’ at fs/nfsd/export.c:866:6:
fs/nfsd/export.c:337:16: warning: ‘nfsd_percpu_counters_init’ accessing 40 bytes in a region of size 0 [-Wstringop-overflow=]
  337 |         return nfsd_percpu_counters_init(&stats->counter, EXP_STATS_COUNTERS_NUM);
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/nfsd/export.c:337:16: note: referencing argument 1 of type ‘struct percpu_counter[0]’
fs/nfsd/stats.h: In function ‘svc_export_alloc’:
fs/nfsd/stats.h:40:5: note: in a call to function ‘nfsd_percpu_counters_init’
   40 | int nfsd_percpu_counters_init(struct percpu_counter counters[], int num);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~

Cc: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Stable-dep-of: 93483ac5fec6 ("nfsd: expose /proc/net/sunrpc/nfsd in net namespaces")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/nfsd/stats.c | 2 +-
 fs/nfsd/stats.h | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/fs/nfsd/stats.c b/fs/nfsd/stats.c
index 63797635e1c3..12c299a05433 100644
--- a/fs/nfsd/stats.c
+++ b/fs/nfsd/stats.c
@@ -76,7 +76,7 @@ static int nfsd_show(struct seq_file *seq, void *v)
 
 DEFINE_PROC_SHOW_ATTRIBUTE(nfsd);
 
-int nfsd_percpu_counters_init(struct percpu_counter counters[], int num)
+int nfsd_percpu_counters_init(struct percpu_counter *counters, int num)
 {
 	int i, err = 0;
 
diff --git a/fs/nfsd/stats.h b/fs/nfsd/stats.h
index cf5524e7ca06..a3e9e2f47ec4 100644
--- a/fs/nfsd/stats.h
+++ b/fs/nfsd/stats.h
@@ -37,9 +37,9 @@ extern struct nfsd_stats	nfsdstats;
 
 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);
+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);
 int nfsd_stat_init(void);
 void nfsd_stat_shutdown(void);
 
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 02/12] NFSD: Fix frame size warning in svc_export_parse()
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
  2024-08-12 22:35 ` [PATCH 6.6.y 01/12] NFSD: Rewrite synopsis of nfsd_percpu_counters_init() cel
@ 2024-08-12 22:35 ` cel
  2024-08-12 22:35 ` [PATCH 6.6.y 03/12] sunrpc: don't change ->sv_stats if it doesn't exist cel
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:35 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Chuck Lever, kernel test robot, Amir Goldstein, Jeff Layton

From: Chuck Lever <chuck.lever@oracle.com>

[ Upstream commit 6939ace1f22681fface7841cdbf34d3204cc94b5 ]

fs/nfsd/export.c: In function 'svc_export_parse':
fs/nfsd/export.c:737:1: warning: the frame size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-than=]
    737 | }

On my systems, svc_export_parse() has a stack frame of over 800
bytes, not 1040, but nonetheless, it could do with some reduction.

When a struct svc_export is on the stack, it's a temporary structure
used as an argument, and not visible as an actual exported FS. No
need to reserve space for export_stats in such cases.

Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202310012359.YEw5IrK6-lkp@intel.com/
Cc: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Stable-dep-of: 4b14885411f7 ("nfsd: make all of the nfsd stats per-network namespace")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/nfsd/export.c | 32 +++++++++++++++++++++++---------
 fs/nfsd/export.h |  4 ++--
 fs/nfsd/stats.h  | 12 ++++++------
 3 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
index 11a0eaa2f914..b7da17e53007 100644
--- a/fs/nfsd/export.c
+++ b/fs/nfsd/export.c
@@ -339,12 +339,16 @@ static int export_stats_init(struct export_stats *stats)
 
 static void export_stats_reset(struct export_stats *stats)
 {
-	nfsd_percpu_counters_reset(stats->counter, EXP_STATS_COUNTERS_NUM);
+	if (stats)
+		nfsd_percpu_counters_reset(stats->counter,
+					   EXP_STATS_COUNTERS_NUM);
 }
 
 static void export_stats_destroy(struct export_stats *stats)
 {
-	nfsd_percpu_counters_destroy(stats->counter, EXP_STATS_COUNTERS_NUM);
+	if (stats)
+		nfsd_percpu_counters_destroy(stats->counter,
+					     EXP_STATS_COUNTERS_NUM);
 }
 
 static void svc_export_put(struct kref *ref)
@@ -353,7 +357,8 @@ static void svc_export_put(struct kref *ref)
 	path_put(&exp->ex_path);
 	auth_domain_put(exp->ex_client);
 	nfsd4_fslocs_free(&exp->ex_fslocs);
-	export_stats_destroy(&exp->ex_stats);
+	export_stats_destroy(exp->ex_stats);
+	kfree(exp->ex_stats);
 	kfree(exp->ex_uuid);
 	kfree_rcu(exp, ex_rcu);
 }
@@ -767,13 +772,15 @@ static int svc_export_show(struct seq_file *m,
 	seq_putc(m, '\t');
 	seq_escape(m, exp->ex_client->name, " \t\n\\");
 	if (export_stats) {
-		seq_printf(m, "\t%lld\n", exp->ex_stats.start_time);
+		struct percpu_counter *counter = exp->ex_stats->counter;
+
+		seq_printf(m, "\t%lld\n", exp->ex_stats->start_time);
 		seq_printf(m, "\tfh_stale: %lld\n",
-			   percpu_counter_sum_positive(&exp->ex_stats.counter[EXP_STATS_FH_STALE]));
+			   percpu_counter_sum_positive(&counter[EXP_STATS_FH_STALE]));
 		seq_printf(m, "\tio_read: %lld\n",
-			   percpu_counter_sum_positive(&exp->ex_stats.counter[EXP_STATS_IO_READ]));
+			   percpu_counter_sum_positive(&counter[EXP_STATS_IO_READ]));
 		seq_printf(m, "\tio_write: %lld\n",
-			   percpu_counter_sum_positive(&exp->ex_stats.counter[EXP_STATS_IO_WRITE]));
+			   percpu_counter_sum_positive(&counter[EXP_STATS_IO_WRITE]));
 		seq_putc(m, '\n');
 		return 0;
 	}
@@ -819,7 +826,7 @@ static void svc_export_init(struct cache_head *cnew, struct cache_head *citem)
 	new->ex_layout_types = 0;
 	new->ex_uuid = NULL;
 	new->cd = item->cd;
-	export_stats_reset(&new->ex_stats);
+	export_stats_reset(new->ex_stats);
 }
 
 static void export_update(struct cache_head *cnew, struct cache_head *citem)
@@ -856,7 +863,14 @@ static struct cache_head *svc_export_alloc(void)
 	if (!i)
 		return NULL;
 
-	if (export_stats_init(&i->ex_stats)) {
+	i->ex_stats = kmalloc(sizeof(*(i->ex_stats)), GFP_KERNEL);
+	if (!i->ex_stats) {
+		kfree(i);
+		return NULL;
+	}
+
+	if (export_stats_init(i->ex_stats)) {
+		kfree(i->ex_stats);
 		kfree(i);
 		return NULL;
 	}
diff --git a/fs/nfsd/export.h b/fs/nfsd/export.h
index 2df8ae25aad3..ca9dc230ae3d 100644
--- a/fs/nfsd/export.h
+++ b/fs/nfsd/export.h
@@ -64,10 +64,10 @@ struct svc_export {
 	struct cache_head	h;
 	struct auth_domain *	ex_client;
 	int			ex_flags;
+	int			ex_fsid;
 	struct path		ex_path;
 	kuid_t			ex_anon_uid;
 	kgid_t			ex_anon_gid;
-	int			ex_fsid;
 	unsigned char *		ex_uuid; /* 16 byte fsid */
 	struct nfsd4_fs_locations ex_fslocs;
 	uint32_t		ex_nflavors;
@@ -76,8 +76,8 @@ struct svc_export {
 	struct nfsd4_deviceid_map *ex_devid_map;
 	struct cache_detail	*cd;
 	struct rcu_head		ex_rcu;
-	struct export_stats	ex_stats;
 	unsigned long		ex_xprtsec_modes;
+	struct export_stats	*ex_stats;
 };
 
 /* an "export key" (expkey) maps a filehandlefragement to an
diff --git a/fs/nfsd/stats.h b/fs/nfsd/stats.h
index a3e9e2f47ec4..14f50c660b61 100644
--- a/fs/nfsd/stats.h
+++ b/fs/nfsd/stats.h
@@ -61,22 +61,22 @@ static inline void nfsd_stats_rc_nocache_inc(void)
 static inline void nfsd_stats_fh_stale_inc(struct svc_export *exp)
 {
 	percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_FH_STALE]);
-	if (exp)
-		percpu_counter_inc(&exp->ex_stats.counter[EXP_STATS_FH_STALE]);
+	if (exp && exp->ex_stats)
+		percpu_counter_inc(&exp->ex_stats->counter[EXP_STATS_FH_STALE]);
 }
 
 static inline void nfsd_stats_io_read_add(struct svc_export *exp, s64 amount)
 {
 	percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_READ], amount);
-	if (exp)
-		percpu_counter_add(&exp->ex_stats.counter[EXP_STATS_IO_READ], amount);
+	if (exp && exp->ex_stats)
+		percpu_counter_add(&exp->ex_stats->counter[EXP_STATS_IO_READ], amount);
 }
 
 static inline void nfsd_stats_io_write_add(struct svc_export *exp, s64 amount)
 {
 	percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_WRITE], amount);
-	if (exp)
-		percpu_counter_add(&exp->ex_stats.counter[EXP_STATS_IO_WRITE], amount);
+	if (exp && exp->ex_stats)
+		percpu_counter_add(&exp->ex_stats->counter[EXP_STATS_IO_WRITE], amount);
 }
 
 static inline void nfsd_stats_payload_misses_inc(struct nfsd_net *nn)
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 03/12] sunrpc: don't change ->sv_stats if it doesn't exist
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
  2024-08-12 22:35 ` [PATCH 6.6.y 01/12] NFSD: Rewrite synopsis of nfsd_percpu_counters_init() cel
  2024-08-12 22:35 ` [PATCH 6.6.y 02/12] NFSD: Fix frame size warning in svc_export_parse() cel
@ 2024-08-12 22:35 ` cel
  2024-08-12 22:35 ` [PATCH 6.6.y 04/12] nfsd: stop setting ->pg_stats for unused stats cel
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:35 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Josef Bacik, Jeff Layton

From: Josef Bacik <josef@toxicpanda.com>

[ Upstream commit ab42f4d9a26f1723dcfd6c93fcf768032b2bb5e7 ]

We check for the existence of ->sv_stats elsewhere except in the core
processing code.  It appears that only nfsd actual exports these values
anywhere, everybody else just has a write only copy of sv_stats in their
svc_program.  Add a check for ->sv_stats before every adjustment to
allow us to eliminate the stats struct from all the users who don't
report the stats.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 net/sunrpc/svc.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index 691499d1d231..03a51c5ec822 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -1377,7 +1377,8 @@ svc_process_common(struct svc_rqst *rqstp)
 		goto err_bad_proc;
 
 	/* Syntactic check complete */
-	serv->sv_stats->rpccnt++;
+	if (serv->sv_stats)
+		serv->sv_stats->rpccnt++;
 	trace_svc_process(rqstp, progp->pg_name);
 
 	aoffset = xdr_stream_pos(xdr);
@@ -1429,7 +1430,8 @@ svc_process_common(struct svc_rqst *rqstp)
 	goto close_xprt;
 
 err_bad_rpc:
-	serv->sv_stats->rpcbadfmt++;
+	if (serv->sv_stats)
+		serv->sv_stats->rpcbadfmt++;
 	xdr_stream_encode_u32(xdr, RPC_MSG_DENIED);
 	xdr_stream_encode_u32(xdr, RPC_MISMATCH);
 	/* Only RPCv2 supported */
@@ -1440,7 +1442,8 @@ svc_process_common(struct svc_rqst *rqstp)
 err_bad_auth:
 	dprintk("svc: authentication failed (%d)\n",
 		be32_to_cpu(rqstp->rq_auth_stat));
-	serv->sv_stats->rpcbadauth++;
+	if (serv->sv_stats)
+		serv->sv_stats->rpcbadauth++;
 	/* Restore write pointer to location of reply status: */
 	xdr_truncate_encode(xdr, XDR_UNIT * 2);
 	xdr_stream_encode_u32(xdr, RPC_MSG_DENIED);
@@ -1450,7 +1453,8 @@ svc_process_common(struct svc_rqst *rqstp)
 
 err_bad_prog:
 	dprintk("svc: unknown program %d\n", rqstp->rq_prog);
-	serv->sv_stats->rpcbadfmt++;
+	if (serv->sv_stats)
+		serv->sv_stats->rpcbadfmt++;
 	*rqstp->rq_accept_statp = rpc_prog_unavail;
 	goto sendit;
 
@@ -1458,7 +1462,8 @@ svc_process_common(struct svc_rqst *rqstp)
 	svc_printk(rqstp, "unknown version (%d for prog %d, %s)\n",
 		       rqstp->rq_vers, rqstp->rq_prog, progp->pg_name);
 
-	serv->sv_stats->rpcbadfmt++;
+	if (serv->sv_stats)
+		serv->sv_stats->rpcbadfmt++;
 	*rqstp->rq_accept_statp = rpc_prog_mismatch;
 
 	/*
@@ -1472,19 +1477,22 @@ svc_process_common(struct svc_rqst *rqstp)
 err_bad_proc:
 	svc_printk(rqstp, "unknown procedure (%d)\n", rqstp->rq_proc);
 
-	serv->sv_stats->rpcbadfmt++;
+	if (serv->sv_stats)
+		serv->sv_stats->rpcbadfmt++;
 	*rqstp->rq_accept_statp = rpc_proc_unavail;
 	goto sendit;
 
 err_garbage_args:
 	svc_printk(rqstp, "failed to decode RPC header\n");
 
-	serv->sv_stats->rpcbadfmt++;
+	if (serv->sv_stats)
+		serv->sv_stats->rpcbadfmt++;
 	*rqstp->rq_accept_statp = rpc_garbage_args;
 	goto sendit;
 
 err_system_err:
-	serv->sv_stats->rpcbadfmt++;
+	if (serv->sv_stats)
+		serv->sv_stats->rpcbadfmt++;
 	*rqstp->rq_accept_statp = rpc_system_err;
 	goto sendit;
 }
@@ -1536,7 +1544,8 @@ void svc_process(struct svc_rqst *rqstp)
 out_baddir:
 	svc_printk(rqstp, "bad direction 0x%08x, dropping request\n",
 		   be32_to_cpu(*p));
-	rqstp->rq_server->sv_stats->rpcbadfmt++;
+	if (rqstp->rq_server->sv_stats)
+		rqstp->rq_server->sv_stats->rpcbadfmt++;
 out_drop:
 	svc_drop(rqstp);
 }
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 04/12] nfsd: stop setting ->pg_stats for unused stats
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
                   ` (2 preceding siblings ...)
  2024-08-12 22:35 ` [PATCH 6.6.y 03/12] sunrpc: don't change ->sv_stats if it doesn't exist cel
@ 2024-08-12 22:35 ` cel
  2024-08-12 22:35 ` [PATCH 6.6.y 05/12] sunrpc: pass in the sv_stats struct through svc_create_pooled cel
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:35 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Josef Bacik, Jeff Layton

From: Josef Bacik <josef@toxicpanda.com>

[ Upstream commit a2214ed588fb3c5b9824a21cff870482510372bb ]

A lot of places are setting a blank svc_stats in ->pg_stats and never
utilizing these stats.  Remove all of these extra structs as we're not
reporting these stats anywhere.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/lockd/svc.c    | 3 ---
 fs/nfs/callback.c | 3 ---
 fs/nfsd/nfssvc.c  | 5 -----
 3 files changed, 11 deletions(-)

diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
index 6579948070a4..a62331487ebf 100644
--- a/fs/lockd/svc.c
+++ b/fs/lockd/svc.c
@@ -712,8 +712,6 @@ static const struct svc_version *nlmsvc_version[] = {
 #endif
 };
 
-static struct svc_stat		nlmsvc_stats;
-
 #define NLM_NRVERS	ARRAY_SIZE(nlmsvc_version)
 static struct svc_program	nlmsvc_program = {
 	.pg_prog		= NLM_PROGRAM,		/* program number */
@@ -721,7 +719,6 @@ static struct svc_program	nlmsvc_program = {
 	.pg_vers		= nlmsvc_version,	/* version table */
 	.pg_name		= "lockd",		/* service name */
 	.pg_class		= "nfsd",		/* share authentication with nfsd */
-	.pg_stats		= &nlmsvc_stats,	/* stats table */
 	.pg_authenticate	= &lockd_authenticate,	/* export authentication */
 	.pg_init_request	= svc_generic_init_request,
 	.pg_rpcbind_set		= svc_generic_rpcbind_set,
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
index 466ebf1d41b2..869c88978899 100644
--- a/fs/nfs/callback.c
+++ b/fs/nfs/callback.c
@@ -399,15 +399,12 @@ static const struct svc_version *nfs4_callback_version[] = {
 	[4] = &nfs4_callback_version4,
 };
 
-static struct svc_stat nfs4_callback_stats;
-
 static struct svc_program nfs4_callback_program = {
 	.pg_prog = NFS4_CALLBACK,			/* RPC service number */
 	.pg_nvers = ARRAY_SIZE(nfs4_callback_version),	/* Number of entries */
 	.pg_vers = nfs4_callback_version,		/* version table */
 	.pg_name = "NFSv4 callback",			/* service name */
 	.pg_class = "nfs",				/* authentication class */
-	.pg_stats = &nfs4_callback_stats,
 	.pg_authenticate = nfs_callback_authenticate,
 	.pg_init_request = svc_generic_init_request,
 	.pg_rpcbind_set	= svc_generic_rpcbind_set,
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index 7ef6af908faa..1c5bdcdcd239 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -89,7 +89,6 @@ unsigned long	nfsd_drc_max_mem;
 unsigned long	nfsd_drc_mem_used;
 
 #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
-static struct svc_stat	nfsd_acl_svcstats;
 static const struct svc_version *nfsd_acl_version[] = {
 # if defined(CONFIG_NFSD_V2_ACL)
 	[2] = &nfsd_acl_version2,
@@ -108,15 +107,11 @@ static struct svc_program	nfsd_acl_program = {
 	.pg_vers		= nfsd_acl_version,
 	.pg_name		= "nfsacl",
 	.pg_class		= "nfsd",
-	.pg_stats		= &nfsd_acl_svcstats,
 	.pg_authenticate	= &svc_set_client,
 	.pg_init_request	= nfsd_acl_init_request,
 	.pg_rpcbind_set		= nfsd_acl_rpcbind_set,
 };
 
-static struct svc_stat	nfsd_acl_svcstats = {
-	.program	= &nfsd_acl_program,
-};
 #endif /* defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) */
 
 static const struct svc_version *nfsd_version[] = {
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 05/12] sunrpc: pass in the sv_stats struct through svc_create_pooled
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
                   ` (3 preceding siblings ...)
  2024-08-12 22:35 ` [PATCH 6.6.y 04/12] nfsd: stop setting ->pg_stats for unused stats cel
@ 2024-08-12 22:35 ` cel
  2024-08-12 22:35 ` [PATCH 6.6.y 06/12] sunrpc: remove ->pg_stats from svc_program cel
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:35 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Josef Bacik, Jeff Layton

From: Josef Bacik <josef@toxicpanda.com>

[ Upstream commit f094323867668d50124886ad884b665de7319537 ]

Since only one service actually reports the rpc stats there's not much
of a reason to have a pointer to it in the svc_program struct.  Adjust
the svc_create_pooled function to take the sv_stats as an argument and
pass the struct through there as desired instead of getting it from the
svc_program->pg_stats.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
[ cel: adjusted to apply to v6.6.y ]
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/nfsd/nfssvc.c           |  3 ++-
 include/linux/sunrpc/svc.h |  4 +++-
 net/sunrpc/svc.c           | 12 +++++++-----
 3 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index 1c5bdcdcd239..bd9572ce2310 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -670,7 +670,8 @@ 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_max_blksize, nfsd);
+	serv = svc_create_pooled(&nfsd_program, &nfsd_svcstats,
+				 nfsd_max_blksize, nfsd);
 	if (serv == NULL)
 		return -ENOMEM;
 
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index dbf5b21feafe..1a13ea759af3 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -408,7 +408,9 @@ bool		   svc_rqst_replace_page(struct svc_rqst *rqstp,
 void		   svc_rqst_release_pages(struct svc_rqst *rqstp);
 void		   svc_rqst_free(struct svc_rqst *);
 void		   svc_exit_thread(struct svc_rqst *);
-struct svc_serv *  svc_create_pooled(struct svc_program *, unsigned int,
+struct svc_serv *  svc_create_pooled(struct svc_program *prog,
+				     struct svc_stat *stats,
+				     unsigned int bufsize,
 				     int (*threadfn)(void *data));
 int		   svc_set_num_threads(struct svc_serv *, struct svc_pool *, int);
 int		   svc_pool_stats_open(struct svc_serv *serv, struct file *file);
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index 03a51c5ec822..029c49065016 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -453,8 +453,8 @@ __svc_init_bc(struct svc_serv *serv)
  * Create an RPC service
  */
 static struct svc_serv *
-__svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
-	     int (*threadfn)(void *data))
+__svc_create(struct svc_program *prog, struct svc_stat *stats,
+	     unsigned int bufsize, int npools, int (*threadfn)(void *data))
 {
 	struct svc_serv	*serv;
 	unsigned int vers;
@@ -466,7 +466,7 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
 	serv->sv_name      = prog->pg_name;
 	serv->sv_program   = prog;
 	kref_init(&serv->sv_refcnt);
-	serv->sv_stats     = prog->pg_stats;
+	serv->sv_stats     = stats;
 	if (bufsize > RPCSVC_MAXPAYLOAD)
 		bufsize = RPCSVC_MAXPAYLOAD;
 	serv->sv_max_payload = bufsize? bufsize : 4096;
@@ -532,26 +532,28 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
 struct svc_serv *svc_create(struct svc_program *prog, unsigned int bufsize,
 			    int (*threadfn)(void *data))
 {
-	return __svc_create(prog, bufsize, 1, threadfn);
+	return __svc_create(prog, NULL, bufsize, 1, threadfn);
 }
 EXPORT_SYMBOL_GPL(svc_create);
 
 /**
  * svc_create_pooled - Create an RPC service with pooled threads
  * @prog: the RPC program the new service will handle
+ * @stats: the stats struct if desired
  * @bufsize: maximum message size for @prog
  * @threadfn: a function to service RPC requests for @prog
  *
  * Returns an instantiated struct svc_serv object or NULL.
  */
 struct svc_serv *svc_create_pooled(struct svc_program *prog,
+				   struct svc_stat *stats,
 				   unsigned int bufsize,
 				   int (*threadfn)(void *data))
 {
 	struct svc_serv *serv;
 	unsigned int npools = svc_pool_map_get();
 
-	serv = __svc_create(prog, bufsize, npools, threadfn);
+	serv = __svc_create(prog, stats, bufsize, npools, threadfn);
 	if (!serv)
 		goto out_err;
 	return serv;
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 06/12] sunrpc: remove ->pg_stats from svc_program
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
                   ` (4 preceding siblings ...)
  2024-08-12 22:35 ` [PATCH 6.6.y 05/12] sunrpc: pass in the sv_stats struct through svc_create_pooled cel
@ 2024-08-12 22:35 ` cel
  2024-08-12 22:35 ` [PATCH 6.6.y 07/12] sunrpc: use the struct net as the svc proc private cel
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:35 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Josef Bacik, Jeff Layton

From: Josef Bacik <josef@toxicpanda.com>

[ Upstream commit 3f6ef182f144dcc9a4d942f97b6a8ed969f13c95 ]

Now that this isn't used anywhere, remove it.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/nfsd/nfssvc.c           | 1 -
 include/linux/sunrpc/svc.h | 1 -
 2 files changed, 2 deletions(-)

diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index bd9572ce2310..acb1c1242005 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -136,7 +136,6 @@ struct svc_program		nfsd_program = {
 	.pg_vers		= nfsd_version,		/* version table */
 	.pg_name		= "nfsd",		/* program name */
 	.pg_class		= "nfsd",		/* authentication class */
-	.pg_stats		= &nfsd_svcstats,	/* version table */
 	.pg_authenticate	= &svc_set_client,	/* export authentication */
 	.pg_init_request	= nfsd_init_request,
 	.pg_rpcbind_set		= nfsd_rpcbind_set,
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index 1a13ea759af3..3d8b215f32d5 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -336,7 +336,6 @@ struct svc_program {
 	const struct svc_version **pg_vers;	/* version array */
 	char *			pg_name;	/* service name */
 	char *			pg_class;	/* class name: services sharing authentication */
-	struct svc_stat *	pg_stats;	/* rpc statistics */
 	enum svc_auth_status	(*pg_authenticate)(struct svc_rqst *rqstp);
 	__be32			(*pg_init_request)(struct svc_rqst *,
 						   const struct svc_program *,
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 07/12] sunrpc: use the struct net as the svc proc private
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
                   ` (5 preceding siblings ...)
  2024-08-12 22:35 ` [PATCH 6.6.y 06/12] sunrpc: remove ->pg_stats from svc_program cel
@ 2024-08-12 22:35 ` cel
  2024-08-12 22:36 ` [PATCH 6.6.y 08/12] nfsd: rename NFSD_NET_* to NFSD_STATS_* cel
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:35 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Josef Bacik, Jeff Layton

From: Josef Bacik <josef@toxicpanda.com>

[ Upstream commit 418b9687dece5bd763c09b5c27a801a7e3387be9 ]

nfsd is the only thing using this helper, and it doesn't use the private
currently.  When we switch to per-network namespace stats we will need
the struct net * in order to get to the nfsd_net.  Use the net as the
proc private so we can utilize this when we make the switch over.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 net/sunrpc/stats.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/net/sunrpc/stats.c b/net/sunrpc/stats.c
index 65fc1297c6df..383860cb1d5b 100644
--- a/net/sunrpc/stats.c
+++ b/net/sunrpc/stats.c
@@ -314,7 +314,7 @@ EXPORT_SYMBOL_GPL(rpc_proc_unregister);
 struct proc_dir_entry *
 svc_proc_register(struct net *net, struct svc_stat *statp, const struct proc_ops *proc_ops)
 {
-	return do_register(net, statp->program->pg_name, statp, proc_ops);
+	return do_register(net, statp->program->pg_name, net, proc_ops);
 }
 EXPORT_SYMBOL_GPL(svc_proc_register);
 
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 08/12] nfsd: rename NFSD_NET_* to NFSD_STATS_*
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
                   ` (6 preceding siblings ...)
  2024-08-12 22:35 ` [PATCH 6.6.y 07/12] sunrpc: use the struct net as the svc proc private cel
@ 2024-08-12 22:36 ` cel
  2024-08-12 22:36 ` [PATCH 6.6.y 09/12] nfsd: expose /proc/net/sunrpc/nfsd in net namespaces cel
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:36 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Josef Bacik, Jeff Layton

From: Josef Bacik <josef@toxicpanda.com>

[ Upstream commit d98416cc2154053950610bb6880911e3dcbdf8c5 ]

We're going to merge the stats all into per network namespace in
subsequent patches, rename these nn counters to be consistent with the
rest of the stats.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/nfsd/netns.h    | 4 ++--
 fs/nfsd/nfscache.c | 4 ++--
 fs/nfsd/stats.h    | 6 +++---
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h
index ec49b200b797..c956e60c2356 100644
--- a/fs/nfsd/netns.h
+++ b/fs/nfsd/netns.h
@@ -26,9 +26,9 @@ struct nfsd4_client_tracking_ops;
 
 enum {
 	/* cache misses due only to checksum comparison failures */
-	NFSD_NET_PAYLOAD_MISSES,
+	NFSD_STATS_PAYLOAD_MISSES,
 	/* amount of memory (in bytes) currently consumed by the DRC */
-	NFSD_NET_DRC_MEM_USAGE,
+	NFSD_STATS_DRC_MEM_USAGE,
 	NFSD_NET_COUNTERS_NUM
 };
 
diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c
index 6cd36af2f97e..b8492e140b82 100644
--- a/fs/nfsd/nfscache.c
+++ b/fs/nfsd/nfscache.c
@@ -690,7 +690,7 @@ int nfsd_reply_cache_stats_show(struct seq_file *m, void *v)
 		   atomic_read(&nn->num_drc_entries));
 	seq_printf(m, "hash buckets:          %u\n", 1 << nn->maskbits);
 	seq_printf(m, "mem usage:             %lld\n",
-		   percpu_counter_sum_positive(&nn->counter[NFSD_NET_DRC_MEM_USAGE]));
+		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_DRC_MEM_USAGE]));
 	seq_printf(m, "cache hits:            %lld\n",
 		   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_HITS]));
 	seq_printf(m, "cache misses:          %lld\n",
@@ -698,7 +698,7 @@ int nfsd_reply_cache_stats_show(struct seq_file *m, void *v)
 	seq_printf(m, "not cached:            %lld\n",
 		   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]));
 	seq_printf(m, "payload misses:        %lld\n",
-		   percpu_counter_sum_positive(&nn->counter[NFSD_NET_PAYLOAD_MISSES]));
+		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_PAYLOAD_MISSES]));
 	seq_printf(m, "longest chain len:     %u\n", nn->longest_chain);
 	seq_printf(m, "cachesize at longest:  %u\n", nn->longest_chain_cachesize);
 	return 0;
diff --git a/fs/nfsd/stats.h b/fs/nfsd/stats.h
index 14f50c660b61..7ed4325ac691 100644
--- a/fs/nfsd/stats.h
+++ b/fs/nfsd/stats.h
@@ -81,17 +81,17 @@ static inline void nfsd_stats_io_write_add(struct svc_export *exp, s64 amount)
 
 static inline void nfsd_stats_payload_misses_inc(struct nfsd_net *nn)
 {
-	percpu_counter_inc(&nn->counter[NFSD_NET_PAYLOAD_MISSES]);
+	percpu_counter_inc(&nn->counter[NFSD_STATS_PAYLOAD_MISSES]);
 }
 
 static inline void nfsd_stats_drc_mem_usage_add(struct nfsd_net *nn, s64 amount)
 {
-	percpu_counter_add(&nn->counter[NFSD_NET_DRC_MEM_USAGE], amount);
+	percpu_counter_add(&nn->counter[NFSD_STATS_DRC_MEM_USAGE], amount);
 }
 
 static inline void nfsd_stats_drc_mem_usage_sub(struct nfsd_net *nn, s64 amount)
 {
-	percpu_counter_sub(&nn->counter[NFSD_NET_DRC_MEM_USAGE], amount);
+	percpu_counter_sub(&nn->counter[NFSD_STATS_DRC_MEM_USAGE], amount);
 }
 
 #ifdef CONFIG_NFSD_V4
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 09/12] nfsd: expose /proc/net/sunrpc/nfsd in net namespaces
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
                   ` (7 preceding siblings ...)
  2024-08-12 22:36 ` [PATCH 6.6.y 08/12] nfsd: rename NFSD_NET_* to NFSD_STATS_* cel
@ 2024-08-12 22:36 ` cel
  2024-08-12 22:36 ` [PATCH 6.6.y 10/12] nfsd: make all of the nfsd stats per-network namespace cel
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:36 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Josef Bacik, Jeff Layton

From: Josef Bacik <josef@toxicpanda.com>

[ Upstream commit 93483ac5fec62cc1de166051b219d953bb5e4ef4 ]

We are running nfsd servers inside of containers with their own network
namespace, and we want to monitor these services using the stats found
in /proc.  However these are not exposed in the proc inside of the
container, so we have to bind mount the host /proc into our containers
to get at this information.

Separate out the stat counters init and the proc registration, and move
the proc registration into the pernet operations entry and exit points
so that these stats can be exposed inside of network namespaces.

This is an intermediate step, this just exposes the global counters in
the network namespace.  Subsequent patches will move these counters into
the per-network namespace container.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/nfsd/nfsctl.c |  8 +++++---
 fs/nfsd/stats.c  | 21 ++++++---------------
 fs/nfsd/stats.h  |  6 ++++--
 3 files changed, 15 insertions(+), 20 deletions(-)

diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index a13e81e45071..42d0e3c14f0c 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -1532,6 +1532,7 @@ static __net_init int nfsd_net_init(struct net *net)
 	nfsd4_init_leases_net(nn);
 	get_random_bytes(&nn->siphash_key, sizeof(nn->siphash_key));
 	seqlock_init(&nn->writeverf_lock);
+	nfsd_proc_stat_init(net);
 
 	return 0;
 
@@ -1552,6 +1553,7 @@ static __net_exit void nfsd_net_exit(struct net *net)
 {
 	struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 
+	nfsd_proc_stat_shutdown(net);
 	nfsd_net_reply_cache_destroy(nn);
 	nfsd_idmap_shutdown(net);
 	nfsd_export_shutdown(net);
@@ -1575,7 +1577,7 @@ static int __init init_nfsd(void)
 	retval = nfsd4_init_pnfs();
 	if (retval)
 		goto out_free_slabs;
-	retval = nfsd_stat_init();	/* Statistics */
+	retval = nfsd_stat_counters_init();	/* Statistics */
 	if (retval)
 		goto out_free_pnfs;
 	retval = nfsd_drc_slab_create();
@@ -1611,7 +1613,7 @@ static int __init init_nfsd(void)
 	nfsd_lockd_shutdown();
 	nfsd_drc_slab_free();
 out_free_stat:
-	nfsd_stat_shutdown();
+	nfsd_stat_counters_destroy();
 out_free_pnfs:
 	nfsd4_exit_pnfs();
 out_free_slabs:
@@ -1628,7 +1630,7 @@ static void __exit exit_nfsd(void)
 	nfsd_drc_slab_free();
 	remove_proc_entry("fs/nfs/exports", NULL);
 	remove_proc_entry("fs/nfs", NULL);
-	nfsd_stat_shutdown();
+	nfsd_stat_counters_destroy();
 	nfsd_lockd_shutdown();
 	nfsd4_free_slabs();
 	nfsd4_exit_pnfs();
diff --git a/fs/nfsd/stats.c b/fs/nfsd/stats.c
index 12c299a05433..246882eb7f95 100644
--- a/fs/nfsd/stats.c
+++ b/fs/nfsd/stats.c
@@ -108,31 +108,22 @@ void nfsd_percpu_counters_destroy(struct percpu_counter counters[], int num)
 		percpu_counter_destroy(&counters[i]);
 }
 
-static int nfsd_stat_counters_init(void)
+int nfsd_stat_counters_init(void)
 {
 	return nfsd_percpu_counters_init(nfsdstats.counter, NFSD_STATS_COUNTERS_NUM);
 }
 
-static void nfsd_stat_counters_destroy(void)
+void nfsd_stat_counters_destroy(void)
 {
 	nfsd_percpu_counters_destroy(nfsdstats.counter, NFSD_STATS_COUNTERS_NUM);
 }
 
-int nfsd_stat_init(void)
+void nfsd_proc_stat_init(struct net *net)
 {
-	int err;
-
-	err = nfsd_stat_counters_init();
-	if (err)
-		return err;
-
-	svc_proc_register(&init_net, &nfsd_svcstats, &nfsd_proc_ops);
-
-	return 0;
+	svc_proc_register(net, &nfsd_svcstats, &nfsd_proc_ops);
 }
 
-void nfsd_stat_shutdown(void)
+void nfsd_proc_stat_shutdown(struct net *net)
 {
-	nfsd_stat_counters_destroy();
-	svc_proc_unregister(&init_net, "nfsd");
+	svc_proc_unregister(net, "nfsd");
 }
diff --git a/fs/nfsd/stats.h b/fs/nfsd/stats.h
index 7ed4325ac691..38811aa7d13e 100644
--- a/fs/nfsd/stats.h
+++ b/fs/nfsd/stats.h
@@ -40,8 +40,10 @@ 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);
-int nfsd_stat_init(void);
-void nfsd_stat_shutdown(void);
+int nfsd_stat_counters_init(void);
+void nfsd_stat_counters_destroy(void);
+void nfsd_proc_stat_init(struct net *net);
+void nfsd_proc_stat_shutdown(struct net *net);
 
 static inline void nfsd_stats_rc_hits_inc(void)
 {
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 10/12] nfsd: make all of the nfsd stats per-network namespace
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
                   ` (8 preceding siblings ...)
  2024-08-12 22:36 ` [PATCH 6.6.y 09/12] nfsd: expose /proc/net/sunrpc/nfsd in net namespaces cel
@ 2024-08-12 22:36 ` cel
  2024-08-12 22:36 ` [PATCH 6.6.y 11/12] nfsd: remove nfsd_stats, make th_cnt a global counter cel
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:36 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Josef Bacik, Jeff Layton

From: Josef Bacik <josef@toxicpanda.com>

[ Upstream commit 4b14885411f74b2b0ce0eb2b39d0fffe54e5ca0d ]

We have a global set of counters that we modify for all of the nfsd
operations, but now that we're exposing these stats across all network
namespaces we need to make the stats also be per-network namespace.  We
already have some caching stats that are per-network namespace, so move
these definitions into the same counter and then adjust all the helpers
and users of these stats to provide the appropriate nfsd_net struct so
that the stats are maintained for the per-network namespace objects.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/nfsd/cache.h     |  2 --
 fs/nfsd/netns.h     | 17 ++++++++++++--
 fs/nfsd/nfs4proc.c  |  6 ++---
 fs/nfsd/nfs4state.c |  3 ++-
 fs/nfsd/nfscache.c  | 36 ++++++------------------------
 fs/nfsd/nfsctl.c    | 12 +++-------
 fs/nfsd/nfsfh.c     |  3 ++-
 fs/nfsd/stats.c     | 26 ++++++++++++----------
 fs/nfsd/stats.h     | 54 ++++++++++++++++-----------------------------
 fs/nfsd/vfs.c       |  6 +++--
 10 files changed, 69 insertions(+), 96 deletions(-)

diff --git a/fs/nfsd/cache.h b/fs/nfsd/cache.h
index 4cbe0434cbb8..66a05fefae98 100644
--- a/fs/nfsd/cache.h
+++ b/fs/nfsd/cache.h
@@ -80,8 +80,6 @@ enum {
 
 int	nfsd_drc_slab_create(void);
 void	nfsd_drc_slab_free(void);
-int	nfsd_net_reply_cache_init(struct nfsd_net *nn);
-void	nfsd_net_reply_cache_destroy(struct nfsd_net *nn);
 int	nfsd_reply_cache_init(struct nfsd_net *);
 void	nfsd_reply_cache_shutdown(struct nfsd_net *);
 int	nfsd_cache_lookup(struct svc_rqst *rqstp, unsigned int start,
diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h
index c956e60c2356..9260248a0790 100644
--- a/fs/nfsd/netns.h
+++ b/fs/nfsd/netns.h
@@ -11,6 +11,7 @@
 #include <net/net_namespace.h>
 #include <net/netns/generic.h>
 #include <linux/filelock.h>
+#include <linux/nfs4.h>
 #include <linux/percpu_counter.h>
 #include <linux/siphash.h>
 
@@ -29,7 +30,19 @@ enum {
 	NFSD_STATS_PAYLOAD_MISSES,
 	/* amount of memory (in bytes) currently consumed by the DRC */
 	NFSD_STATS_DRC_MEM_USAGE,
-	NFSD_NET_COUNTERS_NUM
+	NFSD_STATS_RC_HITS,		/* repcache hits */
+	NFSD_STATS_RC_MISSES,		/* repcache misses */
+	NFSD_STATS_RC_NOCACHE,		/* uncached reqs */
+	NFSD_STATS_FH_STALE,		/* FH stale error */
+	NFSD_STATS_IO_READ,		/* bytes returned to read requests */
+	NFSD_STATS_IO_WRITE,		/* bytes passed in write requests */
+#ifdef CONFIG_NFSD_V4
+	NFSD_STATS_FIRST_NFS4_OP,	/* count of individual nfsv4 operations */
+	NFSD_STATS_LAST_NFS4_OP = NFSD_STATS_FIRST_NFS4_OP + LAST_NFS4_OP,
+#define NFSD_STATS_NFS4_OP(op)	(NFSD_STATS_FIRST_NFS4_OP + (op))
+	NFSD_STATS_WDELEG_GETATTR,	/* count of getattr conflict with wdeleg */
+#endif
+	NFSD_STATS_COUNTERS_NUM
 };
 
 /*
@@ -169,7 +182,7 @@ struct nfsd_net {
 	atomic_t                 num_drc_entries;
 
 	/* Per-netns stats counters */
-	struct percpu_counter    counter[NFSD_NET_COUNTERS_NUM];
+	struct percpu_counter    counter[NFSD_STATS_COUNTERS_NUM];
 
 	/* longest hash chain seen */
 	unsigned int             longest_chain;
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 451026f9986b..ae0057c54ef4 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -2478,10 +2478,10 @@ nfsd4_proc_null(struct svc_rqst *rqstp)
 	return rpc_success;
 }
 
-static inline void nfsd4_increment_op_stats(u32 opnum)
+static inline void nfsd4_increment_op_stats(struct nfsd_net *nn, u32 opnum)
 {
 	if (opnum >= FIRST_NFS4_OP && opnum <= LAST_NFS4_OP)
-		percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_NFS4_OP(opnum)]);
+		percpu_counter_inc(&nn->counter[NFSD_STATS_NFS4_OP(opnum)]);
 }
 
 static const struct nfsd4_operation nfsd4_ops[];
@@ -2756,7 +2756,7 @@ nfsd4_proc_compound(struct svc_rqst *rqstp)
 					   status, nfsd4_op_name(op->opnum));
 
 		nfsd4_cstate_clear_replay(cstate);
-		nfsd4_increment_op_stats(op->opnum);
+		nfsd4_increment_op_stats(nn, op->opnum);
 	}
 
 	fh_put(current_fh);
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index c7e52d980cd7..cdad1eaa4a31 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -8422,6 +8422,7 @@ __be32
 nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp, struct inode *inode)
 {
 	__be32 status;
+	struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
 	struct file_lock_context *ctx;
 	struct file_lock *fl;
 	struct nfs4_delegation *dp;
@@ -8451,7 +8452,7 @@ nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp, struct inode *inode)
 			}
 break_lease:
 			spin_unlock(&ctx->flc_lock);
-			nfsd_stats_wdeleg_getattr_inc();
+			nfsd_stats_wdeleg_getattr_inc(nn);
 			status = nfserrno(nfsd_open_break_lease(inode, NFSD_MAY_READ));
 			if (status != nfserr_jukebox ||
 					!nfsd_wait_for_delegreturn(rqstp, inode))
diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c
index b8492e140b82..c52132ecb339 100644
--- a/fs/nfsd/nfscache.c
+++ b/fs/nfsd/nfscache.c
@@ -176,27 +176,6 @@ void nfsd_drc_slab_free(void)
 	kmem_cache_destroy(drc_slab);
 }
 
-/**
- * nfsd_net_reply_cache_init - per net namespace reply cache set-up
- * @nn: nfsd_net being initialized
- *
- * Returns zero on succes; otherwise a negative errno is returned.
- */
-int nfsd_net_reply_cache_init(struct nfsd_net *nn)
-{
-	return nfsd_percpu_counters_init(nn->counter, NFSD_NET_COUNTERS_NUM);
-}
-
-/**
- * nfsd_net_reply_cache_destroy - per net namespace reply cache tear-down
- * @nn: nfsd_net being freed
- *
- */
-void nfsd_net_reply_cache_destroy(struct nfsd_net *nn)
-{
-	nfsd_percpu_counters_destroy(nn->counter, NFSD_NET_COUNTERS_NUM);
-}
-
 int nfsd_reply_cache_init(struct nfsd_net *nn)
 {
 	unsigned int hashsize;
@@ -502,7 +481,7 @@ nfsd_cache_insert(struct nfsd_drc_bucket *b, struct nfsd_cacherep *key,
 int nfsd_cache_lookup(struct svc_rqst *rqstp, unsigned int start,
 		      unsigned int len, struct nfsd_cacherep **cacherep)
 {
-	struct nfsd_net		*nn;
+	struct nfsd_net		*nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
 	struct nfsd_cacherep	*rp, *found;
 	__wsum			csum;
 	struct nfsd_drc_bucket	*b;
@@ -512,7 +491,7 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp, unsigned int start,
 	int rtn = RC_DOIT;
 
 	if (type == RC_NOCACHE) {
-		nfsd_stats_rc_nocache_inc();
+		nfsd_stats_rc_nocache_inc(nn);
 		goto out;
 	}
 
@@ -522,7 +501,6 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp, unsigned int start,
 	 * Since the common case is a cache miss followed by an insert,
 	 * preallocate an entry.
 	 */
-	nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
 	rp = nfsd_cacherep_alloc(rqstp, csum, nn);
 	if (!rp)
 		goto out;
@@ -540,7 +518,7 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp, unsigned int start,
 	freed = nfsd_cacherep_dispose(&dispose);
 	trace_nfsd_drc_gc(nn, freed);
 
-	nfsd_stats_rc_misses_inc();
+	nfsd_stats_rc_misses_inc(nn);
 	atomic_inc(&nn->num_drc_entries);
 	nfsd_stats_drc_mem_usage_add(nn, sizeof(*rp));
 	goto out;
@@ -548,7 +526,7 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp, unsigned int start,
 found_entry:
 	/* We found a matching entry which is either in progress or done. */
 	nfsd_reply_cache_free_locked(NULL, rp, nn);
-	nfsd_stats_rc_hits_inc();
+	nfsd_stats_rc_hits_inc(nn);
 	rtn = RC_DROPIT;
 	rp = found;
 
@@ -692,11 +670,11 @@ int nfsd_reply_cache_stats_show(struct seq_file *m, void *v)
 	seq_printf(m, "mem usage:             %lld\n",
 		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_DRC_MEM_USAGE]));
 	seq_printf(m, "cache hits:            %lld\n",
-		   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_HITS]));
+		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_HITS]));
 	seq_printf(m, "cache misses:          %lld\n",
-		   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_MISSES]));
+		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_MISSES]));
 	seq_printf(m, "not cached:            %lld\n",
-		   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]));
+		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_NOCACHE]));
 	seq_printf(m, "payload misses:        %lld\n",
 		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_PAYLOAD_MISSES]));
 	seq_printf(m, "longest chain len:     %u\n", nn->longest_chain);
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index 42d0e3c14f0c..d19ddf2fb4fe 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -1524,7 +1524,7 @@ static __net_init int nfsd_net_init(struct net *net)
 	retval = nfsd_idmap_init(net);
 	if (retval)
 		goto out_idmap_error;
-	retval = nfsd_net_reply_cache_init(nn);
+	retval = nfsd_stat_counters_init(nn);
 	if (retval)
 		goto out_repcache_error;
 	nn->nfsd_versions = NULL;
@@ -1554,7 +1554,7 @@ static __net_exit void nfsd_net_exit(struct net *net)
 	struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 
 	nfsd_proc_stat_shutdown(net);
-	nfsd_net_reply_cache_destroy(nn);
+	nfsd_stat_counters_destroy(nn);
 	nfsd_idmap_shutdown(net);
 	nfsd_export_shutdown(net);
 	nfsd_netns_free_versions(nn);
@@ -1577,12 +1577,9 @@ static int __init init_nfsd(void)
 	retval = nfsd4_init_pnfs();
 	if (retval)
 		goto out_free_slabs;
-	retval = nfsd_stat_counters_init();	/* Statistics */
-	if (retval)
-		goto out_free_pnfs;
 	retval = nfsd_drc_slab_create();
 	if (retval)
-		goto out_free_stat;
+		goto out_free_pnfs;
 	nfsd_lockd_init();	/* lockd->nfsd callbacks */
 	retval = create_proc_exports_entry();
 	if (retval)
@@ -1612,8 +1609,6 @@ static int __init init_nfsd(void)
 out_free_lockd:
 	nfsd_lockd_shutdown();
 	nfsd_drc_slab_free();
-out_free_stat:
-	nfsd_stat_counters_destroy();
 out_free_pnfs:
 	nfsd4_exit_pnfs();
 out_free_slabs:
@@ -1630,7 +1625,6 @@ static void __exit exit_nfsd(void)
 	nfsd_drc_slab_free();
 	remove_proc_entry("fs/nfs/exports", NULL);
 	remove_proc_entry("fs/nfs", NULL);
-	nfsd_stat_counters_destroy();
 	nfsd_lockd_shutdown();
 	nfsd4_free_slabs();
 	nfsd4_exit_pnfs();
diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c
index 937be276bb6b..c2495d98c189 100644
--- a/fs/nfsd/nfsfh.c
+++ b/fs/nfsd/nfsfh.c
@@ -327,6 +327,7 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp)
 __be32
 fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type, int access)
 {
+	struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
 	struct svc_export *exp = NULL;
 	struct dentry	*dentry;
 	__be32		error;
@@ -395,7 +396,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type, int access)
 out:
 	trace_nfsd_fh_verify_err(rqstp, fhp, type, access, error);
 	if (error == nfserr_stale)
-		nfsd_stats_fh_stale_inc(exp);
+		nfsd_stats_fh_stale_inc(nn, exp);
 	return error;
 }
 
diff --git a/fs/nfsd/stats.c b/fs/nfsd/stats.c
index 246882eb7f95..db95c4f34b0e 100644
--- a/fs/nfsd/stats.c
+++ b/fs/nfsd/stats.c
@@ -34,15 +34,17 @@ struct svc_stat		nfsd_svcstats = {
 
 static int nfsd_show(struct seq_file *seq, void *v)
 {
+	struct net *net = pde_data(file_inode(seq->file));
+	struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 	int i;
 
 	seq_printf(seq, "rc %lld %lld %lld\nfh %lld 0 0 0 0\nio %lld %lld\n",
-		   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_HITS]),
-		   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_MISSES]),
-		   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]),
-		   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_FH_STALE]),
-		   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_IO_READ]),
-		   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_IO_WRITE]));
+		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_HITS]),
+		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_MISSES]),
+		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_RC_NOCACHE]),
+		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_FH_STALE]),
+		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_IO_READ]),
+		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_IO_WRITE]));
 
 	/* thread usage: */
 	seq_printf(seq, "th %u 0", atomic_read(&nfsdstats.th_cnt));
@@ -63,10 +65,10 @@ static int nfsd_show(struct seq_file *seq, void *v)
 	seq_printf(seq,"proc4ops %u", LAST_NFS4_OP + 1);
 	for (i = 0; i <= LAST_NFS4_OP; i++) {
 		seq_printf(seq, " %lld",
-			   percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_NFS4_OP(i)]));
+			   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_NFS4_OP(i)]));
 	}
 	seq_printf(seq, "\nwdeleg_getattr %lld",
-		percpu_counter_sum_positive(&nfsdstats.counter[NFSD_STATS_WDELEG_GETATTR]));
+		percpu_counter_sum_positive(&nn->counter[NFSD_STATS_WDELEG_GETATTR]));
 
 	seq_putc(seq, '\n');
 #endif
@@ -108,14 +110,14 @@ void nfsd_percpu_counters_destroy(struct percpu_counter counters[], int num)
 		percpu_counter_destroy(&counters[i]);
 }
 
-int nfsd_stat_counters_init(void)
+int nfsd_stat_counters_init(struct nfsd_net *nn)
 {
-	return nfsd_percpu_counters_init(nfsdstats.counter, NFSD_STATS_COUNTERS_NUM);
+	return nfsd_percpu_counters_init(nn->counter, NFSD_STATS_COUNTERS_NUM);
 }
 
-void nfsd_stat_counters_destroy(void)
+void nfsd_stat_counters_destroy(struct nfsd_net *nn)
 {
-	nfsd_percpu_counters_destroy(nfsdstats.counter, NFSD_STATS_COUNTERS_NUM);
+	nfsd_percpu_counters_destroy(nn->counter, NFSD_STATS_COUNTERS_NUM);
 }
 
 void nfsd_proc_stat_init(struct net *net)
diff --git a/fs/nfsd/stats.h b/fs/nfsd/stats.h
index 38811aa7d13e..c24be4ddbe7d 100644
--- a/fs/nfsd/stats.h
+++ b/fs/nfsd/stats.h
@@ -10,26 +10,7 @@
 #include <uapi/linux/nfsd/stats.h>
 #include <linux/percpu_counter.h>
 
-
-enum {
-	NFSD_STATS_RC_HITS,		/* repcache hits */
-	NFSD_STATS_RC_MISSES,		/* repcache misses */
-	NFSD_STATS_RC_NOCACHE,		/* uncached reqs */
-	NFSD_STATS_FH_STALE,		/* FH stale error */
-	NFSD_STATS_IO_READ,		/* bytes returned to read requests */
-	NFSD_STATS_IO_WRITE,		/* bytes passed in write requests */
-#ifdef CONFIG_NFSD_V4
-	NFSD_STATS_FIRST_NFS4_OP,	/* count of individual nfsv4 operations */
-	NFSD_STATS_LAST_NFS4_OP = NFSD_STATS_FIRST_NFS4_OP + LAST_NFS4_OP,
-#define NFSD_STATS_NFS4_OP(op)	(NFSD_STATS_FIRST_NFS4_OP + (op))
-	NFSD_STATS_WDELEG_GETATTR,	/* count of getattr conflict with wdeleg */
-#endif
-	NFSD_STATS_COUNTERS_NUM
-};
-
 struct nfsd_stats {
-	struct percpu_counter	counter[NFSD_STATS_COUNTERS_NUM];
-
 	atomic_t	th_cnt;		/* number of available threads */
 };
 
@@ -40,43 +21,46 @@ 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);
-int nfsd_stat_counters_init(void);
-void nfsd_stat_counters_destroy(void);
+int nfsd_stat_counters_init(struct nfsd_net *nn);
+void nfsd_stat_counters_destroy(struct nfsd_net *nn);
 void nfsd_proc_stat_init(struct net *net);
 void nfsd_proc_stat_shutdown(struct net *net);
 
-static inline void nfsd_stats_rc_hits_inc(void)
+static inline void nfsd_stats_rc_hits_inc(struct nfsd_net *nn)
 {
-	percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_HITS]);
+	percpu_counter_inc(&nn->counter[NFSD_STATS_RC_HITS]);
 }
 
-static inline void nfsd_stats_rc_misses_inc(void)
+static inline void nfsd_stats_rc_misses_inc(struct nfsd_net *nn)
 {
-	percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_MISSES]);
+	percpu_counter_inc(&nn->counter[NFSD_STATS_RC_MISSES]);
 }
 
-static inline void nfsd_stats_rc_nocache_inc(void)
+static inline void nfsd_stats_rc_nocache_inc(struct nfsd_net *nn)
 {
-	percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]);
+	percpu_counter_inc(&nn->counter[NFSD_STATS_RC_NOCACHE]);
 }
 
-static inline void nfsd_stats_fh_stale_inc(struct svc_export *exp)
+static inline void nfsd_stats_fh_stale_inc(struct nfsd_net *nn,
+					   struct svc_export *exp)
 {
-	percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_FH_STALE]);
+	percpu_counter_inc(&nn->counter[NFSD_STATS_FH_STALE]);
 	if (exp && exp->ex_stats)
 		percpu_counter_inc(&exp->ex_stats->counter[EXP_STATS_FH_STALE]);
 }
 
-static inline void nfsd_stats_io_read_add(struct svc_export *exp, s64 amount)
+static inline void nfsd_stats_io_read_add(struct nfsd_net *nn,
+					  struct svc_export *exp, s64 amount)
 {
-	percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_READ], amount);
+	percpu_counter_add(&nn->counter[NFSD_STATS_IO_READ], amount);
 	if (exp && exp->ex_stats)
 		percpu_counter_add(&exp->ex_stats->counter[EXP_STATS_IO_READ], amount);
 }
 
-static inline void nfsd_stats_io_write_add(struct svc_export *exp, s64 amount)
+static inline void nfsd_stats_io_write_add(struct nfsd_net *nn,
+					   struct svc_export *exp, s64 amount)
 {
-	percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_WRITE], amount);
+	percpu_counter_add(&nn->counter[NFSD_STATS_IO_WRITE], amount);
 	if (exp && exp->ex_stats)
 		percpu_counter_add(&exp->ex_stats->counter[EXP_STATS_IO_WRITE], amount);
 }
@@ -97,9 +81,9 @@ static inline void nfsd_stats_drc_mem_usage_sub(struct nfsd_net *nn, s64 amount)
 }
 
 #ifdef CONFIG_NFSD_V4
-static inline void nfsd_stats_wdeleg_getattr_inc(void)
+static inline void nfsd_stats_wdeleg_getattr_inc(struct nfsd_net *nn)
 {
-	percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_WDELEG_GETATTR]);
+	percpu_counter_inc(&nn->counter[NFSD_STATS_WDELEG_GETATTR]);
 }
 #endif
 #endif /* _NFSD_STATS_H */
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index d0fdf70ab20d..1f2a5b22b649 100644
--- a/fs/nfsd/vfs.c
+++ b/fs/nfsd/vfs.c
@@ -985,7 +985,9 @@ static __be32 nfsd_finish_read(struct svc_rqst *rqstp, struct svc_fh *fhp,
 			       unsigned long *count, u32 *eof, ssize_t host_err)
 {
 	if (host_err >= 0) {
-		nfsd_stats_io_read_add(fhp->fh_export, host_err);
+		struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
+
+		nfsd_stats_io_read_add(nn, fhp->fh_export, host_err);
 		*eof = nfsd_eof_on_read(file, offset, host_err, *count);
 		*count = host_err;
 		fsnotify_access(file);
@@ -1168,7 +1170,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfsd_file *nf,
 		goto out_nfserr;
 	}
 	*cnt = host_err;
-	nfsd_stats_io_write_add(exp, *cnt);
+	nfsd_stats_io_write_add(nn, exp, *cnt);
 	fsnotify_modify(file);
 	host_err = filemap_check_wb_err(file->f_mapping, since);
 	if (host_err < 0)
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 11/12] nfsd: remove nfsd_stats, make th_cnt a global counter
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
                   ` (9 preceding siblings ...)
  2024-08-12 22:36 ` [PATCH 6.6.y 10/12] nfsd: make all of the nfsd stats per-network namespace cel
@ 2024-08-12 22:36 ` cel
  2024-08-12 22:36 ` [PATCH 6.6.y 12/12] nfsd: make svc_stat per-network namespace instead of global cel
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:36 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Josef Bacik, Jeff Layton

From: Josef Bacik <josef@toxicpanda.com>

[ Upstream commit e41ee44cc6a473b1f414031782c3b4283d7f3e5f ]

This is the last global stat, take it out of the nfsd_stats struct and
make it a global part of nfsd, report it the same as always.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/nfsd/nfsd.h   | 1 +
 fs/nfsd/nfssvc.c | 5 +++--
 fs/nfsd/stats.c  | 3 +--
 fs/nfsd/stats.h  | 6 ------
 4 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h
index fe846a360ae1..d05bd2b811f3 100644
--- a/fs/nfsd/nfsd.h
+++ b/fs/nfsd/nfsd.h
@@ -69,6 +69,7 @@ extern struct mutex		nfsd_mutex;
 extern spinlock_t		nfsd_drc_lock;
 extern unsigned long		nfsd_drc_max_mem;
 extern unsigned long		nfsd_drc_mem_used;
+extern atomic_t			nfsd_th_cnt;		/* number of available threads */
 
 extern const struct seq_operations nfs_exports_op;
 
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index acb1c1242005..e9689db75f63 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -34,6 +34,7 @@
 
 #define NFSDDBG_FACILITY	NFSDDBG_SVC
 
+atomic_t			nfsd_th_cnt = ATOMIC_INIT(0);
 extern struct svc_program	nfsd_program;
 static int			nfsd(void *vrqstp);
 #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
@@ -945,7 +946,7 @@ nfsd(void *vrqstp)
 
 	current->fs->umask = 0;
 
-	atomic_inc(&nfsdstats.th_cnt);
+	atomic_inc(&nfsd_th_cnt);
 
 	set_freezable();
 
@@ -959,7 +960,7 @@ nfsd(void *vrqstp)
 		svc_recv(rqstp);
 	}
 
-	atomic_dec(&nfsdstats.th_cnt);
+	atomic_dec(&nfsd_th_cnt);
 
 out:
 	/* Release the thread */
diff --git a/fs/nfsd/stats.c b/fs/nfsd/stats.c
index db95c4f34b0e..276bbcd59cdb 100644
--- a/fs/nfsd/stats.c
+++ b/fs/nfsd/stats.c
@@ -27,7 +27,6 @@
 
 #include "nfsd.h"
 
-struct nfsd_stats	nfsdstats;
 struct svc_stat		nfsd_svcstats = {
 	.program	= &nfsd_program,
 };
@@ -47,7 +46,7 @@ static int nfsd_show(struct seq_file *seq, void *v)
 		   percpu_counter_sum_positive(&nn->counter[NFSD_STATS_IO_WRITE]));
 
 	/* thread usage: */
-	seq_printf(seq, "th %u 0", atomic_read(&nfsdstats.th_cnt));
+	seq_printf(seq, "th %u 0", atomic_read(&nfsd_th_cnt));
 
 	/* deprecated thread usage histogram stats */
 	for (i = 0; i < 10; i++)
diff --git a/fs/nfsd/stats.h b/fs/nfsd/stats.h
index c24be4ddbe7d..5675d283a537 100644
--- a/fs/nfsd/stats.h
+++ b/fs/nfsd/stats.h
@@ -10,12 +10,6 @@
 #include <uapi/linux/nfsd/stats.h>
 #include <linux/percpu_counter.h>
 
-struct nfsd_stats {
-	atomic_t	th_cnt;		/* number of available threads */
-};
-
-extern struct nfsd_stats	nfsdstats;
-
 extern struct svc_stat		nfsd_svcstats;
 
 int nfsd_percpu_counters_init(struct percpu_counter *counters, int num);
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6.6.y 12/12] nfsd: make svc_stat per-network namespace instead of global
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
                   ` (10 preceding siblings ...)
  2024-08-12 22:36 ` [PATCH 6.6.y 11/12] nfsd: remove nfsd_stats, make th_cnt a global counter cel
@ 2024-08-12 22:36 ` cel
  2024-08-14  7:45 ` [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" Petr Vorel
  2024-08-15  8:25 ` Greg KH
  13 siblings, 0 replies; 19+ messages in thread
From: cel @ 2024-08-12 22:36 UTC (permalink / raw)
  To: stable
  Cc: linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Josef Bacik, Jeff Layton

From: Josef Bacik <josef@toxicpanda.com>

[ 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>
---
 fs/nfsd/netns.h  |  4 ++++
 fs/nfsd/nfsctl.c |  2 ++
 fs/nfsd/nfssvc.c |  2 +-
 fs/nfsd/stats.c  | 10 ++++------
 fs/nfsd/stats.h  |  2 --
 5 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h
index 9260248a0790..9bfca3dda63d 100644
--- a/fs/nfsd/netns.h
+++ b/fs/nfsd/netns.h
@@ -14,6 +14,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
@@ -184,6 +185,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;
 
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index d19ddf2fb4fe..887035b74467 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -1527,6 +1527,8 @@ static __net_init int nfsd_net_init(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);
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index e9689db75f63..7911c4b3b5d3 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -670,7 +670,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;
diff --git a/fs/nfsd/stats.c b/fs/nfsd/stats.c
index 276bbcd59cdb..9f606fa08bd4 100644
--- a/fs/nfsd/stats.c
+++ b/fs/nfsd/stats.c
@@ -27,10 +27,6 @@
 
 #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 */
@@ -121,7 +117,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)
diff --git a/fs/nfsd/stats.h b/fs/nfsd/stats.h
index 5675d283a537..d2753e975dfd 100644
--- a/fs/nfsd/stats.h
+++ b/fs/nfsd/stats.h
@@ -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);
-- 
2.45.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global"
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
                   ` (11 preceding siblings ...)
  2024-08-12 22:36 ` [PATCH 6.6.y 12/12] nfsd: make svc_stat per-network namespace instead of global cel
@ 2024-08-14  7:45 ` Petr Vorel
       [not found]   ` <BN0PR10MB5143EDD71EF92A181D4255A0E7872@BN0PR10MB5143.namprd10.prod.outlook.com>
                     ` (2 more replies)
  2024-08-15  8:25 ` Greg KH
  13 siblings, 3 replies; 19+ messages in thread
From: Petr Vorel @ 2024-08-14  7:45 UTC (permalink / raw)
  To: cel
  Cc: stable, linux-nfs, sherry.yang, calum.mackay, kernel-team,
	Chuck Lever, Cyril Hrubis, ltp

Hi Chuck,

> Following up on:

> https://lore.kernel.org/linux-nfs/d4b235df-4ee5-4824-9d48-e3b3c1f1f4d1@oracle.com/

> Here is a backport series targeting origin/linux-6.6.y that closes
> the information leak described in the above thread. It passes basic
> NFSD regression testing.


Thank you for handling this! The link above mentions that it was already
backported to 5.4 and indeed I see at least d47151b79e322 ("nfs: expose
/proc/net/sunrpc/nfs in net namespaces") is backported in 5.4, 5.10, 5.15, 6.1.
And you're now preparing 6.6. Thus we can expect the behavior changed from
5.4 kernels.

I wonder if we consider this as a fix, thus expect any kernel newer than 5.4
should backport all these 12 patches.

Or, whether we should relax and just check if version is higher than the one
which got it in stable/LTS (e.g. >= 5.4.276 || >= 5.10.217 ...). The question is
also if enterprise distros will take this patchset.

BTW We have in LTP functionality which points as a hint to kernel fixes. But
it's usually a single commit. I might need to list all.

Kind regards,
Petr

> Review comments welcome.   

> Chuck Lever (2):
>   NFSD: Rewrite synopsis of nfsd_percpu_counters_init()
>   NFSD: Fix frame size warning in svc_export_parse()

> Josef Bacik (10):
>   sunrpc: don't change ->sv_stats if it doesn't exist
>   nfsd: stop setting ->pg_stats for unused stats
>   sunrpc: pass in the sv_stats struct through svc_create_pooled
>   sunrpc: remove ->pg_stats from svc_program
>   sunrpc: use the struct net as the svc proc private
>   nfsd: rename NFSD_NET_* to NFSD_STATS_*
>   nfsd: expose /proc/net/sunrpc/nfsd in net namespaces
>   nfsd: make all of the nfsd stats per-network namespace
>   nfsd: remove nfsd_stats, make th_cnt a global counter
>   nfsd: make svc_stat per-network namespace instead of global

>  fs/lockd/svc.c             |  3 --
>  fs/nfs/callback.c          |  3 --
>  fs/nfsd/cache.h            |  2 -
>  fs/nfsd/export.c           | 32 ++++++++++----
>  fs/nfsd/export.h           |  4 +-
>  fs/nfsd/netns.h            | 25 +++++++++--
>  fs/nfsd/nfs4proc.c         |  6 +--
>  fs/nfsd/nfs4state.c        |  3 +-
>  fs/nfsd/nfscache.c         | 40 ++++-------------
>  fs/nfsd/nfsctl.c           | 16 +++----
>  fs/nfsd/nfsd.h             |  1 +
>  fs/nfsd/nfsfh.c            |  3 +-
>  fs/nfsd/nfssvc.c           | 14 +++---
>  fs/nfsd/stats.c            | 54 ++++++++++-------------
>  fs/nfsd/stats.h            | 88 ++++++++++++++------------------------
>  fs/nfsd/vfs.c              |  6 ++-
>  include/linux/sunrpc/svc.h |  5 ++-
>  net/sunrpc/stats.c         |  2 +-
>  net/sunrpc/svc.c           | 39 +++++++++++------
>  19 files changed, 163 insertions(+), 183 deletions(-)

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global"
       [not found]   ` <BN0PR10MB5143EDD71EF92A181D4255A0E7872@BN0PR10MB5143.namprd10.prod.outlook.com>
@ 2024-08-14 10:09     ` Petr Vorel
  2024-08-14 12:13       ` Calum Mackay
  0 siblings, 1 reply; 19+ messages in thread
From: Petr Vorel @ 2024-08-14 10:09 UTC (permalink / raw)
  To: Calum Mackay
  Cc: cel@kernel.org, stable@vger.kernel.org, linux-nfs@vger.kernel.org,
	Sherry Yang, kernel-team@fb.com, Chuck Lever III, Cyril Hrubis,
	ltp@lists.linux.it

Hi Calum,

> Hi Petr,

> There are two sets of changes here, for NFS client, and NFS server.

> The NFS client changes have already been backported from v6.9 all the way to v5.4.

> Here, Chuck is discussing the NFS server changes (and others), which were not backported from v6.9 (actually, a few were, but only to v6.8).

Thanks for info! Now I'll see the patchset "Make nfsd stats visible in network
ns" [1]. kernelnewbies [2] starts with d98416cc2154 ("nfsd: rename
NFSD_NET_* to NFSD_STATS_*"), the others are probably some preparation commits.

Anyway, I'll update the patch with NFS server patchset.

Kind regards,
Petr

[1] https://lore.kernel.org/linux-nfs/cover.1706283433.git.josef@toxicpanda.com/
[2] https://kernelnewbies.org/Linux_6.9#File_systems


> Thanks,
> Calum.

> Sent from Outlook for Android<https://aka.ms/AAb9ysg>
> ________________________________
> From: Petr Vorel <pvorel@suse.cz>
> Sent: Wednesday, August 14, 2024 8:45:59 AM
> To: cel@kernel.org <cel@kernel.org>
> Cc: stable@vger.kernel.org <stable@vger.kernel.org>; linux-nfs@vger.kernel.org <linux-nfs@vger.kernel.org>; Sherry Yang <sherry.yang@oracle.com>; Calum Mackay <calum.mackay@oracle.com>; kernel-team@fb.com <kernel-team@fb.com>; Chuck Lever III <chuck.lever@oracle.com>; Cyril Hrubis <chrubis@suse.cz>; ltp@lists.linux.it <ltp@lists.linux.it>
> Subject: Re: [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global"

> Hi Chuck,

> > Following up on:

> > https://lore.kernel.org/linux-nfs/d4b235df-4ee5-4824-9d48-e3b3c1f1f4d1@oracle.com/

> > Here is a backport series targeting origin/linux-6.6.y that closes
> > the information leak described in the above thread. It passes basic
> > NFSD regression testing.


> Thank you for handling this! The link above mentions that it was already
> backported to 5.4 and indeed I see at least d47151b79e322 ("nfs: expose
> /proc/net/sunrpc/nfs in net namespaces") is backported in 5.4, 5.10, 5.15, 6.1.
> And you're now preparing 6.6. Thus we can expect the behavior changed from
> 5.4 kernels.

> I wonder if we consider this as a fix, thus expect any kernel newer than 5.4
> should backport all these 12 patches.

> Or, whether we should relax and just check if version is higher than the one
> which got it in stable/LTS (e.g. >= 5.4.276 || >= 5.10.217 ...). The question is
> also if enterprise distros will take this patchset.

> BTW We have in LTP functionality which points as a hint to kernel fixes. But
> it's usually a single commit. I might need to list all.

> Kind regards,
> Petr

> > Review comments welcome.

> > Chuck Lever (2):
> >   NFSD: Rewrite synopsis of nfsd_percpu_counters_init()
> >   NFSD: Fix frame size warning in svc_export_parse()

> > Josef Bacik (10):
> >   sunrpc: don't change ->sv_stats if it doesn't exist
> >   nfsd: stop setting ->pg_stats for unused stats
> >   sunrpc: pass in the sv_stats struct through svc_create_pooled
> >   sunrpc: remove ->pg_stats from svc_program
> >   sunrpc: use the struct net as the svc proc private
> >   nfsd: rename NFSD_NET_* to NFSD_STATS_*
> >   nfsd: expose /proc/net/sunrpc/nfsd in net namespaces
> >   nfsd: make all of the nfsd stats per-network namespace
> >   nfsd: remove nfsd_stats, make th_cnt a global counter
> >   nfsd: make svc_stat per-network namespace instead of global

> >  fs/lockd/svc.c             |  3 --
> >  fs/nfs/callback.c          |  3 --
> >  fs/nfsd/cache.h            |  2 -
> >  fs/nfsd/export.c           | 32 ++++++++++----
> >  fs/nfsd/export.h           |  4 +-
> >  fs/nfsd/netns.h            | 25 +++++++++--
> >  fs/nfsd/nfs4proc.c         |  6 +--
> >  fs/nfsd/nfs4state.c        |  3 +-
> >  fs/nfsd/nfscache.c         | 40 ++++-------------
> >  fs/nfsd/nfsctl.c           | 16 +++----
> >  fs/nfsd/nfsd.h             |  1 +
> >  fs/nfsd/nfsfh.c            |  3 +-
> >  fs/nfsd/nfssvc.c           | 14 +++---
> >  fs/nfsd/stats.c            | 54 ++++++++++-------------
> >  fs/nfsd/stats.h            | 88 ++++++++++++++------------------------
> >  fs/nfsd/vfs.c              |  6 ++-
> >  include/linux/sunrpc/svc.h |  5 ++-
> >  net/sunrpc/stats.c         |  2 +-
> >  net/sunrpc/svc.c           | 39 +++++++++++------
> >  19 files changed, 163 insertions(+), 183 deletions(-)


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global"
  2024-08-14  7:45 ` [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" Petr Vorel
       [not found]   ` <BN0PR10MB5143EDD71EF92A181D4255A0E7872@BN0PR10MB5143.namprd10.prod.outlook.com>
@ 2024-08-14 12:10   ` Calum Mackay
  2024-08-14 12:14   ` Calum Mackay
  2 siblings, 0 replies; 19+ messages in thread
From: Calum Mackay @ 2024-08-14 12:10 UTC (permalink / raw)
  To: Petr Vorel, cel
  Cc: Calum Mackay, stable, linux-nfs, sherry.yang, kernel-team,
	Chuck Lever, Cyril Hrubis, ltp


[-- Attachment #1.1: Type: text/plain, Size: 3431 bytes --]

Hi Petr,

[resending for the lists, owing to blockage, sorry]

There are two sets of changes here, for NFS client, and NFS server.

The NFS client changes have already been backported from v6.9 all the 
way to v5.4.

Here, Chuck is discussing the NFS server changes (and others), which 
were not backported from v6.9 (actually, a few were, but only to v6.8).

Thanks,
Calum.

On 14/08/2024 8:45 am, Petr Vorel wrote:
> Hi Chuck,
> 
>> Following up on:
> 
>> https://lore.kernel.org/linux-nfs/d4b235df-4ee5-4824-9d48-e3b3c1f1f4d1@oracle.com/
> 
>> Here is a backport series targeting origin/linux-6.6.y that closes
>> the information leak described in the above thread. It passes basic
>> NFSD regression testing.
> 
> 
> Thank you for handling this! The link above mentions that it was already
> backported to 5.4 and indeed I see at least d47151b79e322 ("nfs: expose
> /proc/net/sunrpc/nfs in net namespaces") is backported in 5.4, 5.10, 5.15, 6.1.
> And you're now preparing 6.6. Thus we can expect the behavior changed from
> 5.4 kernels.
> 
> I wonder if we consider this as a fix, thus expect any kernel newer than 5.4
> should backport all these 12 patches.
> 
> Or, whether we should relax and just check if version is higher than the one
> which got it in stable/LTS (e.g. >= 5.4.276 || >= 5.10.217 ...). The question is
> also if enterprise distros will take this patchset.
> 
> BTW We have in LTP functionality which points as a hint to kernel fixes. But
> it's usually a single commit. I might need to list all.
> 
> Kind regards,
> Petr
> 
>> Review comments welcome.
> 
>> Chuck Lever (2):
>>    NFSD: Rewrite synopsis of nfsd_percpu_counters_init()
>>    NFSD: Fix frame size warning in svc_export_parse()
> 
>> Josef Bacik (10):
>>    sunrpc: don't change ->sv_stats if it doesn't exist
>>    nfsd: stop setting ->pg_stats for unused stats
>>    sunrpc: pass in the sv_stats struct through svc_create_pooled
>>    sunrpc: remove ->pg_stats from svc_program
>>    sunrpc: use the struct net as the svc proc private
>>    nfsd: rename NFSD_NET_* to NFSD_STATS_*
>>    nfsd: expose /proc/net/sunrpc/nfsd in net namespaces
>>    nfsd: make all of the nfsd stats per-network namespace
>>    nfsd: remove nfsd_stats, make th_cnt a global counter
>>    nfsd: make svc_stat per-network namespace instead of global
> 
>>   fs/lockd/svc.c             |  3 --
>>   fs/nfs/callback.c          |  3 --
>>   fs/nfsd/cache.h            |  2 -
>>   fs/nfsd/export.c           | 32 ++++++++++----
>>   fs/nfsd/export.h           |  4 +-
>>   fs/nfsd/netns.h            | 25 +++++++++--
>>   fs/nfsd/nfs4proc.c         |  6 +--
>>   fs/nfsd/nfs4state.c        |  3 +-
>>   fs/nfsd/nfscache.c         | 40 ++++-------------
>>   fs/nfsd/nfsctl.c           | 16 +++----
>>   fs/nfsd/nfsd.h             |  1 +
>>   fs/nfsd/nfsfh.c            |  3 +-
>>   fs/nfsd/nfssvc.c           | 14 +++---
>>   fs/nfsd/stats.c            | 54 ++++++++++-------------
>>   fs/nfsd/stats.h            | 88 ++++++++++++++------------------------
>>   fs/nfsd/vfs.c              |  6 ++-
>>   include/linux/sunrpc/svc.h |  5 ++-
>>   net/sunrpc/stats.c         |  2 +-
>>   net/sunrpc/svc.c           | 39 +++++++++++------
>>   19 files changed, 163 insertions(+), 183 deletions(-)
> 

-- 
Calum Mackay
Linux Kernel Engineering
Oracle Linux and Virtualisation


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global"
  2024-08-14 10:09     ` Petr Vorel
@ 2024-08-14 12:13       ` Calum Mackay
  0 siblings, 0 replies; 19+ messages in thread
From: Calum Mackay @ 2024-08-14 12:13 UTC (permalink / raw)
  To: Petr Vorel
  Cc: Calum Mackay, cel@kernel.org, stable@vger.kernel.org,
	linux-nfs@vger.kernel.org, Sherry Yang, kernel-team@fb.com,
	Chuck Lever III, Cyril Hrubis, ltp@lists.linux.it

hi again Petr

On 14/08/2024 11:09 am, Petr Vorel wrote:
> Hi Calum,
> 
>> Hi Petr,
> 
>> There are two sets of changes here, for NFS client, and NFS server.
> 
>> The NFS client changes have already been backported from v6.9 all the way to v5.4.
> 
>> Here, Chuck is discussing the NFS server changes (and others), which were not backported from v6.9 (actually, a few were, but only to v6.8).
> 
> Thanks for info! Now I'll see the patchset "Make nfsd stats visible in network
> ns" [1]. kernelnewbies [2] starts with d98416cc2154 ("nfsd: rename
> NFSD_NET_* to NFSD_STATS_*"), the others are probably some preparation commits.

See also my note:

	https://lore.kernel.org/linux-nfs/2fc3a3fd-7433-45ba-b281-578355dca64c@oracle.com/

> 
> Anyway, I'll update the patch with NFS server patchset.
> 
> Kind regards,
> Petr
> 
> [1] https://lore.kernel.org/linux-nfs/cover.1706283433.git.josef@toxicpanda.com/
> [2] https://kernelnewbies.org/Linux_6.9#File_systems
> 
> 
>> Thanks,
>> Calum.
> 
>> Sent from Outlook for Android<https://aka.ms/AAb9ysg>
>> ________________________________
>> From: Petr Vorel <pvorel@suse.cz>
>> Sent: Wednesday, August 14, 2024 8:45:59 AM
>> To: cel@kernel.org <cel@kernel.org>
>> Cc: stable@vger.kernel.org <stable@vger.kernel.org>; linux-nfs@vger.kernel.org <linux-nfs@vger.kernel.org>; Sherry Yang <sherry.yang@oracle.com>; Calum Mackay <calum.mackay@oracle.com>; kernel-team@fb.com <kernel-team@fb.com>; Chuck Lever III <chuck.lever@oracle.com>; Cyril Hrubis <chrubis@suse.cz>; ltp@lists.linux.it <ltp@lists.linux.it>
>> Subject: Re: [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global"
> 
>> Hi Chuck,
> 
>>> Following up on:
> 
>>> https://lore.kernel.org/linux-nfs/d4b235df-4ee5-4824-9d48-e3b3c1f1f4d1@oracle.com/
> 
>>> Here is a backport series targeting origin/linux-6.6.y that closes
>>> the information leak described in the above thread. It passes basic
>>> NFSD regression testing.
> 
> 
>> Thank you for handling this! The link above mentions that it was already
>> backported to 5.4 and indeed I see at least d47151b79e322 ("nfs: expose
>> /proc/net/sunrpc/nfs in net namespaces") is backported in 5.4, 5.10, 5.15, 6.1.
>> And you're now preparing 6.6. Thus we can expect the behavior changed from
>> 5.4 kernels.
> 
>> I wonder if we consider this as a fix, thus expect any kernel newer than 5.4
>> should backport all these 12 patches.
> 
>> Or, whether we should relax and just check if version is higher than the one
>> which got it in stable/LTS (e.g. >= 5.4.276 || >= 5.10.217 ...). The question is
>> also if enterprise distros will take this patchset.
> 
>> BTW We have in LTP functionality which points as a hint to kernel fixes. But
>> it's usually a single commit. I might need to list all.
> 
>> Kind regards,
>> Petr
> 
>>> Review comments welcome.
> 
>>> Chuck Lever (2):
>>>    NFSD: Rewrite synopsis of nfsd_percpu_counters_init()
>>>    NFSD: Fix frame size warning in svc_export_parse()
> 
>>> Josef Bacik (10):
>>>    sunrpc: don't change ->sv_stats if it doesn't exist
>>>    nfsd: stop setting ->pg_stats for unused stats
>>>    sunrpc: pass in the sv_stats struct through svc_create_pooled
>>>    sunrpc: remove ->pg_stats from svc_program
>>>    sunrpc: use the struct net as the svc proc private
>>>    nfsd: rename NFSD_NET_* to NFSD_STATS_*
>>>    nfsd: expose /proc/net/sunrpc/nfsd in net namespaces
>>>    nfsd: make all of the nfsd stats per-network namespace
>>>    nfsd: remove nfsd_stats, make th_cnt a global counter
>>>    nfsd: make svc_stat per-network namespace instead of global
> 
>>>   fs/lockd/svc.c             |  3 --
>>>   fs/nfs/callback.c          |  3 --
>>>   fs/nfsd/cache.h            |  2 -
>>>   fs/nfsd/export.c           | 32 ++++++++++----
>>>   fs/nfsd/export.h           |  4 +-
>>>   fs/nfsd/netns.h            | 25 +++++++++--
>>>   fs/nfsd/nfs4proc.c         |  6 +--
>>>   fs/nfsd/nfs4state.c        |  3 +-
>>>   fs/nfsd/nfscache.c         | 40 ++++-------------
>>>   fs/nfsd/nfsctl.c           | 16 +++----
>>>   fs/nfsd/nfsd.h             |  1 +
>>>   fs/nfsd/nfsfh.c            |  3 +-
>>>   fs/nfsd/nfssvc.c           | 14 +++---
>>>   fs/nfsd/stats.c            | 54 ++++++++++-------------
>>>   fs/nfsd/stats.h            | 88 ++++++++++++++------------------------
>>>   fs/nfsd/vfs.c              |  6 ++-
>>>   include/linux/sunrpc/svc.h |  5 ++-
>>>   net/sunrpc/stats.c         |  2 +-
>>>   net/sunrpc/svc.c           | 39 +++++++++++------
>>>   19 files changed, 163 insertions(+), 183 deletions(-)
> 

-- 
Calum Mackay
Linux Kernel Engineering
Oracle Linux and Virtualisation


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global"
  2024-08-14  7:45 ` [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" Petr Vorel
       [not found]   ` <BN0PR10MB5143EDD71EF92A181D4255A0E7872@BN0PR10MB5143.namprd10.prod.outlook.com>
  2024-08-14 12:10   ` Calum Mackay
@ 2024-08-14 12:14   ` Calum Mackay
  2 siblings, 0 replies; 19+ messages in thread
From: Calum Mackay @ 2024-08-14 12:14 UTC (permalink / raw)
  To: Petr Vorel, cel
  Cc: Calum Mackay, stable, linux-nfs, sherry.yang, kernel-team,
	Chuck Lever, Cyril Hrubis, ltp

Hi Petr,

[resending for the lists, owing to blockage, sorry]

There are two sets of changes here, for NFS client, and NFS server.

The NFS client changes have already been backported from v6.9 all the 
way to v5.4.

Here, Chuck is discussing the NFS server changes (and others), which 
were not backported from v6.9 (actually, a few were, but only to v6.8).

Thanks,
Calum.

On 14/08/2024 8:45 am, Petr Vorel wrote:
> Hi Chuck,
> 
>> Following up on:
> 
>> https://lore.kernel.org/linux-nfs/d4b235df-4ee5-4824-9d48-e3b3c1f1f4d1@oracle.com/
> 
>> Here is a backport series targeting origin/linux-6.6.y that closes
>> the information leak described in the above thread. It passes basic
>> NFSD regression testing.
> 
> 
> Thank you for handling this! The link above mentions that it was already
> backported to 5.4 and indeed I see at least d47151b79e322 ("nfs: expose
> /proc/net/sunrpc/nfs in net namespaces") is backported in 5.4, 5.10, 5.15, 6.1.
> And you're now preparing 6.6. Thus we can expect the behavior changed from
> 5.4 kernels.
> 
> I wonder if we consider this as a fix, thus expect any kernel newer than 5.4
> should backport all these 12 patches.
> 
> Or, whether we should relax and just check if version is higher than the one
> which got it in stable/LTS (e.g. >= 5.4.276 || >= 5.10.217 ...). The question is
> also if enterprise distros will take this patchset.
> 
> BTW We have in LTP functionality which points as a hint to kernel fixes. But
> it's usually a single commit. I might need to list all.
> 
> Kind regards,
> Petr
> 
>> Review comments welcome.
> 
>> Chuck Lever (2):
>>    NFSD: Rewrite synopsis of nfsd_percpu_counters_init()
>>    NFSD: Fix frame size warning in svc_export_parse()
> 
>> Josef Bacik (10):
>>    sunrpc: don't change ->sv_stats if it doesn't exist
>>    nfsd: stop setting ->pg_stats for unused stats
>>    sunrpc: pass in the sv_stats struct through svc_create_pooled
>>    sunrpc: remove ->pg_stats from svc_program
>>    sunrpc: use the struct net as the svc proc private
>>    nfsd: rename NFSD_NET_* to NFSD_STATS_*
>>    nfsd: expose /proc/net/sunrpc/nfsd in net namespaces
>>    nfsd: make all of the nfsd stats per-network namespace
>>    nfsd: remove nfsd_stats, make th_cnt a global counter
>>    nfsd: make svc_stat per-network namespace instead of global
> 
>>   fs/lockd/svc.c             |  3 --
>>   fs/nfs/callback.c          |  3 --
>>   fs/nfsd/cache.h            |  2 -
>>   fs/nfsd/export.c           | 32 ++++++++++----
>>   fs/nfsd/export.h           |  4 +-
>>   fs/nfsd/netns.h            | 25 +++++++++--
>>   fs/nfsd/nfs4proc.c         |  6 +--
>>   fs/nfsd/nfs4state.c        |  3 +-
>>   fs/nfsd/nfscache.c         | 40 ++++-------------
>>   fs/nfsd/nfsctl.c           | 16 +++----
>>   fs/nfsd/nfsd.h             |  1 +
>>   fs/nfsd/nfsfh.c            |  3 +-
>>   fs/nfsd/nfssvc.c           | 14 +++---
>>   fs/nfsd/stats.c            | 54 ++++++++++-------------
>>   fs/nfsd/stats.h            | 88 ++++++++++++++------------------------
>>   fs/nfsd/vfs.c              |  6 ++-
>>   include/linux/sunrpc/svc.h |  5 ++-
>>   net/sunrpc/stats.c         |  2 +-
>>   net/sunrpc/svc.c           | 39 +++++++++++------
>>   19 files changed, 163 insertions(+), 183 deletions(-)
> 

-- 
Calum Mackay
Linux Kernel Engineering
Oracle Linux and Virtualisation


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global"
  2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
                   ` (12 preceding siblings ...)
  2024-08-14  7:45 ` [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" Petr Vorel
@ 2024-08-15  8:25 ` Greg KH
  13 siblings, 0 replies; 19+ messages in thread
From: Greg KH @ 2024-08-15  8:25 UTC (permalink / raw)
  To: cel
  Cc: stable, linux-nfs, pvorel, sherry.yang, calum.mackay, kernel-team,
	Chuck Lever

On Mon, Aug 12, 2024 at 06:35:52PM -0400, cel@kernel.org wrote:
> From: Chuck Lever <chuck.lever@oracle.com>
> 
> Following up on:
> 
> https://lore.kernel.org/linux-nfs/d4b235df-4ee5-4824-9d48-e3b3c1f1f4d1@oracle.com/
> 
> Here is a backport series targeting origin/linux-6.6.y that closes
> the information leak described in the above thread. It passes basic
> NFSD regression testing.
> 
> Review comments welcome.   

All now queued up, thanks.

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2024-08-15  8:25 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-12 22:35 [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" cel
2024-08-12 22:35 ` [PATCH 6.6.y 01/12] NFSD: Rewrite synopsis of nfsd_percpu_counters_init() cel
2024-08-12 22:35 ` [PATCH 6.6.y 02/12] NFSD: Fix frame size warning in svc_export_parse() cel
2024-08-12 22:35 ` [PATCH 6.6.y 03/12] sunrpc: don't change ->sv_stats if it doesn't exist cel
2024-08-12 22:35 ` [PATCH 6.6.y 04/12] nfsd: stop setting ->pg_stats for unused stats cel
2024-08-12 22:35 ` [PATCH 6.6.y 05/12] sunrpc: pass in the sv_stats struct through svc_create_pooled cel
2024-08-12 22:35 ` [PATCH 6.6.y 06/12] sunrpc: remove ->pg_stats from svc_program cel
2024-08-12 22:35 ` [PATCH 6.6.y 07/12] sunrpc: use the struct net as the svc proc private cel
2024-08-12 22:36 ` [PATCH 6.6.y 08/12] nfsd: rename NFSD_NET_* to NFSD_STATS_* cel
2024-08-12 22:36 ` [PATCH 6.6.y 09/12] nfsd: expose /proc/net/sunrpc/nfsd in net namespaces cel
2024-08-12 22:36 ` [PATCH 6.6.y 10/12] nfsd: make all of the nfsd stats per-network namespace cel
2024-08-12 22:36 ` [PATCH 6.6.y 11/12] nfsd: remove nfsd_stats, make th_cnt a global counter cel
2024-08-12 22:36 ` [PATCH 6.6.y 12/12] nfsd: make svc_stat per-network namespace instead of global cel
2024-08-14  7:45 ` [PATCH 6.6.y 00/12] Backport "make svc_stat per-net instead of global" Petr Vorel
     [not found]   ` <BN0PR10MB5143EDD71EF92A181D4255A0E7872@BN0PR10MB5143.namprd10.prod.outlook.com>
2024-08-14 10:09     ` Petr Vorel
2024-08-14 12:13       ` Calum Mackay
2024-08-14 12:10   ` Calum Mackay
2024-08-14 12:14   ` Calum Mackay
2024-08-15  8:25 ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).