brintos

brintos / linux-shallow public Read only

0
0
Text · 6.1 KiB · 0d0c44b Raw
245 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _FS_CEPH_MDS_METRIC_H3#define _FS_CEPH_MDS_METRIC_H4 5#include <linux/ceph/types.h>6#include <linux/percpu_counter.h>7#include <linux/ktime.h>8 9extern bool disable_send_metrics;10 11enum ceph_metric_type {12	CLIENT_METRIC_TYPE_CAP_INFO,13	CLIENT_METRIC_TYPE_READ_LATENCY,14	CLIENT_METRIC_TYPE_WRITE_LATENCY,15	CLIENT_METRIC_TYPE_METADATA_LATENCY,16	CLIENT_METRIC_TYPE_DENTRY_LEASE,17	CLIENT_METRIC_TYPE_OPENED_FILES,18	CLIENT_METRIC_TYPE_PINNED_ICAPS,19	CLIENT_METRIC_TYPE_OPENED_INODES,20	CLIENT_METRIC_TYPE_READ_IO_SIZES,21	CLIENT_METRIC_TYPE_WRITE_IO_SIZES,22	CLIENT_METRIC_TYPE_AVG_READ_LATENCY,23	CLIENT_METRIC_TYPE_STDEV_READ_LATENCY,24	CLIENT_METRIC_TYPE_AVG_WRITE_LATENCY,25	CLIENT_METRIC_TYPE_STDEV_WRITE_LATENCY,26	CLIENT_METRIC_TYPE_AVG_METADATA_LATENCY,27	CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY,28 29	CLIENT_METRIC_TYPE_MAX = CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY,30};31 32/*33 * This will always have the highest metric bit value34 * as the last element of the array.35 */36#define CEPHFS_METRIC_SPEC_CLIENT_SUPPORTED {	   \37	CLIENT_METRIC_TYPE_CAP_INFO,		   \38	CLIENT_METRIC_TYPE_READ_LATENCY,	   \39	CLIENT_METRIC_TYPE_WRITE_LATENCY,	   \40	CLIENT_METRIC_TYPE_METADATA_LATENCY,	   \41	CLIENT_METRIC_TYPE_DENTRY_LEASE,	   \42	CLIENT_METRIC_TYPE_OPENED_FILES,	   \43	CLIENT_METRIC_TYPE_PINNED_ICAPS,	   \44	CLIENT_METRIC_TYPE_OPENED_INODES,	   \45	CLIENT_METRIC_TYPE_READ_IO_SIZES,	   \46	CLIENT_METRIC_TYPE_WRITE_IO_SIZES,	   \47	CLIENT_METRIC_TYPE_AVG_READ_LATENCY,	   \48	CLIENT_METRIC_TYPE_STDEV_READ_LATENCY,	   \49	CLIENT_METRIC_TYPE_AVG_WRITE_LATENCY,	   \50	CLIENT_METRIC_TYPE_STDEV_WRITE_LATENCY,	   \51	CLIENT_METRIC_TYPE_AVG_METADATA_LATENCY,   \52	CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY, \53						   \54	CLIENT_METRIC_TYPE_MAX,			   \55}56 57struct ceph_metric_header {58	__le32 type;     /* ceph metric type */59	__u8  ver;60	__u8  compat;61	__le32 data_len; /* length of sizeof(hit + mis + total) */62} __packed;63 64/* metric caps header */65struct ceph_metric_cap {66	struct ceph_metric_header header;67	__le64 hit;68	__le64 mis;69	__le64 total;70} __packed;71 72/* metric read latency header */73struct ceph_metric_read_latency {74	struct ceph_metric_header header;75	struct ceph_timespec lat;76	struct ceph_timespec avg;77	__le64 sq_sum;78	__le64 count;79} __packed;80 81/* metric write latency header */82struct ceph_metric_write_latency {83	struct ceph_metric_header header;84	struct ceph_timespec lat;85	struct ceph_timespec avg;86	__le64 sq_sum;87	__le64 count;88} __packed;89 90/* metric metadata latency header */91struct ceph_metric_metadata_latency {92	struct ceph_metric_header header;93	struct ceph_timespec lat;94	struct ceph_timespec avg;95	__le64 sq_sum;96	__le64 count;97} __packed;98 99/* metric dentry lease header */100struct ceph_metric_dlease {101	struct ceph_metric_header header;102	__le64 hit;103	__le64 mis;104	__le64 total;105} __packed;106 107/* metric opened files header */108struct ceph_opened_files {109	struct ceph_metric_header header;110	__le64 opened_files;111	__le64 total;112} __packed;113 114/* metric pinned i_caps header */115struct ceph_pinned_icaps {116	struct ceph_metric_header header;117	__le64 pinned_icaps;118	__le64 total;119} __packed;120 121/* metric opened inodes header */122struct ceph_opened_inodes {123	struct ceph_metric_header header;124	__le64 opened_inodes;125	__le64 total;126} __packed;127 128/* metric read io size header */129struct ceph_read_io_size {130	struct ceph_metric_header header;131	__le64 total_ops;132	__le64 total_size;133} __packed;134 135/* metric write io size header */136struct ceph_write_io_size {137	struct ceph_metric_header header;138	__le64 total_ops;139	__le64 total_size;140} __packed;141 142struct ceph_metric_head {143	__le32 num;	/* the number of metrics that will be sent */144} __packed;145 146enum metric_type {147	METRIC_READ,148	METRIC_WRITE,149	METRIC_METADATA,150	METRIC_COPYFROM,151	METRIC_MAX152};153 154struct ceph_metric {155	spinlock_t lock;156	u64 total;157	u64 size_sum;158	u64 size_min;159	u64 size_max;160	ktime_t latency_sum;161	ktime_t latency_avg;162	ktime_t latency_sq_sum;163	ktime_t latency_min;164	ktime_t latency_max;165};166 167/* This is the global metrics */168struct ceph_client_metric {169	atomic64_t            total_dentries;170	struct percpu_counter d_lease_hit;171	struct percpu_counter d_lease_mis;172 173	atomic64_t            total_caps;174	struct percpu_counter i_caps_hit;175	struct percpu_counter i_caps_mis;176 177	struct ceph_metric metric[METRIC_MAX];178 179	/* The total number of directories and files that are opened */180	atomic64_t opened_files;181 182	/* The total number of inodes that have opened files or directories */183	struct percpu_counter opened_inodes;184	struct percpu_counter total_inodes;185 186	struct ceph_mds_session *session;187	struct delayed_work delayed_work;  /* delayed work */188};189 190static inline void metric_schedule_delayed(struct ceph_client_metric *m)191{192	if (disable_send_metrics)193		return;194 195	/* per second */196	schedule_delayed_work(&m->delayed_work, round_jiffies_relative(HZ));197}198 199extern int ceph_metric_init(struct ceph_client_metric *m);200extern void ceph_metric_destroy(struct ceph_client_metric *m);201 202static inline void ceph_update_cap_hit(struct ceph_client_metric *m)203{204	percpu_counter_inc(&m->i_caps_hit);205}206 207static inline void ceph_update_cap_mis(struct ceph_client_metric *m)208{209	percpu_counter_inc(&m->i_caps_mis);210}211 212extern void ceph_update_metrics(struct ceph_metric *m,213				ktime_t r_start, ktime_t r_end,214				unsigned int size, int rc);215 216static inline void ceph_update_read_metrics(struct ceph_client_metric *m,217					    ktime_t r_start, ktime_t r_end,218					    unsigned int size, int rc)219{220	ceph_update_metrics(&m->metric[METRIC_READ],221			    r_start, r_end, size, rc);222}223static inline void ceph_update_write_metrics(struct ceph_client_metric *m,224					     ktime_t r_start, ktime_t r_end,225					     unsigned int size, int rc)226{227	ceph_update_metrics(&m->metric[METRIC_WRITE],228			    r_start, r_end, size, rc);229}230static inline void ceph_update_metadata_metrics(struct ceph_client_metric *m,231						ktime_t r_start, ktime_t r_end,232						int rc)233{234	ceph_update_metrics(&m->metric[METRIC_METADATA],235			    r_start, r_end, 0, rc);236}237static inline void ceph_update_copyfrom_metrics(struct ceph_client_metric *m,238						ktime_t r_start, ktime_t r_end,239						unsigned int size, int rc)240{241	ceph_update_metrics(&m->metric[METRIC_COPYFROM],242			    r_start, r_end, size, rc);243}244#endif /* _FS_CEPH_MDS_METRIC_H */245