235 lines
5.0 KiB
C
235 lines
5.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/* Ceph filesystem support module tracepoints
|
|
*
|
|
* Copyright (C) 2025 IONOS SE. All Rights Reserved.
|
|
* Written by Max Kellermann (max.kellermann@ionos.com)
|
|
*/
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM ceph
|
|
|
|
#if !defined(_TRACE_CEPH_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_CEPH_H
|
|
|
|
#include <linux/tracepoint.h>
|
|
|
|
#define ceph_mdsc_suspend_reasons \
|
|
EM(ceph_mdsc_suspend_reason_no_mdsmap, "no-mdsmap") \
|
|
EM(ceph_mdsc_suspend_reason_no_active_mds, "no-active-mds") \
|
|
EM(ceph_mdsc_suspend_reason_rejected, "rejected") \
|
|
E_(ceph_mdsc_suspend_reason_session, "session")
|
|
|
|
#ifndef __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
|
|
#define __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
|
|
|
|
#undef EM
|
|
#undef E_
|
|
#define EM(a, b) a,
|
|
#define E_(a, b) a
|
|
|
|
enum ceph_mdsc_suspend_reason { ceph_mdsc_suspend_reasons } __mode(byte);
|
|
|
|
#endif
|
|
|
|
/*
|
|
* Export enum symbols via userspace.
|
|
*/
|
|
#undef EM
|
|
#undef E_
|
|
#define EM(a, b) TRACE_DEFINE_ENUM(a);
|
|
#define E_(a, b) TRACE_DEFINE_ENUM(a);
|
|
|
|
ceph_mdsc_suspend_reasons;
|
|
|
|
/*
|
|
* Now redefine the EM() and E_() macros to map the enums to the strings that
|
|
* will be printed in the output.
|
|
*/
|
|
#undef EM
|
|
#undef E_
|
|
#define EM(a, b) { a, b },
|
|
#define E_(a, b) { a, b }
|
|
|
|
TRACE_EVENT(ceph_mdsc_submit_request,
|
|
TP_PROTO(struct ceph_mds_client *mdsc,
|
|
struct ceph_mds_request *req),
|
|
|
|
TP_ARGS(mdsc, req),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(u64, tid)
|
|
__field(int, op)
|
|
__field(u64, ino)
|
|
__field(u64, snap)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
struct inode *inode;
|
|
|
|
__entry->tid = req->r_tid;
|
|
__entry->op = req->r_op;
|
|
|
|
inode = req->r_inode;
|
|
if (inode == NULL && req->r_dentry)
|
|
inode = d_inode(req->r_dentry);
|
|
|
|
if (inode) {
|
|
__entry->ino = ceph_ino(inode);
|
|
__entry->snap = ceph_snap(inode);
|
|
} else {
|
|
__entry->ino = __entry->snap = 0;
|
|
}
|
|
),
|
|
|
|
TP_printk("R=%llu op=%s ino=%llx,%llx",
|
|
__entry->tid,
|
|
ceph_mds_op_name(__entry->op),
|
|
__entry->ino, __entry->snap)
|
|
);
|
|
|
|
TRACE_EVENT(ceph_mdsc_suspend_request,
|
|
TP_PROTO(struct ceph_mds_client *mdsc,
|
|
struct ceph_mds_session *session,
|
|
struct ceph_mds_request *req,
|
|
enum ceph_mdsc_suspend_reason reason),
|
|
|
|
TP_ARGS(mdsc, session, req, reason),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(u64, tid)
|
|
__field(int, op)
|
|
__field(int, mds)
|
|
__field(enum ceph_mdsc_suspend_reason, reason)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->tid = req->r_tid;
|
|
__entry->op = req->r_op;
|
|
__entry->mds = session ? session->s_mds : -1;
|
|
__entry->reason = reason;
|
|
),
|
|
|
|
TP_printk("R=%llu op=%s reason=%s",
|
|
__entry->tid,
|
|
ceph_mds_op_name(__entry->op),
|
|
__print_symbolic(__entry->reason, ceph_mdsc_suspend_reasons))
|
|
);
|
|
|
|
TRACE_EVENT(ceph_mdsc_resume_request,
|
|
TP_PROTO(struct ceph_mds_client *mdsc,
|
|
struct ceph_mds_request *req),
|
|
|
|
TP_ARGS(mdsc, req),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(u64, tid)
|
|
__field(int, op)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->tid = req->r_tid;
|
|
__entry->op = req->r_op;
|
|
),
|
|
|
|
TP_printk("R=%llu op=%s",
|
|
__entry->tid,
|
|
ceph_mds_op_name(__entry->op))
|
|
);
|
|
|
|
TRACE_EVENT(ceph_mdsc_send_request,
|
|
TP_PROTO(struct ceph_mds_session *session,
|
|
struct ceph_mds_request *req),
|
|
|
|
TP_ARGS(session, req),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(u64, tid)
|
|
__field(int, op)
|
|
__field(int, mds)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->tid = req->r_tid;
|
|
__entry->op = req->r_op;
|
|
__entry->mds = session->s_mds;
|
|
),
|
|
|
|
TP_printk("R=%llu op=%s mds=%d",
|
|
__entry->tid,
|
|
ceph_mds_op_name(__entry->op),
|
|
__entry->mds)
|
|
);
|
|
|
|
TRACE_EVENT(ceph_mdsc_complete_request,
|
|
TP_PROTO(struct ceph_mds_client *mdsc,
|
|
struct ceph_mds_request *req),
|
|
|
|
TP_ARGS(mdsc, req),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(u64, tid)
|
|
__field(int, op)
|
|
__field(int, err)
|
|
__field(unsigned long, latency_ns)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->tid = req->r_tid;
|
|
__entry->op = req->r_op;
|
|
__entry->err = req->r_err;
|
|
__entry->latency_ns = req->r_end_latency - req->r_start_latency;
|
|
),
|
|
|
|
TP_printk("R=%llu op=%s err=%d latency_ns=%lu",
|
|
__entry->tid,
|
|
ceph_mds_op_name(__entry->op),
|
|
__entry->err,
|
|
__entry->latency_ns)
|
|
);
|
|
|
|
TRACE_EVENT(ceph_handle_caps,
|
|
TP_PROTO(struct ceph_mds_client *mdsc,
|
|
struct ceph_mds_session *session,
|
|
int op,
|
|
const struct ceph_vino *vino,
|
|
struct ceph_inode_info *inode,
|
|
u32 seq, u32 mseq, u32 issue_seq),
|
|
|
|
TP_ARGS(mdsc, session, op, vino, inode, seq, mseq, issue_seq),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(int, mds)
|
|
__field(int, op)
|
|
__field(u64, ino)
|
|
__field(u64, snap)
|
|
__field(u32, seq)
|
|
__field(u32, mseq)
|
|
__field(u32, issue_seq)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->mds = session->s_mds;
|
|
__entry->op = op;
|
|
__entry->ino = vino->ino;
|
|
__entry->snap = vino->snap;
|
|
__entry->seq = seq;
|
|
__entry->mseq = mseq;
|
|
__entry->issue_seq = issue_seq;
|
|
),
|
|
|
|
TP_printk("mds=%d op=%s vino=%llx.%llx seq=%u iseq=%u mseq=%u",
|
|
__entry->mds,
|
|
ceph_cap_op_name(__entry->op),
|
|
__entry->ino,
|
|
__entry->snap,
|
|
__entry->seq,
|
|
__entry->issue_seq,
|
|
__entry->mseq)
|
|
);
|
|
|
|
#undef EM
|
|
#undef E_
|
|
#endif /* _TRACE_CEPH_H */
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|