1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Statistics for NFS server.
4 *
5 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
6 */
7#ifndef _NFSD_STATS_H
8#define _NFSD_STATS_H
9
10#include <uapi/linux/nfsd/stats.h>
11#include <linux/percpu_counter.h>
12
13int nfsd_percpu_counters_init(struct percpu_counter *counters, int num);
14void nfsd_percpu_counters_reset(struct percpu_counter *counters, int num);
15void nfsd_percpu_counters_destroy(struct percpu_counter *counters, int num);
16int nfsd_stat_counters_init(struct nfsd_net *nn);
17void nfsd_stat_counters_destroy(struct nfsd_net *nn);
18void nfsd_proc_stat_init(struct net *net);
19void nfsd_proc_stat_shutdown(struct net *net);
20
21static inline void nfsd_stats_rc_hits_inc(struct nfsd_net *nn)
22{
23	percpu_counter_inc(&nn->counter[NFSD_STATS_RC_HITS]);
24}
25
26static inline void nfsd_stats_rc_misses_inc(struct nfsd_net *nn)
27{
28	percpu_counter_inc(&nn->counter[NFSD_STATS_RC_MISSES]);
29}
30
31static inline void nfsd_stats_rc_nocache_inc(struct nfsd_net *nn)
32{
33	percpu_counter_inc(&nn->counter[NFSD_STATS_RC_NOCACHE]);
34}
35
36static inline void nfsd_stats_fh_stale_inc(struct nfsd_net *nn,
37					   struct svc_export *exp)
38{
39	percpu_counter_inc(&nn->counter[NFSD_STATS_FH_STALE]);
40	if (exp && exp->ex_stats)
41		percpu_counter_inc(&exp->ex_stats->counter[EXP_STATS_FH_STALE]);
42}
43
44static inline void nfsd_stats_io_read_add(struct nfsd_net *nn,
45					  struct svc_export *exp, s64 amount)
46{
47	percpu_counter_add(&nn->counter[NFSD_STATS_IO_READ], amount);
48	if (exp && exp->ex_stats)
49		percpu_counter_add(&exp->ex_stats->counter[EXP_STATS_IO_READ], amount);
50}
51
52static inline void nfsd_stats_io_write_add(struct nfsd_net *nn,
53					   struct svc_export *exp, s64 amount)
54{
55	percpu_counter_add(&nn->counter[NFSD_STATS_IO_WRITE], amount);
56	if (exp && exp->ex_stats)
57		percpu_counter_add(&exp->ex_stats->counter[EXP_STATS_IO_WRITE], amount);
58}
59
60static inline void nfsd_stats_payload_misses_inc(struct nfsd_net *nn)
61{
62	percpu_counter_inc(&nn->counter[NFSD_STATS_PAYLOAD_MISSES]);
63}
64
65static inline void nfsd_stats_drc_mem_usage_add(struct nfsd_net *nn, s64 amount)
66{
67	percpu_counter_add(&nn->counter[NFSD_STATS_DRC_MEM_USAGE], amount);
68}
69
70static inline void nfsd_stats_drc_mem_usage_sub(struct nfsd_net *nn, s64 amount)
71{
72	percpu_counter_sub(&nn->counter[NFSD_STATS_DRC_MEM_USAGE], amount);
73}
74
75#ifdef CONFIG_NFSD_V4
76static inline void nfsd_stats_wdeleg_getattr_inc(struct nfsd_net *nn)
77{
78	percpu_counter_inc(&nn->counter[NFSD_STATS_WDELEG_GETATTR]);
79}
80#endif
81#endif /* _NFSD_STATS_H */
82