xref: /openbmc/linux/fs/nfsd/stats.h (revision 83869019)
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  
13  
14  enum {
15  	NFSD_STATS_RC_HITS,		/* repcache hits */
16  	NFSD_STATS_RC_MISSES,		/* repcache misses */
17  	NFSD_STATS_RC_NOCACHE,		/* uncached reqs */
18  	NFSD_STATS_FH_STALE,		/* FH stale error */
19  	NFSD_STATS_IO_READ,		/* bytes returned to read requests */
20  	NFSD_STATS_IO_WRITE,		/* bytes passed in write requests */
21  #ifdef CONFIG_NFSD_V4
22  	NFSD_STATS_FIRST_NFS4_OP,	/* count of individual nfsv4 operations */
23  	NFSD_STATS_LAST_NFS4_OP = NFSD_STATS_FIRST_NFS4_OP + LAST_NFS4_OP,
24  #define NFSD_STATS_NFS4_OP(op)	(NFSD_STATS_FIRST_NFS4_OP + (op))
25  #endif
26  	NFSD_STATS_COUNTERS_NUM
27  };
28  
29  struct nfsd_stats {
30  	struct percpu_counter	counter[NFSD_STATS_COUNTERS_NUM];
31  
32  	/* Protected by nfsd_mutex */
33  	unsigned int	th_cnt;		/* number of available threads */
34  };
35  
36  
37  extern struct nfsd_stats	nfsdstats;
38  
39  extern struct svc_stat		nfsd_svcstats;
40  
41  int nfsd_percpu_counters_init(struct percpu_counter counters[], int num);
42  void nfsd_percpu_counters_reset(struct percpu_counter counters[], int num);
43  void nfsd_percpu_counters_destroy(struct percpu_counter counters[], int num);
44  int nfsd_stat_init(void);
45  void nfsd_stat_shutdown(void);
46  
47  static inline void nfsd_stats_rc_hits_inc(void)
48  {
49  	percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_HITS]);
50  }
51  
52  static inline void nfsd_stats_rc_misses_inc(void)
53  {
54  	percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_MISSES]);
55  }
56  
57  static inline void nfsd_stats_rc_nocache_inc(void)
58  {
59  	percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_RC_NOCACHE]);
60  }
61  
62  static inline void nfsd_stats_fh_stale_inc(struct svc_export *exp)
63  {
64  	percpu_counter_inc(&nfsdstats.counter[NFSD_STATS_FH_STALE]);
65  	if (exp)
66  		percpu_counter_inc(&exp->ex_stats.counter[EXP_STATS_FH_STALE]);
67  }
68  
69  static inline void nfsd_stats_io_read_add(struct svc_export *exp, s64 amount)
70  {
71  	percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_READ], amount);
72  	if (exp)
73  		percpu_counter_add(&exp->ex_stats.counter[EXP_STATS_IO_READ], amount);
74  }
75  
76  static inline void nfsd_stats_io_write_add(struct svc_export *exp, s64 amount)
77  {
78  	percpu_counter_add(&nfsdstats.counter[NFSD_STATS_IO_WRITE], amount);
79  	if (exp)
80  		percpu_counter_add(&exp->ex_stats.counter[EXP_STATS_IO_WRITE], amount);
81  }
82  
83  static inline void nfsd_stats_payload_misses_inc(struct nfsd_net *nn)
84  {
85  	percpu_counter_inc(&nn->counter[NFSD_NET_PAYLOAD_MISSES]);
86  }
87  
88  static inline void nfsd_stats_drc_mem_usage_add(struct nfsd_net *nn, s64 amount)
89  {
90  	percpu_counter_add(&nn->counter[NFSD_NET_DRC_MEM_USAGE], amount);
91  }
92  
93  static inline void nfsd_stats_drc_mem_usage_sub(struct nfsd_net *nn, s64 amount)
94  {
95  	percpu_counter_sub(&nn->counter[NFSD_NET_DRC_MEM_USAGE], amount);
96  }
97  
98  #endif /* _NFSD_STATS_H */
99