Linux Audio

Check our new training course

Linux kernel drivers training

May 6-19, 2025
Register
Loading...
v6.9.4
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _FS_CEPH_MDS_METRIC_H
  3#define _FS_CEPH_MDS_METRIC_H
  4
  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 value
 34 * 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_MAX
152};
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 */
v6.8
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _FS_CEPH_MDS_METRIC_H
  3#define _FS_CEPH_MDS_METRIC_H
  4
  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 value
 34 * 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_MAX
152};
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 */