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