1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* Ceph filesystem support module tracepoints 3 * 4 * Copyright (C) 2025 IONOS SE. All Rights Reserved. 5 * Written by Max Kellermann (max.kellermann@ionos.com) 6 */ 7 #undef TRACE_SYSTEM 8 #define TRACE_SYSTEM ceph 9 10 #if !defined(_TRACE_CEPH_H) || defined(TRACE_HEADER_MULTI_READ) 11 #define _TRACE_CEPH_H 12 13 #include <linux/tracepoint.h> 14 15 #define ceph_mdsc_suspend_reasons \ 16 EM(ceph_mdsc_suspend_reason_no_mdsmap, "no-mdsmap") \ 17 EM(ceph_mdsc_suspend_reason_no_active_mds, "no-active-mds") \ 18 EM(ceph_mdsc_suspend_reason_rejected, "rejected") \ 19 E_(ceph_mdsc_suspend_reason_session, "session") 20 21 #ifndef __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY 22 #define __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY 23 24 #undef EM 25 #undef E_ 26 #define EM(a, b) a, 27 #define E_(a, b) a 28 29 enum ceph_mdsc_suspend_reason { ceph_mdsc_suspend_reasons } __mode(byte); 30 31 #endif 32 33 /* 34 * Export enum symbols via userspace. 35 */ 36 #undef EM 37 #undef E_ 38 #define EM(a, b) TRACE_DEFINE_ENUM(a); 39 #define E_(a, b) TRACE_DEFINE_ENUM(a); 40 41 ceph_mdsc_suspend_reasons; 42 43 /* 44 * Now redefine the EM() and E_() macros to map the enums to the strings that 45 * will be printed in the output. 46 */ 47 #undef EM 48 #undef E_ 49 #define EM(a, b) { a, b }, 50 #define E_(a, b) { a, b } 51 52 TRACE_EVENT(ceph_mdsc_submit_request, 53 TP_PROTO(struct ceph_mds_client *mdsc, 54 struct ceph_mds_request *req), 55 56 TP_ARGS(mdsc, req), 57 58 TP_STRUCT__entry( 59 __field(u64, tid) 60 __field(int, op) 61 __field(u64, ino) 62 __field(u64, snap) 63 ), 64 65 TP_fast_assign( 66 struct inode *inode; 67 68 __entry->tid = req->r_tid; 69 __entry->op = req->r_op; 70 71 inode = req->r_inode; 72 if (inode == NULL && req->r_dentry) 73 inode = d_inode(req->r_dentry); 74 75 if (inode) { 76 __entry->ino = ceph_ino(inode); 77 __entry->snap = ceph_snap(inode); 78 } else { 79 __entry->ino = __entry->snap = 0; 80 } 81 ), 82 83 TP_printk("R=%llu op=%s ino=%llx,%llx", 84 __entry->tid, 85 ceph_mds_op_name(__entry->op), 86 __entry->ino, __entry->snap) 87 ); 88 89 TRACE_EVENT(ceph_mdsc_suspend_request, 90 TP_PROTO(struct ceph_mds_client *mdsc, 91 struct ceph_mds_session *session, 92 struct ceph_mds_request *req, 93 enum ceph_mdsc_suspend_reason reason), 94 95 TP_ARGS(mdsc, session, req, reason), 96 97 TP_STRUCT__entry( 98 __field(u64, tid) 99 __field(int, op) 100 __field(int, mds) 101 __field(enum ceph_mdsc_suspend_reason, reason) 102 ), 103 104 TP_fast_assign( 105 __entry->tid = req->r_tid; 106 __entry->op = req->r_op; 107 __entry->mds = session ? session->s_mds : -1; 108 __entry->reason = reason; 109 ), 110 111 TP_printk("R=%llu op=%s reason=%s", 112 __entry->tid, 113 ceph_mds_op_name(__entry->op), 114 __print_symbolic(__entry->reason, ceph_mdsc_suspend_reasons)) 115 ); 116 117 TRACE_EVENT(ceph_mdsc_resume_request, 118 TP_PROTO(struct ceph_mds_client *mdsc, 119 struct ceph_mds_request *req), 120 121 TP_ARGS(mdsc, req), 122 123 TP_STRUCT__entry( 124 __field(u64, tid) 125 __field(int, op) 126 ), 127 128 TP_fast_assign( 129 __entry->tid = req->r_tid; 130 __entry->op = req->r_op; 131 ), 132 133 TP_printk("R=%llu op=%s", 134 __entry->tid, 135 ceph_mds_op_name(__entry->op)) 136 ); 137 138 TRACE_EVENT(ceph_mdsc_send_request, 139 TP_PROTO(struct ceph_mds_session *session, 140 struct ceph_mds_request *req), 141 142 TP_ARGS(session, req), 143 144 TP_STRUCT__entry( 145 __field(u64, tid) 146 __field(int, op) 147 __field(int, mds) 148 ), 149 150 TP_fast_assign( 151 __entry->tid = req->r_tid; 152 __entry->op = req->r_op; 153 __entry->mds = session->s_mds; 154 ), 155 156 TP_printk("R=%llu op=%s mds=%d", 157 __entry->tid, 158 ceph_mds_op_name(__entry->op), 159 __entry->mds) 160 ); 161 162 TRACE_EVENT(ceph_mdsc_complete_request, 163 TP_PROTO(struct ceph_mds_client *mdsc, 164 struct ceph_mds_request *req), 165 166 TP_ARGS(mdsc, req), 167 168 TP_STRUCT__entry( 169 __field(u64, tid) 170 __field(int, op) 171 __field(int, err) 172 __field(unsigned long, latency_ns) 173 ), 174 175 TP_fast_assign( 176 __entry->tid = req->r_tid; 177 __entry->op = req->r_op; 178 __entry->err = req->r_err; 179 __entry->latency_ns = req->r_end_latency - req->r_start_latency; 180 ), 181 182 TP_printk("R=%llu op=%s err=%d latency_ns=%lu", 183 __entry->tid, 184 ceph_mds_op_name(__entry->op), 185 __entry->err, 186 __entry->latency_ns) 187 ); 188 189 TRACE_EVENT(ceph_handle_caps, 190 TP_PROTO(struct ceph_mds_client *mdsc, 191 struct ceph_mds_session *session, 192 int op, 193 const struct ceph_vino *vino, 194 struct ceph_inode_info *inode, 195 u32 seq, u32 mseq, u32 issue_seq), 196 197 TP_ARGS(mdsc, session, op, vino, inode, seq, mseq, issue_seq), 198 199 TP_STRUCT__entry( 200 __field(int, mds) 201 __field(int, op) 202 __field(u64, ino) 203 __field(u64, snap) 204 __field(u32, seq) 205 __field(u32, mseq) 206 __field(u32, issue_seq) 207 ), 208 209 TP_fast_assign( 210 __entry->mds = session->s_mds; 211 __entry->op = op; 212 __entry->ino = vino->ino; 213 __entry->snap = vino->snap; 214 __entry->seq = seq; 215 __entry->mseq = mseq; 216 __entry->issue_seq = issue_seq; 217 ), 218 219 TP_printk("mds=%d op=%s vino=%llx.%llx seq=%u iseq=%u mseq=%u", 220 __entry->mds, 221 ceph_cap_op_name(__entry->op), 222 __entry->ino, 223 __entry->snap, 224 __entry->seq, 225 __entry->issue_seq, 226 __entry->mseq) 227 ); 228 229 #undef EM 230 #undef E_ 231 #endif /* _TRACE_CEPH_H */ 232 233 /* This part must be outside protection */ 234 #include <trace/define_trace.h> 235