/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2017 Oracle. All rights reserved. */ #undef TRACE_SYSTEM #define TRACE_SYSTEM rpcrdma #if !defined(_TRACE_RPCRDMA_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_RPCRDMA_H #include #include /** ** Event classes **/ DECLARE_EVENT_CLASS(xprtrdma_reply_event, TP_PROTO( const struct rpcrdma_rep *rep ), TP_ARGS(rep), TP_STRUCT__entry( __field(const void *, rep) __field(const void *, r_xprt) __field(u32, xid) __field(u32, version) __field(u32, proc) ), TP_fast_assign( __entry->rep = rep; __entry->r_xprt = rep->rr_rxprt; __entry->xid = be32_to_cpu(rep->rr_xid); __entry->version = be32_to_cpu(rep->rr_vers); __entry->proc = be32_to_cpu(rep->rr_proc); ), TP_printk("rxprt %p xid=0x%08x rep=%p: version %u proc %u", __entry->r_xprt, __entry->xid, __entry->rep, __entry->version, __entry->proc ) ); #define DEFINE_REPLY_EVENT(name) \ DEFINE_EVENT(xprtrdma_reply_event, name, \ TP_PROTO( \ const struct rpcrdma_rep *rep \ ), \ TP_ARGS(rep)) DECLARE_EVENT_CLASS(xprtrdma_rxprt, TP_PROTO( const struct rpcrdma_xprt *r_xprt ), TP_ARGS(r_xprt), TP_STRUCT__entry( __field(const void *, r_xprt) __string(addr, rpcrdma_addrstr(r_xprt)) __string(port, rpcrdma_portstr(r_xprt)) ), TP_fast_assign( __entry->r_xprt = r_xprt; __assign_str(addr, rpcrdma_addrstr(r_xprt)); __assign_str(port, rpcrdma_portstr(r_xprt)); ), TP_printk("peer=[%s]:%s r_xprt=%p", __get_str(addr), __get_str(port), __entry->r_xprt ) ); #define DEFINE_RXPRT_EVENT(name) \ DEFINE_EVENT(xprtrdma_rxprt, name, \ TP_PROTO( \ const struct rpcrdma_xprt *r_xprt \ ), \ TP_ARGS(r_xprt)) DECLARE_EVENT_CLASS(xprtrdma_rdch_event, TP_PROTO( const struct rpc_task *task, unsigned int pos, struct rpcrdma_mr *mr, int nsegs ), TP_ARGS(task, pos, mr, nsegs), TP_STRUCT__entry( __field(unsigned int, task_id) __field(unsigned int, client_id) __field(const void *, mr) __field(unsigned int, pos) __field(int, nents) __field(u32, handle) __field(u32, length) __field(u64, offset) __field(int, nsegs) ), TP_fast_assign( __entry->task_id = task->tk_pid; __entry->client_id = task->tk_client->cl_clid; __entry->mr = mr; __entry->pos = pos; __entry->nents = mr->mr_nents; __entry->handle = mr->mr_handle; __entry->length = mr->mr_length; __entry->offset = mr->mr_offset; __entry->nsegs = nsegs; ), TP_printk("task:%u@%u mr=%p pos=%u %u@0x%016llx:0x%08x (%s)", __entry->task_id, __entry->client_id, __entry->mr, __entry->pos, __entry->length, (unsigned long long)__entry->offset, __entry->handle, __entry->nents < __entry->nsegs ? "more" : "last" ) ); #define DEFINE_RDCH_EVENT(name) \ DEFINE_EVENT(xprtrdma_rdch_event, name, \ TP_PROTO( \ const struct rpc_task *task, \ unsigned int pos, \ struct rpcrdma_mr *mr, \ int nsegs \ ), \ TP_ARGS(task, pos, mr, nsegs)) DECLARE_EVENT_CLASS(xprtrdma_wrch_event, TP_PROTO( const struct rpc_task *task, struct rpcrdma_mr *mr, int nsegs ), TP_ARGS(task, mr, nsegs), TP_STRUCT__entry( __field(unsigned int, task_id) __field(unsigned int, client_id) __field(const void *, mr) __field(int, nents) __field(u32, handle) __field(u32, length) __field(u64, offset) __field(int, nsegs) ), TP_fast_assign( __entry->task_id = task->tk_pid; __entry->client_id = task->tk_client->cl_clid; __entry->mr = mr; __entry->nents = mr->mr_nents; __entry->handle = mr->mr_handle; __entry->length = mr->mr_length; __entry->offset = mr->mr_offset; __entry->nsegs = nsegs; ), TP_printk("task:%u@%u mr=%p %u@0x%016llx:0x%08x (%s)", __entry->task_id, __entry->client_id, __entry->mr, __entry->length, (unsigned long long)__entry->offset, __entry->handle, __entry->nents < __entry->nsegs ? "more" : "last" ) ); #define DEFINE_WRCH_EVENT(name) \ DEFINE_EVENT(xprtrdma_wrch_event, name, \ TP_PROTO( \ const struct rpc_task *task, \ struct rpcrdma_mr *mr, \ int nsegs \ ), \ TP_ARGS(task, mr, nsegs)) TRACE_DEFINE_ENUM(FRWR_IS_INVALID); TRACE_DEFINE_ENUM(FRWR_IS_VALID); TRACE_DEFINE_ENUM(FRWR_FLUSHED_FR); TRACE_DEFINE_ENUM(FRWR_FLUSHED_LI); #define xprtrdma_show_frwr_state(x) \ __print_symbolic(x, \ { FRWR_IS_INVALID, "INVALID" }, \ { FRWR_IS_VALID, "VALID" }, \ { FRWR_FLUSHED_FR, "FLUSHED_FR" }, \ { FRWR_FLUSHED_LI, "FLUSHED_LI" }) DECLARE_EVENT_CLASS(xprtrdma_frwr_done, TP_PROTO( const struct ib_wc *wc, const struct rpcrdma_frwr *frwr ), TP_ARGS(wc, frwr), TP_STRUCT__entry( __field(const void *, mr) __field(unsigned int, state) __field(unsigned int, status) __field(unsigned int, vendor_err) ), TP_fast_assign( __entry->mr = container_of(frwr, struct rpcrdma_mr, frwr); __entry->state = frwr->fr_state; __entry->status = wc->status; __entry->vendor_err = __entry->status ? wc->vendor_err : 0; ), TP_printk( "mr=%p state=%s: %s (%u/0x%x)", __entry->mr, xprtrdma_show_frwr_state(__entry->state), rdma_show_wc_status(__entry->status), __entry->status, __entry->vendor_err ) ); #define DEFINE_FRWR_DONE_EVENT(name) \ DEFINE_EVENT(xprtrdma_frwr_done, name, \ TP_PROTO( \ const struct ib_wc *wc, \ const struct rpcrdma_frwr *frwr \ ), \ TP_ARGS(wc, frwr)) DECLARE_EVENT_CLASS(xprtrdma_mr, TP_PROTO( const struct rpcrdma_mr *mr ), TP_ARGS(mr), TP_STRUCT__entry( __field(const void *, mr) __field(u32, handle) __field(u32, length) __field(u64, offset) ), TP_fast_assign( __entry->mr = mr; __entry->handle = mr->mr_handle; __entry->length = mr->mr_length; __entry->offset = mr->mr_offset; ), TP_printk("mr=%p %u@0x%016llx:0x%08x", __entry->mr, __entry->length, (unsigned long long)__entry->offset, __entry->handle ) ); #define DEFINE_MR_EVENT(name) \ DEFINE_EVENT(xprtrdma_mr, name, \ TP_PROTO( \ const struct rpcrdma_mr *mr \ ), \ TP_ARGS(mr)) DECLARE_EVENT_CLASS(xprtrdma_cb_event, TP_PROTO( const struct rpc_rqst *rqst ), TP_ARGS(rqst), TP_STRUCT__entry( __field(const void *, rqst) __field(const void *, rep) __field(const void *, req) __field(u32, xid) ), TP_fast_assign( __entry->rqst = rqst; __entry->req = rpcr_to_rdmar(rqst); __entry->rep = rpcr_to_rdmar(rqst)->rl_reply; __entry->xid = be32_to_cpu(rqst->rq_xid); ), TP_printk("xid=0x%08x, rqst=%p req=%p rep=%p", __entry->xid, __entry->rqst, __entry->req, __entry->rep ) ); #define DEFINE_CB_EVENT(name) \ DEFINE_EVENT(xprtrdma_cb_event, name, \ TP_PROTO( \ const struct rpc_rqst *rqst \ ), \ TP_ARGS(rqst)) /** ** Connection events **/ TRACE_EVENT(xprtrdma_conn_upcall, TP_PROTO( const struct rpcrdma_xprt *r_xprt, struct rdma_cm_event *event ), TP_ARGS(r_xprt, event), TP_STRUCT__entry( __field(const void *, r_xprt) __field(unsigned int, event) __field(int, status) __string(addr, rpcrdma_addrstr(r_xprt)) __string(port, rpcrdma_portstr(r_xprt)) ), TP_fast_assign( __entry->r_xprt = r_xprt; __entry->event = event->event; __entry->status = event->status; __assign_str(addr, rpcrdma_addrstr(r_xprt)); __assign_str(port, rpcrdma_portstr(r_xprt)); ), TP_printk("peer=[%s]:%s r_xprt=%p: %s (%u/%d)", __get_str(addr), __get_str(port), __entry->r_xprt, rdma_show_cm_event(__entry->event), __entry->event, __entry->status ) ); TRACE_EVENT(xprtrdma_disconnect, TP_PROTO( const struct rpcrdma_xprt *r_xprt, int status ), TP_ARGS(r_xprt, status), TP_STRUCT__entry( __field(const void *, r_xprt) __field(int, status) __field(int, connected) __string(addr, rpcrdma_addrstr(r_xprt)) __string(port, rpcrdma_portstr(r_xprt)) ), TP_fast_assign( __entry->r_xprt = r_xprt; __entry->status = status; __entry->connected = r_xprt->rx_ep.rep_connected; __assign_str(addr, rpcrdma_addrstr(r_xprt)); __assign_str(port, rpcrdma_portstr(r_xprt)); ), TP_printk("peer=[%s]:%s r_xprt=%p: status=%d %sconnected", __get_str(addr), __get_str(port), __entry->r_xprt, __entry->status, __entry->connected == 1 ? "still " : "dis" ) ); DEFINE_RXPRT_EVENT(xprtrdma_conn_start); DEFINE_RXPRT_EVENT(xprtrdma_conn_tout); DEFINE_RXPRT_EVENT(xprtrdma_create); DEFINE_RXPRT_EVENT(xprtrdma_destroy); DEFINE_RXPRT_EVENT(xprtrdma_remove); DEFINE_RXPRT_EVENT(xprtrdma_reinsert); DEFINE_RXPRT_EVENT(xprtrdma_reconnect); DEFINE_RXPRT_EVENT(xprtrdma_inject_dsc); TRACE_EVENT(xprtrdma_qp_error, TP_PROTO( const struct rpcrdma_xprt *r_xprt, const struct ib_event *event ), TP_ARGS(r_xprt, event), TP_STRUCT__entry( __field(const void *, r_xprt) __field(unsigned int, event) __string(name, event->device->name) __string(addr, rpcrdma_addrstr(r_xprt)) __string(port, rpcrdma_portstr(r_xprt)) ), TP_fast_assign( __entry->r_xprt = r_xprt; __entry->event = event->event; __assign_str(name, event->device->name); __assign_str(addr, rpcrdma_addrstr(r_xprt)); __assign_str(port, rpcrdma_portstr(r_xprt)); ), TP_printk("peer=[%s]:%s r_xprt=%p: dev %s: %s (%u)", __get_str(addr), __get_str(port), __entry->r_xprt, __get_str(name), rdma_show_ib_event(__entry->event), __entry->event ) ); /** ** Call events **/ TRACE_EVENT(xprtrdma_createmrs, TP_PROTO( const struct rpcrdma_xprt *r_xprt, unsigned int count ), TP_ARGS(r_xprt, count), TP_STRUCT__entry( __field(const void *, r_xprt) __field(unsigned int, count) ), TP_fast_assign( __entry->r_xprt = r_xprt; __entry->count = count; ), TP_printk("r_xprt=%p: created %u MRs", __entry->r_xprt, __entry->count ) ); DEFINE_RXPRT_EVENT(xprtrdma_nomrs); DEFINE_RDCH_EVENT(xprtrdma_read_chunk); DEFINE_WRCH_EVENT(xprtrdma_write_chunk); DEFINE_WRCH_EVENT(xprtrdma_reply_chunk); TRACE_DEFINE_ENUM(rpcrdma_noch); TRACE_DEFINE_ENUM(rpcrdma_readch); TRACE_DEFINE_ENUM(rpcrdma_areadch); TRACE_DEFINE_ENUM(rpcrdma_writech); TRACE_DEFINE_ENUM(rpcrdma_replych); #define xprtrdma_show_chunktype(x) \ __print_symbolic(x, \ { rpcrdma_noch, "inline" }, \ { rpcrdma_readch, "read list" }, \ { rpcrdma_areadch, "*read list" }, \ { rpcrdma_writech, "write list" }, \ { rpcrdma_replych, "reply chunk" }) TRACE_EVENT(xprtrdma_marshal, TP_PROTO( const struct rpc_rqst *rqst, unsigned int hdrlen, unsigned int rtype, unsigned int wtype ), TP_ARGS(rqst, hdrlen, rtype, wtype), TP_STRUCT__entry( __field(unsigned int, task_id) __field(unsigned int, client_id) __field(u32, xid) __field(unsigned int, hdrlen) __field(unsigned int, headlen) __field(unsigned int, pagelen) __field(unsigned int, taillen) __field(unsigned int, rtype) __field(unsigned int, wtype) ), TP_fast_assign( __entry->task_id = rqst->rq_task->tk_pid; __entry->client_id = rqst->rq_task->tk_client->cl_clid; __entry->xid = be32_to_cpu(rqst->rq_xid); __entry->hdrlen = hdrlen; __entry->headlen = rqst->rq_snd_buf.head[0].iov_len; __entry->pagelen = rqst->rq_snd_buf.page_len; __entry->taillen = rqst->rq_snd_buf.tail[0].iov_len; __entry->rtype = rtype; __entry->wtype = wtype; ), TP_printk("task:%u@%u xid=0x%08x: hdr=%u xdr=%u/%u/%u %s/%s", __entry->task_id, __entry->client_id, __entry->xid, __entry->hdrlen, __entry->headlen, __entry->pagelen, __entry->taillen, xprtrdma_show_chunktype(__entry->rtype), xprtrdma_show_chunktype(__entry->wtype) ) ); TRACE_EVENT(xprtrdma_post_send, TP_PROTO( const struct rpcrdma_req *req, int status ), TP_ARGS(req, status), TP_STRUCT__entry( __field(const void *, req) __field(int, num_sge) __field(bool, signaled) __field(int, status) ), TP_fast_assign( __entry->req = req; __entry->num_sge = req->rl_sendctx->sc_wr.num_sge; __entry->signaled = req->rl_sendctx->sc_wr.send_flags & IB_SEND_SIGNALED; __entry->status = status; ), TP_printk("req=%p, %d SGEs%s, status=%d", __entry->req, __entry->num_sge, (__entry->signaled ? ", signaled" : ""), __entry->status ) ); TRACE_EVENT(xprtrdma_post_recv, TP_PROTO( const struct rpcrdma_rep *rep, int status ), TP_ARGS(rep, status), TP_STRUCT__entry( __field(const void *, rep) __field(int, status) ), TP_fast_assign( __entry->rep = rep; __entry->status = status; ), TP_printk("rep=%p status=%d", __entry->rep, __entry->status ) ); /** ** Completion events **/ TRACE_EVENT(xprtrdma_wc_send, TP_PROTO( const struct rpcrdma_sendctx *sc, const struct ib_wc *wc ), TP_ARGS(sc, wc), TP_STRUCT__entry( __field(const void *, req) __field(unsigned int, unmap_count) __field(unsigned int, status) __field(unsigned int, vendor_err) ), TP_fast_assign( __entry->req = sc->sc_req; __entry->unmap_count = sc->sc_unmap_count; __entry->status = wc->status; __entry->vendor_err = __entry->status ? wc->vendor_err : 0; ), TP_printk("req=%p, unmapped %u pages: %s (%u/0x%x)", __entry->req, __entry->unmap_count, rdma_show_wc_status(__entry->status), __entry->status, __entry->vendor_err ) ); TRACE_EVENT(xprtrdma_wc_receive, TP_PROTO( const struct rpcrdma_rep *rep, const struct ib_wc *wc ), TP_ARGS(rep, wc), TP_STRUCT__entry( __field(const void *, rep) __field(unsigned int, byte_len) __field(unsigned int, status) __field(unsigned int, vendor_err) ), TP_fast_assign( __entry->rep = rep; __entry->byte_len = wc->byte_len; __entry->status = wc->status; __entry->vendor_err = __entry->status ? wc->vendor_err : 0; ), TP_printk("rep=%p, %u bytes: %s (%u/0x%x)", __entry->rep, __entry->byte_len, rdma_show_wc_status(__entry->status), __entry->status, __entry->vendor_err ) ); DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_fastreg); DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li); DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li_wake); DEFINE_MR_EVENT(xprtrdma_localinv); DEFINE_MR_EVENT(xprtrdma_dma_unmap); DEFINE_MR_EVENT(xprtrdma_remoteinv); DEFINE_MR_EVENT(xprtrdma_recover_mr); /** ** Reply events **/ TRACE_EVENT(xprtrdma_reply, TP_PROTO( const struct rpc_task *task, const struct rpcrdma_rep *rep, const struct rpcrdma_req *req, unsigned int credits ), TP_ARGS(task, rep, req, credits), TP_STRUCT__entry( __field(unsigned int, task_id) __field(unsigned int, client_id) __field(const void *, rep) __field(const void *, req) __field(u32, xid) __field(unsigned int, credits) ), TP_fast_assign( __entry->task_id = task->tk_pid; __entry->client_id = task->tk_client->cl_clid; __entry->rep = rep; __entry->req = req; __entry->xid = be32_to_cpu(rep->rr_xid); __entry->credits = credits; ), TP_printk("task:%u@%u xid=0x%08x, %u credits, rep=%p -> req=%p", __entry->task_id, __entry->client_id, __entry->xid, __entry->credits, __entry->rep, __entry->req ) ); TRACE_EVENT(xprtrdma_defer_cmp, TP_PROTO( const struct rpcrdma_rep *rep ), TP_ARGS(rep), TP_STRUCT__entry( __field(unsigned int, task_id) __field(unsigned int, client_id) __field(const void *, rep) __field(u32, xid) ), TP_fast_assign( __entry->task_id = rep->rr_rqst->rq_task->tk_pid; __entry->client_id = rep->rr_rqst->rq_task->tk_client->cl_clid; __entry->rep = rep; __entry->xid = be32_to_cpu(rep->rr_xid); ), TP_printk("task:%u@%u xid=0x%08x rep=%p", __entry->task_id, __entry->client_id, __entry->xid, __entry->rep ) ); DEFINE_REPLY_EVENT(xprtrdma_reply_vers); DEFINE_REPLY_EVENT(xprtrdma_reply_rqst); DEFINE_REPLY_EVENT(xprtrdma_reply_short); DEFINE_REPLY_EVENT(xprtrdma_reply_hdr); TRACE_EVENT(xprtrdma_fixup, TP_PROTO( const struct rpc_rqst *rqst, int len, int hdrlen ), TP_ARGS(rqst, len, hdrlen), TP_STRUCT__entry( __field(unsigned int, task_id) __field(unsigned int, client_id) __field(const void *, base) __field(int, len) __field(int, hdrlen) ), TP_fast_assign( __entry->task_id = rqst->rq_task->tk_pid; __entry->client_id = rqst->rq_task->tk_client->cl_clid; __entry->base = rqst->rq_rcv_buf.head[0].iov_base; __entry->len = len; __entry->hdrlen = hdrlen; ), TP_printk("task:%u@%u base=%p len=%d hdrlen=%d", __entry->task_id, __entry->client_id, __entry->base, __entry->len, __entry->hdrlen ) ); TRACE_EVENT(xprtrdma_fixup_pg, TP_PROTO( const struct rpc_rqst *rqst, int pageno, const void *pos, int len, int curlen ), TP_ARGS(rqst, pageno, pos, len, curlen), TP_STRUCT__entry( __field(unsigned int, task_id) __field(unsigned int, client_id) __field(const void *, pos) __field(int, pageno) __field(int, len) __field(int, curlen) ), TP_fast_assign( __entry->task_id = rqst->rq_task->tk_pid; __entry->client_id = rqst->rq_task->tk_client->cl_clid; __entry->pos = pos; __entry->pageno = pageno; __entry->len = len; __entry->curlen = curlen; ), TP_printk("task:%u@%u pageno=%d pos=%p len=%d curlen=%d", __entry->task_id, __entry->client_id, __entry->pageno, __entry->pos, __entry->len, __entry->curlen ) ); TRACE_EVENT(xprtrdma_decode_seg, TP_PROTO( u32 handle, u32 length, u64 offset ), TP_ARGS(handle, length, offset), TP_STRUCT__entry( __field(u32, handle) __field(u32, length) __field(u64, offset) ), TP_fast_assign( __entry->handle = handle; __entry->length = length; __entry->offset = offset; ), TP_printk("%u@0x%016llx:0x%08x", __entry->length, (unsigned long long)__entry->offset, __entry->handle ) ); /** ** Allocation/release of rpcrdma_reqs and rpcrdma_reps **/ TRACE_EVENT(xprtrdma_allocate, TP_PROTO( const struct rpc_task *task, const struct rpcrdma_req *req ), TP_ARGS(task, req), TP_STRUCT__entry( __field(unsigned int, task_id) __field(unsigned int, client_id) __field(const void *, req) __field(const void *, rep) __field(size_t, callsize) __field(size_t, rcvsize) ), TP_fast_assign( __entry->task_id = task->tk_pid; __entry->client_id = task->tk_client->cl_clid; __entry->req = req; __entry->rep = req ? req->rl_reply : NULL; __entry->callsize = task->tk_rqstp->rq_callsize; __entry->rcvsize = task->tk_rqstp->rq_rcvsize; ), TP_printk("task:%u@%u req=%p rep=%p (%zu, %zu)", __entry->task_id, __entry->client_id, __entry->req, __entry->rep, __entry->callsize, __entry->rcvsize ) ); TRACE_EVENT(xprtrdma_rpc_done, TP_PROTO( const struct rpc_task *task, const struct rpcrdma_req *req ), TP_ARGS(task, req), TP_STRUCT__entry( __field(unsigned int, task_id) __field(unsigned int, client_id) __field(const void *, req) __field(const void *, rep) ), TP_fast_assign( __entry->task_id = task->tk_pid; __entry->client_id = task->tk_client->cl_clid; __entry->req = req; __entry->rep = req->rl_reply; ), TP_printk("task:%u@%u req=%p rep=%p", __entry->task_id, __entry->client_id, __entry->req, __entry->rep ) ); DEFINE_RXPRT_EVENT(xprtrdma_noreps); /** ** Callback events **/ TRACE_EVENT(xprtrdma_cb_setup, TP_PROTO( const struct rpcrdma_xprt *r_xprt, unsigned int reqs ), TP_ARGS(r_xprt, reqs), TP_STRUCT__entry( __field(const void *, r_xprt) __field(unsigned int, reqs) __string(addr, rpcrdma_addrstr(r_xprt)) __string(port, rpcrdma_portstr(r_xprt)) ), TP_fast_assign( __entry->r_xprt = r_xprt; __entry->reqs = reqs; __assign_str(addr, rpcrdma_addrstr(r_xprt)); __assign_str(port, rpcrdma_portstr(r_xprt)); ), TP_printk("peer=[%s]:%s r_xprt=%p: %u reqs", __get_str(addr), __get_str(port), __entry->r_xprt, __entry->reqs ) ); DEFINE_CB_EVENT(xprtrdma_cb_call); DEFINE_CB_EVENT(xprtrdma_cb_reply); #endif /* _TRACE_RPCRDMA_H */ #include