| 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 |  | 
|---|
| 95 | static inline struct rpc_iostats *rpc_alloc_iostats(struct rpc_clnt *clnt) { return NULL; } | 
|---|
| 96 | static inline void rpc_count_iostats(const struct rpc_task *task, | 
|---|
| 97 | 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 |  | 
|---|
| 103 | static inline void rpc_clnt_show_stats(struct seq_file *seq, struct rpc_clnt *clnt) {} | 
|---|
| 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 |  | 
|---|