On Thu, Jan 25, 2024 at 02:53:20PM -0500, Josef Bacik wrote:
> This is the last global stat, move it into nfsd_net and adjust all the
> users to use that variant instead of the global one.
Hm. I thought nfsd threads were a global resource -- they service
all network namespaces. So, shouldn't the same thread count be
surfaced to all containers? Won't they all see all of the nfsd
processes?
> Signed-off-by: Josef Bacik <[email protected]>
> ---
> fs/nfsd/netns.h | 3 +++
> fs/nfsd/nfssvc.c | 4 ++--
> fs/nfsd/stats.c | 4 ++--
> fs/nfsd/stats.h | 6 ------
> 4 files changed, 7 insertions(+), 10 deletions(-)
>
> diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h
> index 0cef4bb407a9..8d3f4cb7cab4 100644
> --- a/fs/nfsd/netns.h
> +++ b/fs/nfsd/netns.h
> @@ -179,6 +179,9 @@ struct nfsd_net {
> /* Per-netns stats counters */
> struct percpu_counter counter[NFSD_STATS_COUNTERS_NUM];
>
> + /* number of available threads */
> + atomic_t th_cnt;
> +
> /* longest hash chain seen */
> unsigned int longest_chain;
>
> diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
> index d98a6abad990..0961b95dcef6 100644
> --- a/fs/nfsd/nfssvc.c
> +++ b/fs/nfsd/nfssvc.c
> @@ -924,7 +924,7 @@ nfsd(void *vrqstp)
>
> current->fs->umask = 0;
>
> - atomic_inc(&nfsdstats.th_cnt);
> + atomic_inc(&nn->th_cnt);
>
> set_freezable();
>
> @@ -940,7 +940,7 @@ nfsd(void *vrqstp)
> nfsd_file_net_dispose(nn);
> }
>
> - atomic_dec(&nfsdstats.th_cnt);
> + atomic_dec(&nn->th_cnt);
>
> out:
> /* Release the thread */
> diff --git a/fs/nfsd/stats.c b/fs/nfsd/stats.c
> index 44e275324b06..360e6dbf4e5c 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(&nn->th_cnt));
>
> /* deprecated thread usage histogram stats */
> for (i = 0; i < 10; i++)
> @@ -112,6 +111,7 @@ void nfsd_percpu_counters_destroy(struct percpu_counter counters[], int num)
>
> int nfsd_stat_counters_init(struct nfsd_net *nn)
> {
> + atomic_set(&nn->th_cnt, 0);
> return nfsd_percpu_counters_init(nn->counter, NFSD_STATS_COUNTERS_NUM);
> }
>
> 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.43.0
>
>
--
Chuck Lever