xref: /openbmc/linux/include/linux/sunrpc/metrics.h (revision 0898782247ae533d1f4e47a06bc5d4870931b284)
1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*
3   *  linux/include/linux/sunrpc/metrics.h
4   *
5   *  Declarations for RPC client per-operation metrics
6   *
7   *  Copyright (C) 2005	Chuck Lever <cel@netapp.com>
8   *
9   *  RPC client per-operation statistics provide latency and retry
10   *  information about each type of RPC procedure in a given RPC program.
11   *  These statistics are not for detailed problem diagnosis, but simply
12   *  to indicate whether the problem is local or remote.
13   *
14   *  These counters are not meant to be human-readable, but are meant to be
15   *  integrated into system monitoring tools such as "sar" and "iostat".  As
16   *  such, the counters are sampled by the tools over time, and are never
17   *  zeroed after a file system is mounted.  Moving averages can be computed
18   *  by the tools by taking the difference between two instantaneous samples
19   *  and dividing that by the time between the samples.
20   *
21   *  The counters are maintained in a single array per RPC client, indexed
22   *  by procedure number.  There is no need to maintain separate counter
23   *  arrays per-CPU because these counters are always modified behind locks.
24   */
25  
26  #ifndef _LINUX_SUNRPC_METRICS_H
27  #define _LINUX_SUNRPC_METRICS_H
28  
29  #include <linux/seq_file.h>
30  #include <linux/ktime.h>
31  #include <linux/spinlock.h>
32  
33  #define RPC_IOSTATS_VERS	"1.1"
34  
35  struct rpc_iostats {
36  	spinlock_t		om_lock;
37  
38  	/*
39  	 * These counters give an idea about how many request
40  	 * transmissions are required, on average, to complete that
41  	 * particular procedure.  Some procedures may require more
42  	 * than one transmission because the server is unresponsive,
43  	 * the client is retransmitting too aggressively, or the
44  	 * requests are large and the network is congested.
45  	 */
46  	unsigned long		om_ops,		/* count of operations */
47  				om_ntrans,	/* count of RPC transmissions */
48  				om_timeouts;	/* count of major timeouts */
49  
50  	/*
51  	 * These count how many bytes are sent and received for a
52  	 * given RPC procedure type.  This indicates how much load a
53  	 * particular procedure is putting on the network.  These
54  	 * counts include the RPC and ULP headers, and the request
55  	 * payload.
56  	 */
57  	unsigned long long      om_bytes_sent,	/* count of bytes out */
58  				om_bytes_recv;	/* count of bytes in */
59  
60  	/*
61  	 * The length of time an RPC request waits in queue before
62  	 * transmission, the network + server latency of the request,
63  	 * and the total time the request spent from init to release
64  	 * are measured.
65  	 */
66  	ktime_t			om_queue,	/* queued for xmit */
67  				om_rtt,		/* RPC RTT */
68  				om_execute;	/* RPC execution */
69  	/*
70  	 * The count of operations that complete with tk_status < 0.
71  	 * These statuses usually indicate error conditions.
72  	 */
73  	unsigned long           om_error_status;
74  } ____cacheline_aligned;
75  
76  struct rpc_task;
77  struct rpc_clnt;
78  
79  /*
80   * EXPORTed functions for managing rpc_iostats structures
81   */
82  
83  #ifdef CONFIG_PROC_FS
84  
85  struct rpc_iostats *	rpc_alloc_iostats(struct rpc_clnt *);
86  void			rpc_count_iostats(const struct rpc_task *,
87  					  struct rpc_iostats *);
88  void			rpc_count_iostats_metrics(const struct rpc_task *,
89  					  struct rpc_iostats *);
90  void			rpc_clnt_show_stats(struct seq_file *, struct rpc_clnt *);
91  void			rpc_free_iostats(struct rpc_iostats *);
92  
93  #else  /*  CONFIG_PROC_FS  */
94  
rpc_alloc_iostats(struct rpc_clnt * clnt)95  static inline struct rpc_iostats *rpc_alloc_iostats(struct rpc_clnt *clnt) { return NULL; }
rpc_count_iostats(const struct rpc_task * task,struct rpc_iostats * stats)96  static inline void rpc_count_iostats(const struct rpc_task *task,
97  				     struct rpc_iostats *stats) {}
rpc_count_iostats_metrics(const struct rpc_task * task,struct rpc_iostats * stats)98  static inline void rpc_count_iostats_metrics(const struct rpc_task *task,
99  					     struct rpc_iostats *stats)
100  {
101  }
102  
rpc_clnt_show_stats(struct seq_file * seq,struct rpc_clnt * clnt)103  static inline void rpc_clnt_show_stats(struct seq_file *seq, struct rpc_clnt *clnt) {}
rpc_free_iostats(struct rpc_iostats * stats)104  static inline void rpc_free_iostats(struct rpc_iostats *stats) {}
105  
106  #endif  /*  CONFIG_PROC_FS  */
107  
108  #endif /* _LINUX_SUNRPC_METRICS_H */
109