1e48f083eSChuck Lever /* SPDX-License-Identifier: GPL-2.0 */ 2e48f083eSChuck Lever /* 3e48f083eSChuck Lever * Copyright (c) 2017 Oracle. All rights reserved. 4e48f083eSChuck Lever */ 5e48f083eSChuck Lever #undef TRACE_SYSTEM 6e48f083eSChuck Lever #define TRACE_SYSTEM rpcrdma 7e48f083eSChuck Lever 8e48f083eSChuck Lever #if !defined(_TRACE_RPCRDMA_H) || defined(TRACE_HEADER_MULTI_READ) 9e48f083eSChuck Lever #define _TRACE_RPCRDMA_H 10e48f083eSChuck Lever 11e48f083eSChuck Lever #include <linux/tracepoint.h> 12e48f083eSChuck Lever #include <trace/events/rdma.h> 13e48f083eSChuck Lever 14ab03eff5SChuck Lever /** 15b4a7f91cSChuck Lever ** Event classes 16b4a7f91cSChuck Lever **/ 17b4a7f91cSChuck Lever 18b4a7f91cSChuck Lever DECLARE_EVENT_CLASS(xprtrdma_reply_event, 19b4a7f91cSChuck Lever TP_PROTO( 20b4a7f91cSChuck Lever const struct rpcrdma_rep *rep 21b4a7f91cSChuck Lever ), 22b4a7f91cSChuck Lever 23b4a7f91cSChuck Lever TP_ARGS(rep), 24b4a7f91cSChuck Lever 25b4a7f91cSChuck Lever TP_STRUCT__entry( 26b4a7f91cSChuck Lever __field(const void *, rep) 27b4a7f91cSChuck Lever __field(const void *, r_xprt) 28b4a7f91cSChuck Lever __field(u32, xid) 29b4a7f91cSChuck Lever __field(u32, version) 30b4a7f91cSChuck Lever __field(u32, proc) 31b4a7f91cSChuck Lever ), 32b4a7f91cSChuck Lever 33b4a7f91cSChuck Lever TP_fast_assign( 34b4a7f91cSChuck Lever __entry->rep = rep; 35b4a7f91cSChuck Lever __entry->r_xprt = rep->rr_rxprt; 36b4a7f91cSChuck Lever __entry->xid = be32_to_cpu(rep->rr_xid); 37b4a7f91cSChuck Lever __entry->version = be32_to_cpu(rep->rr_vers); 38b4a7f91cSChuck Lever __entry->proc = be32_to_cpu(rep->rr_proc); 39b4a7f91cSChuck Lever ), 40b4a7f91cSChuck Lever 41b4a7f91cSChuck Lever TP_printk("rxprt %p xid=0x%08x rep=%p: version %u proc %u", 42b4a7f91cSChuck Lever __entry->r_xprt, __entry->xid, __entry->rep, 43b4a7f91cSChuck Lever __entry->version, __entry->proc 44b4a7f91cSChuck Lever ) 45b4a7f91cSChuck Lever ); 46b4a7f91cSChuck Lever 47b4a7f91cSChuck Lever #define DEFINE_REPLY_EVENT(name) \ 48b4a7f91cSChuck Lever DEFINE_EVENT(xprtrdma_reply_event, name, \ 49b4a7f91cSChuck Lever TP_PROTO( \ 50b4a7f91cSChuck Lever const struct rpcrdma_rep *rep \ 51b4a7f91cSChuck Lever ), \ 52b4a7f91cSChuck Lever TP_ARGS(rep)) 53b4a7f91cSChuck Lever 54b4a7f91cSChuck Lever /** 55ab03eff5SChuck Lever ** Call events 56ab03eff5SChuck Lever **/ 57ab03eff5SChuck Lever 58ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_noch); 59ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_readch); 60ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_areadch); 61ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_writech); 62ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_replych); 63ab03eff5SChuck Lever 64ab03eff5SChuck Lever #define xprtrdma_show_chunktype(x) \ 65ab03eff5SChuck Lever __print_symbolic(x, \ 66ab03eff5SChuck Lever { rpcrdma_noch, "inline" }, \ 67ab03eff5SChuck Lever { rpcrdma_readch, "read list" }, \ 68ab03eff5SChuck Lever { rpcrdma_areadch, "*read list" }, \ 69ab03eff5SChuck Lever { rpcrdma_writech, "write list" }, \ 70ab03eff5SChuck Lever { rpcrdma_replych, "reply chunk" }) 71ab03eff5SChuck Lever 72ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_marshal, 73ab03eff5SChuck Lever TP_PROTO( 74ab03eff5SChuck Lever const struct rpc_rqst *rqst, 75ab03eff5SChuck Lever unsigned int hdrlen, 76ab03eff5SChuck Lever unsigned int rtype, 77ab03eff5SChuck Lever unsigned int wtype 78ab03eff5SChuck Lever ), 79ab03eff5SChuck Lever 80ab03eff5SChuck Lever TP_ARGS(rqst, hdrlen, rtype, wtype), 81ab03eff5SChuck Lever 82ab03eff5SChuck Lever TP_STRUCT__entry( 83ab03eff5SChuck Lever __field(unsigned int, task_id) 84ab03eff5SChuck Lever __field(unsigned int, client_id) 85ab03eff5SChuck Lever __field(u32, xid) 86ab03eff5SChuck Lever __field(unsigned int, hdrlen) 87ab03eff5SChuck Lever __field(unsigned int, headlen) 88ab03eff5SChuck Lever __field(unsigned int, pagelen) 89ab03eff5SChuck Lever __field(unsigned int, taillen) 90ab03eff5SChuck Lever __field(unsigned int, rtype) 91ab03eff5SChuck Lever __field(unsigned int, wtype) 92ab03eff5SChuck Lever ), 93ab03eff5SChuck Lever 94ab03eff5SChuck Lever TP_fast_assign( 95ab03eff5SChuck Lever __entry->task_id = rqst->rq_task->tk_pid; 96ab03eff5SChuck Lever __entry->client_id = rqst->rq_task->tk_client->cl_clid; 97ab03eff5SChuck Lever __entry->xid = be32_to_cpu(rqst->rq_xid); 98ab03eff5SChuck Lever __entry->hdrlen = hdrlen; 99ab03eff5SChuck Lever __entry->headlen = rqst->rq_snd_buf.head[0].iov_len; 100ab03eff5SChuck Lever __entry->pagelen = rqst->rq_snd_buf.page_len; 101ab03eff5SChuck Lever __entry->taillen = rqst->rq_snd_buf.tail[0].iov_len; 102ab03eff5SChuck Lever __entry->rtype = rtype; 103ab03eff5SChuck Lever __entry->wtype = wtype; 104ab03eff5SChuck Lever ), 105ab03eff5SChuck Lever 106ab03eff5SChuck Lever TP_printk("task:%u@%u xid=0x%08x: hdr=%u xdr=%u/%u/%u %s/%s", 107ab03eff5SChuck Lever __entry->task_id, __entry->client_id, __entry->xid, 108ab03eff5SChuck Lever __entry->hdrlen, 109ab03eff5SChuck Lever __entry->headlen, __entry->pagelen, __entry->taillen, 110ab03eff5SChuck Lever xprtrdma_show_chunktype(__entry->rtype), 111ab03eff5SChuck Lever xprtrdma_show_chunktype(__entry->wtype) 112ab03eff5SChuck Lever ) 113ab03eff5SChuck Lever ); 114ab03eff5SChuck Lever 115ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_post_send, 116ab03eff5SChuck Lever TP_PROTO( 117ab03eff5SChuck Lever const struct rpcrdma_req *req, 118ab03eff5SChuck Lever int status 119ab03eff5SChuck Lever ), 120ab03eff5SChuck Lever 121ab03eff5SChuck Lever TP_ARGS(req, status), 122ab03eff5SChuck Lever 123ab03eff5SChuck Lever TP_STRUCT__entry( 124ab03eff5SChuck Lever __field(const void *, req) 125ab03eff5SChuck Lever __field(int, num_sge) 126ab03eff5SChuck Lever __field(bool, signaled) 127ab03eff5SChuck Lever __field(int, status) 128ab03eff5SChuck Lever ), 129ab03eff5SChuck Lever 130ab03eff5SChuck Lever TP_fast_assign( 131ab03eff5SChuck Lever __entry->req = req; 132ab03eff5SChuck Lever __entry->num_sge = req->rl_sendctx->sc_wr.num_sge; 133ab03eff5SChuck Lever __entry->signaled = req->rl_sendctx->sc_wr.send_flags & 134ab03eff5SChuck Lever IB_SEND_SIGNALED; 135ab03eff5SChuck Lever __entry->status = status; 136ab03eff5SChuck Lever ), 137ab03eff5SChuck Lever 138ab03eff5SChuck Lever TP_printk("req=%p, %d SGEs%s, status=%d", 139ab03eff5SChuck Lever __entry->req, __entry->num_sge, 140ab03eff5SChuck Lever (__entry->signaled ? ", signaled" : ""), 141ab03eff5SChuck Lever __entry->status 142ab03eff5SChuck Lever ) 143ab03eff5SChuck Lever ); 144ab03eff5SChuck Lever 145b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_post_recv, 146b4a7f91cSChuck Lever TP_PROTO( 147b4a7f91cSChuck Lever const struct rpcrdma_rep *rep, 148b4a7f91cSChuck Lever int status 149b4a7f91cSChuck Lever ), 150b4a7f91cSChuck Lever 151b4a7f91cSChuck Lever TP_ARGS(rep, status), 152b4a7f91cSChuck Lever 153b4a7f91cSChuck Lever TP_STRUCT__entry( 154b4a7f91cSChuck Lever __field(const void *, rep) 155b4a7f91cSChuck Lever __field(int, status) 156b4a7f91cSChuck Lever ), 157b4a7f91cSChuck Lever 158b4a7f91cSChuck Lever TP_fast_assign( 159b4a7f91cSChuck Lever __entry->rep = rep; 160b4a7f91cSChuck Lever __entry->status = status; 161b4a7f91cSChuck Lever ), 162b4a7f91cSChuck Lever 163b4a7f91cSChuck Lever TP_printk("rep=%p status=%d", 164b4a7f91cSChuck Lever __entry->rep, __entry->status 165b4a7f91cSChuck Lever ) 166b4a7f91cSChuck Lever ); 167b4a7f91cSChuck Lever 168ab03eff5SChuck Lever /** 169ab03eff5SChuck Lever ** Completion events 170ab03eff5SChuck Lever **/ 171ab03eff5SChuck Lever 172ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_wc_send, 173ab03eff5SChuck Lever TP_PROTO( 174ab03eff5SChuck Lever const struct rpcrdma_sendctx *sc, 175ab03eff5SChuck Lever const struct ib_wc *wc 176ab03eff5SChuck Lever ), 177ab03eff5SChuck Lever 178ab03eff5SChuck Lever TP_ARGS(sc, wc), 179ab03eff5SChuck Lever 180ab03eff5SChuck Lever TP_STRUCT__entry( 181ab03eff5SChuck Lever __field(const void *, req) 182ab03eff5SChuck Lever __field(unsigned int, unmap_count) 183ab03eff5SChuck Lever __field(unsigned int, status) 184ab03eff5SChuck Lever __field(unsigned int, vendor_err) 185ab03eff5SChuck Lever ), 186ab03eff5SChuck Lever 187ab03eff5SChuck Lever TP_fast_assign( 188ab03eff5SChuck Lever __entry->req = sc->sc_req; 189ab03eff5SChuck Lever __entry->unmap_count = sc->sc_unmap_count; 190ab03eff5SChuck Lever __entry->status = wc->status; 191ab03eff5SChuck Lever __entry->vendor_err = __entry->status ? wc->vendor_err : 0; 192ab03eff5SChuck Lever ), 193ab03eff5SChuck Lever 194ab03eff5SChuck Lever TP_printk("req=%p, unmapped %u pages: %s (%u/0x%x)", 195ab03eff5SChuck Lever __entry->req, __entry->unmap_count, 196ab03eff5SChuck Lever rdma_show_wc_status(__entry->status), 197ab03eff5SChuck Lever __entry->status, __entry->vendor_err 198ab03eff5SChuck Lever ) 199ab03eff5SChuck Lever ); 200ab03eff5SChuck Lever 201b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_wc_receive, 202b4a7f91cSChuck Lever TP_PROTO( 203b4a7f91cSChuck Lever const struct rpcrdma_rep *rep, 204b4a7f91cSChuck Lever const struct ib_wc *wc 205b4a7f91cSChuck Lever ), 206b4a7f91cSChuck Lever 207b4a7f91cSChuck Lever TP_ARGS(rep, wc), 208b4a7f91cSChuck Lever 209b4a7f91cSChuck Lever TP_STRUCT__entry( 210b4a7f91cSChuck Lever __field(const void *, rep) 211b4a7f91cSChuck Lever __field(unsigned int, byte_len) 212b4a7f91cSChuck Lever __field(unsigned int, status) 213b4a7f91cSChuck Lever __field(unsigned int, vendor_err) 214b4a7f91cSChuck Lever ), 215b4a7f91cSChuck Lever 216b4a7f91cSChuck Lever TP_fast_assign( 217b4a7f91cSChuck Lever __entry->rep = rep; 218b4a7f91cSChuck Lever __entry->byte_len = wc->byte_len; 219b4a7f91cSChuck Lever __entry->status = wc->status; 220b4a7f91cSChuck Lever __entry->vendor_err = __entry->status ? wc->vendor_err : 0; 221b4a7f91cSChuck Lever ), 222b4a7f91cSChuck Lever 223b4a7f91cSChuck Lever TP_printk("rep=%p, %u bytes: %s (%u/0x%x)", 224b4a7f91cSChuck Lever __entry->rep, __entry->byte_len, 225b4a7f91cSChuck Lever rdma_show_wc_status(__entry->status), 226b4a7f91cSChuck Lever __entry->status, __entry->vendor_err 227b4a7f91cSChuck Lever ) 228b4a7f91cSChuck Lever ); 229b4a7f91cSChuck Lever 230b4a7f91cSChuck Lever /** 231b4a7f91cSChuck Lever ** Reply events 232b4a7f91cSChuck Lever **/ 233b4a7f91cSChuck Lever 234b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_reply, 235b4a7f91cSChuck Lever TP_PROTO( 236b4a7f91cSChuck Lever const struct rpc_task *task, 237b4a7f91cSChuck Lever const struct rpcrdma_rep *rep, 238b4a7f91cSChuck Lever const struct rpcrdma_req *req, 239b4a7f91cSChuck Lever unsigned int credits 240b4a7f91cSChuck Lever ), 241b4a7f91cSChuck Lever 242b4a7f91cSChuck Lever TP_ARGS(task, rep, req, credits), 243b4a7f91cSChuck Lever 244b4a7f91cSChuck Lever TP_STRUCT__entry( 245b4a7f91cSChuck Lever __field(unsigned int, task_id) 246b4a7f91cSChuck Lever __field(unsigned int, client_id) 247b4a7f91cSChuck Lever __field(const void *, rep) 248b4a7f91cSChuck Lever __field(const void *, req) 249b4a7f91cSChuck Lever __field(u32, xid) 250b4a7f91cSChuck Lever __field(unsigned int, credits) 251b4a7f91cSChuck Lever ), 252b4a7f91cSChuck Lever 253b4a7f91cSChuck Lever TP_fast_assign( 254b4a7f91cSChuck Lever __entry->task_id = task->tk_pid; 255b4a7f91cSChuck Lever __entry->client_id = task->tk_client->cl_clid; 256b4a7f91cSChuck Lever __entry->rep = rep; 257b4a7f91cSChuck Lever __entry->req = req; 258b4a7f91cSChuck Lever __entry->xid = be32_to_cpu(rep->rr_xid); 259b4a7f91cSChuck Lever __entry->credits = credits; 260b4a7f91cSChuck Lever ), 261b4a7f91cSChuck Lever 262b4a7f91cSChuck Lever TP_printk("task:%u@%u xid=0x%08x, %u credits, rep=%p -> req=%p", 263b4a7f91cSChuck Lever __entry->task_id, __entry->client_id, __entry->xid, 264b4a7f91cSChuck Lever __entry->credits, __entry->rep, __entry->req 265b4a7f91cSChuck Lever ) 266b4a7f91cSChuck Lever ); 267b4a7f91cSChuck Lever 268b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_defer_cmp, 269b4a7f91cSChuck Lever TP_PROTO( 270b4a7f91cSChuck Lever const struct rpcrdma_rep *rep 271b4a7f91cSChuck Lever ), 272b4a7f91cSChuck Lever 273b4a7f91cSChuck Lever TP_ARGS(rep), 274b4a7f91cSChuck Lever 275b4a7f91cSChuck Lever TP_STRUCT__entry( 276b4a7f91cSChuck Lever __field(unsigned int, task_id) 277b4a7f91cSChuck Lever __field(unsigned int, client_id) 278b4a7f91cSChuck Lever __field(const void *, rep) 279b4a7f91cSChuck Lever __field(u32, xid) 280b4a7f91cSChuck Lever ), 281b4a7f91cSChuck Lever 282b4a7f91cSChuck Lever TP_fast_assign( 283b4a7f91cSChuck Lever __entry->task_id = rep->rr_rqst->rq_task->tk_pid; 284b4a7f91cSChuck Lever __entry->client_id = rep->rr_rqst->rq_task->tk_client->cl_clid; 285b4a7f91cSChuck Lever __entry->rep = rep; 286b4a7f91cSChuck Lever __entry->xid = be32_to_cpu(rep->rr_xid); 287b4a7f91cSChuck Lever ), 288b4a7f91cSChuck Lever 289b4a7f91cSChuck Lever TP_printk("task:%u@%u xid=0x%08x rep=%p", 290b4a7f91cSChuck Lever __entry->task_id, __entry->client_id, __entry->xid, 291b4a7f91cSChuck Lever __entry->rep 292b4a7f91cSChuck Lever ) 293b4a7f91cSChuck Lever ); 294b4a7f91cSChuck Lever 295b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_vers); 296b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_rqst); 297b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_short); 298b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_hdr); 299b4a7f91cSChuck Lever 300e48f083eSChuck Lever #endif /* _TRACE_RPCRDMA_H */ 301e48f083eSChuck Lever 302e48f083eSChuck Lever #include <trace/define_trace.h> 303