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 541c443effSChuck Lever DECLARE_EVENT_CLASS(xprtrdma_rxprt, 551c443effSChuck Lever TP_PROTO( 561c443effSChuck Lever const struct rpcrdma_xprt *r_xprt 571c443effSChuck Lever ), 581c443effSChuck Lever 591c443effSChuck Lever TP_ARGS(r_xprt), 601c443effSChuck Lever 611c443effSChuck Lever TP_STRUCT__entry( 621c443effSChuck Lever __field(const void *, r_xprt) 631c443effSChuck Lever __string(addr, rpcrdma_addrstr(r_xprt)) 641c443effSChuck Lever __string(port, rpcrdma_portstr(r_xprt)) 651c443effSChuck Lever ), 661c443effSChuck Lever 671c443effSChuck Lever TP_fast_assign( 681c443effSChuck Lever __entry->r_xprt = r_xprt; 691c443effSChuck Lever __assign_str(addr, rpcrdma_addrstr(r_xprt)); 701c443effSChuck Lever __assign_str(port, rpcrdma_portstr(r_xprt)); 711c443effSChuck Lever ), 721c443effSChuck Lever 731c443effSChuck Lever TP_printk("peer=[%s]:%s r_xprt=%p", 741c443effSChuck Lever __get_str(addr), __get_str(port), __entry->r_xprt 751c443effSChuck Lever ) 761c443effSChuck Lever ); 771c443effSChuck Lever 781c443effSChuck Lever #define DEFINE_RXPRT_EVENT(name) \ 791c443effSChuck Lever DEFINE_EVENT(xprtrdma_rxprt, name, \ 801c443effSChuck Lever TP_PROTO( \ 811c443effSChuck Lever const struct rpcrdma_xprt *r_xprt \ 821c443effSChuck Lever ), \ 831c443effSChuck Lever TP_ARGS(r_xprt)) 841c443effSChuck Lever 8558f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_rdch_event, 8658f10ad4SChuck Lever TP_PROTO( 8758f10ad4SChuck Lever const struct rpc_task *task, 8858f10ad4SChuck Lever unsigned int pos, 8958f10ad4SChuck Lever struct rpcrdma_mr *mr, 9058f10ad4SChuck Lever int nsegs 9158f10ad4SChuck Lever ), 9258f10ad4SChuck Lever 9358f10ad4SChuck Lever TP_ARGS(task, pos, mr, nsegs), 9458f10ad4SChuck Lever 9558f10ad4SChuck Lever TP_STRUCT__entry( 9658f10ad4SChuck Lever __field(unsigned int, task_id) 9758f10ad4SChuck Lever __field(unsigned int, client_id) 9858f10ad4SChuck Lever __field(const void *, mr) 9958f10ad4SChuck Lever __field(unsigned int, pos) 10058f10ad4SChuck Lever __field(int, nents) 10158f10ad4SChuck Lever __field(u32, handle) 10258f10ad4SChuck Lever __field(u32, length) 10358f10ad4SChuck Lever __field(u64, offset) 10458f10ad4SChuck Lever __field(int, nsegs) 10558f10ad4SChuck Lever ), 10658f10ad4SChuck Lever 10758f10ad4SChuck Lever TP_fast_assign( 10858f10ad4SChuck Lever __entry->task_id = task->tk_pid; 10958f10ad4SChuck Lever __entry->client_id = task->tk_client->cl_clid; 11058f10ad4SChuck Lever __entry->mr = mr; 11158f10ad4SChuck Lever __entry->pos = pos; 11258f10ad4SChuck Lever __entry->nents = mr->mr_nents; 11358f10ad4SChuck Lever __entry->handle = mr->mr_handle; 11458f10ad4SChuck Lever __entry->length = mr->mr_length; 11558f10ad4SChuck Lever __entry->offset = mr->mr_offset; 11658f10ad4SChuck Lever __entry->nsegs = nsegs; 11758f10ad4SChuck Lever ), 11858f10ad4SChuck Lever 11958f10ad4SChuck Lever TP_printk("task:%u@%u mr=%p pos=%u %u@0x%016llx:0x%08x (%s)", 12058f10ad4SChuck Lever __entry->task_id, __entry->client_id, __entry->mr, 12158f10ad4SChuck Lever __entry->pos, __entry->length, 12258f10ad4SChuck Lever (unsigned long long)__entry->offset, __entry->handle, 12358f10ad4SChuck Lever __entry->nents < __entry->nsegs ? "more" : "last" 12458f10ad4SChuck Lever ) 12558f10ad4SChuck Lever ); 12658f10ad4SChuck Lever 12758f10ad4SChuck Lever #define DEFINE_RDCH_EVENT(name) \ 12858f10ad4SChuck Lever DEFINE_EVENT(xprtrdma_rdch_event, name, \ 12958f10ad4SChuck Lever TP_PROTO( \ 13058f10ad4SChuck Lever const struct rpc_task *task, \ 13158f10ad4SChuck Lever unsigned int pos, \ 13258f10ad4SChuck Lever struct rpcrdma_mr *mr, \ 13358f10ad4SChuck Lever int nsegs \ 13458f10ad4SChuck Lever ), \ 13558f10ad4SChuck Lever TP_ARGS(task, pos, mr, nsegs)) 13658f10ad4SChuck Lever 13758f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_wrch_event, 13858f10ad4SChuck Lever TP_PROTO( 13958f10ad4SChuck Lever const struct rpc_task *task, 14058f10ad4SChuck Lever struct rpcrdma_mr *mr, 14158f10ad4SChuck Lever int nsegs 14258f10ad4SChuck Lever ), 14358f10ad4SChuck Lever 14458f10ad4SChuck Lever TP_ARGS(task, mr, nsegs), 14558f10ad4SChuck Lever 14658f10ad4SChuck Lever TP_STRUCT__entry( 14758f10ad4SChuck Lever __field(unsigned int, task_id) 14858f10ad4SChuck Lever __field(unsigned int, client_id) 14958f10ad4SChuck Lever __field(const void *, mr) 15058f10ad4SChuck Lever __field(int, nents) 15158f10ad4SChuck Lever __field(u32, handle) 15258f10ad4SChuck Lever __field(u32, length) 15358f10ad4SChuck Lever __field(u64, offset) 15458f10ad4SChuck Lever __field(int, nsegs) 15558f10ad4SChuck Lever ), 15658f10ad4SChuck Lever 15758f10ad4SChuck Lever TP_fast_assign( 15858f10ad4SChuck Lever __entry->task_id = task->tk_pid; 15958f10ad4SChuck Lever __entry->client_id = task->tk_client->cl_clid; 16058f10ad4SChuck Lever __entry->mr = mr; 16158f10ad4SChuck Lever __entry->nents = mr->mr_nents; 16258f10ad4SChuck Lever __entry->handle = mr->mr_handle; 16358f10ad4SChuck Lever __entry->length = mr->mr_length; 16458f10ad4SChuck Lever __entry->offset = mr->mr_offset; 16558f10ad4SChuck Lever __entry->nsegs = nsegs; 16658f10ad4SChuck Lever ), 16758f10ad4SChuck Lever 16858f10ad4SChuck Lever TP_printk("task:%u@%u mr=%p %u@0x%016llx:0x%08x (%s)", 16958f10ad4SChuck Lever __entry->task_id, __entry->client_id, __entry->mr, 17058f10ad4SChuck Lever __entry->length, (unsigned long long)__entry->offset, 17158f10ad4SChuck Lever __entry->handle, 17258f10ad4SChuck Lever __entry->nents < __entry->nsegs ? "more" : "last" 17358f10ad4SChuck Lever ) 17458f10ad4SChuck Lever ); 17558f10ad4SChuck Lever 17658f10ad4SChuck Lever #define DEFINE_WRCH_EVENT(name) \ 17758f10ad4SChuck Lever DEFINE_EVENT(xprtrdma_wrch_event, name, \ 17858f10ad4SChuck Lever TP_PROTO( \ 17958f10ad4SChuck Lever const struct rpc_task *task, \ 18058f10ad4SChuck Lever struct rpcrdma_mr *mr, \ 18158f10ad4SChuck Lever int nsegs \ 18258f10ad4SChuck Lever ), \ 18358f10ad4SChuck Lever TP_ARGS(task, mr, nsegs)) 18458f10ad4SChuck Lever 18558f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_IS_INVALID); 18658f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_IS_VALID); 18758f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_FLUSHED_FR); 18858f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_FLUSHED_LI); 18958f10ad4SChuck Lever 19058f10ad4SChuck Lever #define xprtrdma_show_frwr_state(x) \ 19158f10ad4SChuck Lever __print_symbolic(x, \ 19258f10ad4SChuck Lever { FRWR_IS_INVALID, "INVALID" }, \ 19358f10ad4SChuck Lever { FRWR_IS_VALID, "VALID" }, \ 19458f10ad4SChuck Lever { FRWR_FLUSHED_FR, "FLUSHED_FR" }, \ 19558f10ad4SChuck Lever { FRWR_FLUSHED_LI, "FLUSHED_LI" }) 19658f10ad4SChuck Lever 19758f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_frwr_done, 19858f10ad4SChuck Lever TP_PROTO( 19958f10ad4SChuck Lever const struct ib_wc *wc, 20058f10ad4SChuck Lever const struct rpcrdma_frwr *frwr 20158f10ad4SChuck Lever ), 20258f10ad4SChuck Lever 20358f10ad4SChuck Lever TP_ARGS(wc, frwr), 20458f10ad4SChuck Lever 20558f10ad4SChuck Lever TP_STRUCT__entry( 20658f10ad4SChuck Lever __field(const void *, mr) 20758f10ad4SChuck Lever __field(unsigned int, state) 20858f10ad4SChuck Lever __field(unsigned int, status) 20958f10ad4SChuck Lever __field(unsigned int, vendor_err) 21058f10ad4SChuck Lever ), 21158f10ad4SChuck Lever 21258f10ad4SChuck Lever TP_fast_assign( 21358f10ad4SChuck Lever __entry->mr = container_of(frwr, struct rpcrdma_mr, frwr); 21458f10ad4SChuck Lever __entry->state = frwr->fr_state; 21558f10ad4SChuck Lever __entry->status = wc->status; 21658f10ad4SChuck Lever __entry->vendor_err = __entry->status ? wc->vendor_err : 0; 21758f10ad4SChuck Lever ), 21858f10ad4SChuck Lever 21958f10ad4SChuck Lever TP_printk( 22058f10ad4SChuck Lever "mr=%p state=%s: %s (%u/0x%x)", 22158f10ad4SChuck Lever __entry->mr, xprtrdma_show_frwr_state(__entry->state), 22258f10ad4SChuck Lever rdma_show_wc_status(__entry->status), 22358f10ad4SChuck Lever __entry->status, __entry->vendor_err 22458f10ad4SChuck Lever ) 22558f10ad4SChuck Lever ); 22658f10ad4SChuck Lever 22758f10ad4SChuck Lever #define DEFINE_FRWR_DONE_EVENT(name) \ 22858f10ad4SChuck Lever DEFINE_EVENT(xprtrdma_frwr_done, name, \ 22958f10ad4SChuck Lever TP_PROTO( \ 23058f10ad4SChuck Lever const struct ib_wc *wc, \ 23158f10ad4SChuck Lever const struct rpcrdma_frwr *frwr \ 23258f10ad4SChuck Lever ), \ 23358f10ad4SChuck Lever TP_ARGS(wc, frwr)) 23458f10ad4SChuck Lever 2352937fedeSChuck Lever DECLARE_EVENT_CLASS(xprtrdma_mr, 2362937fedeSChuck Lever TP_PROTO( 2372937fedeSChuck Lever const struct rpcrdma_mr *mr 2382937fedeSChuck Lever ), 2392937fedeSChuck Lever 2402937fedeSChuck Lever TP_ARGS(mr), 2412937fedeSChuck Lever 2422937fedeSChuck Lever TP_STRUCT__entry( 2432937fedeSChuck Lever __field(const void *, mr) 2442937fedeSChuck Lever __field(u32, handle) 2452937fedeSChuck Lever __field(u32, length) 2462937fedeSChuck Lever __field(u64, offset) 2472937fedeSChuck Lever ), 2482937fedeSChuck Lever 2492937fedeSChuck Lever TP_fast_assign( 2502937fedeSChuck Lever __entry->mr = mr; 2512937fedeSChuck Lever __entry->handle = mr->mr_handle; 2522937fedeSChuck Lever __entry->length = mr->mr_length; 2532937fedeSChuck Lever __entry->offset = mr->mr_offset; 2542937fedeSChuck Lever ), 2552937fedeSChuck Lever 2562937fedeSChuck Lever TP_printk("mr=%p %u@0x%016llx:0x%08x", 2572937fedeSChuck Lever __entry->mr, __entry->length, 2582937fedeSChuck Lever (unsigned long long)__entry->offset, 2592937fedeSChuck Lever __entry->handle 2602937fedeSChuck Lever ) 2612937fedeSChuck Lever ); 2622937fedeSChuck Lever 2632937fedeSChuck Lever #define DEFINE_MR_EVENT(name) \ 2642937fedeSChuck Lever DEFINE_EVENT(xprtrdma_mr, name, \ 2652937fedeSChuck Lever TP_PROTO( \ 2662937fedeSChuck Lever const struct rpcrdma_mr *mr \ 2672937fedeSChuck Lever ), \ 2682937fedeSChuck Lever TP_ARGS(mr)) 2692937fedeSChuck Lever 270b4a7f91cSChuck Lever /** 271b4744e00SChuck Lever ** Connection events 272b4744e00SChuck Lever **/ 273b4744e00SChuck Lever 274b4744e00SChuck Lever TRACE_EVENT(xprtrdma_conn_upcall, 275b4744e00SChuck Lever TP_PROTO( 276b4744e00SChuck Lever const struct rpcrdma_xprt *r_xprt, 277b4744e00SChuck Lever struct rdma_cm_event *event 278b4744e00SChuck Lever ), 279b4744e00SChuck Lever 280b4744e00SChuck Lever TP_ARGS(r_xprt, event), 281b4744e00SChuck Lever 282b4744e00SChuck Lever TP_STRUCT__entry( 283b4744e00SChuck Lever __field(const void *, r_xprt) 284b4744e00SChuck Lever __field(unsigned int, event) 285b4744e00SChuck Lever __field(int, status) 286b4744e00SChuck Lever __string(addr, rpcrdma_addrstr(r_xprt)) 287b4744e00SChuck Lever __string(port, rpcrdma_portstr(r_xprt)) 288b4744e00SChuck Lever ), 289b4744e00SChuck Lever 290b4744e00SChuck Lever TP_fast_assign( 291b4744e00SChuck Lever __entry->r_xprt = r_xprt; 292b4744e00SChuck Lever __entry->event = event->event; 293b4744e00SChuck Lever __entry->status = event->status; 294b4744e00SChuck Lever __assign_str(addr, rpcrdma_addrstr(r_xprt)); 295b4744e00SChuck Lever __assign_str(port, rpcrdma_portstr(r_xprt)); 296b4744e00SChuck Lever ), 297b4744e00SChuck Lever 298b4744e00SChuck Lever TP_printk("peer=[%s]:%s r_xprt=%p: %s (%u/%d)", 299b4744e00SChuck Lever __get_str(addr), __get_str(port), 300b4744e00SChuck Lever __entry->r_xprt, rdma_show_cm_event(__entry->event), 301b4744e00SChuck Lever __entry->event, __entry->status 302b4744e00SChuck Lever ) 303b4744e00SChuck Lever ); 304b4744e00SChuck Lever 305b4744e00SChuck Lever TRACE_EVENT(xprtrdma_disconnect, 306b4744e00SChuck Lever TP_PROTO( 307b4744e00SChuck Lever const struct rpcrdma_xprt *r_xprt, 308b4744e00SChuck Lever int status 309b4744e00SChuck Lever ), 310b4744e00SChuck Lever 311b4744e00SChuck Lever TP_ARGS(r_xprt, status), 312b4744e00SChuck Lever 313b4744e00SChuck Lever TP_STRUCT__entry( 314b4744e00SChuck Lever __field(const void *, r_xprt) 315b4744e00SChuck Lever __field(int, status) 316b4744e00SChuck Lever __field(int, connected) 317b4744e00SChuck Lever __string(addr, rpcrdma_addrstr(r_xprt)) 318b4744e00SChuck Lever __string(port, rpcrdma_portstr(r_xprt)) 319b4744e00SChuck Lever ), 320b4744e00SChuck Lever 321b4744e00SChuck Lever TP_fast_assign( 322b4744e00SChuck Lever __entry->r_xprt = r_xprt; 323b4744e00SChuck Lever __entry->status = status; 324b4744e00SChuck Lever __entry->connected = r_xprt->rx_ep.rep_connected; 325b4744e00SChuck Lever __assign_str(addr, rpcrdma_addrstr(r_xprt)); 326b4744e00SChuck Lever __assign_str(port, rpcrdma_portstr(r_xprt)); 327b4744e00SChuck Lever ), 328b4744e00SChuck Lever 329b4744e00SChuck Lever TP_printk("peer=[%s]:%s r_xprt=%p: status=%d %sconnected", 330b4744e00SChuck Lever __get_str(addr), __get_str(port), 331b4744e00SChuck Lever __entry->r_xprt, __entry->status, 332b4744e00SChuck Lever __entry->connected == 1 ? "still " : "dis" 333b4744e00SChuck Lever ) 334b4744e00SChuck Lever ); 335b4744e00SChuck Lever 336b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_conn_start); 337b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_conn_tout); 338b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_create); 339b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_destroy); 340b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_remove); 341b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_reinsert); 342b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_reconnect); 343b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_inject_dsc); 344b4744e00SChuck Lever 345b4744e00SChuck Lever /** 346ab03eff5SChuck Lever ** Call events 347ab03eff5SChuck Lever **/ 348ab03eff5SChuck Lever 3491c443effSChuck Lever TRACE_EVENT(xprtrdma_createmrs, 3501c443effSChuck Lever TP_PROTO( 3511c443effSChuck Lever const struct rpcrdma_xprt *r_xprt, 3521c443effSChuck Lever unsigned int count 3531c443effSChuck Lever ), 3541c443effSChuck Lever 3551c443effSChuck Lever TP_ARGS(r_xprt, count), 3561c443effSChuck Lever 3571c443effSChuck Lever TP_STRUCT__entry( 3581c443effSChuck Lever __field(const void *, r_xprt) 3591c443effSChuck Lever __field(unsigned int, count) 3601c443effSChuck Lever ), 3611c443effSChuck Lever 3621c443effSChuck Lever TP_fast_assign( 3631c443effSChuck Lever __entry->r_xprt = r_xprt; 3641c443effSChuck Lever __entry->count = count; 3651c443effSChuck Lever ), 3661c443effSChuck Lever 3671c443effSChuck Lever TP_printk("r_xprt=%p: created %u MRs", 3681c443effSChuck Lever __entry->r_xprt, __entry->count 3691c443effSChuck Lever ) 3701c443effSChuck Lever ); 3711c443effSChuck Lever 3721c443effSChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_nomrs); 3731c443effSChuck Lever 37458f10ad4SChuck Lever DEFINE_RDCH_EVENT(xprtrdma_read_chunk); 37558f10ad4SChuck Lever DEFINE_WRCH_EVENT(xprtrdma_write_chunk); 37658f10ad4SChuck Lever DEFINE_WRCH_EVENT(xprtrdma_reply_chunk); 37758f10ad4SChuck Lever 378ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_noch); 379ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_readch); 380ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_areadch); 381ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_writech); 382ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_replych); 383ab03eff5SChuck Lever 384ab03eff5SChuck Lever #define xprtrdma_show_chunktype(x) \ 385ab03eff5SChuck Lever __print_symbolic(x, \ 386ab03eff5SChuck Lever { rpcrdma_noch, "inline" }, \ 387ab03eff5SChuck Lever { rpcrdma_readch, "read list" }, \ 388ab03eff5SChuck Lever { rpcrdma_areadch, "*read list" }, \ 389ab03eff5SChuck Lever { rpcrdma_writech, "write list" }, \ 390ab03eff5SChuck Lever { rpcrdma_replych, "reply chunk" }) 391ab03eff5SChuck Lever 392ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_marshal, 393ab03eff5SChuck Lever TP_PROTO( 394ab03eff5SChuck Lever const struct rpc_rqst *rqst, 395ab03eff5SChuck Lever unsigned int hdrlen, 396ab03eff5SChuck Lever unsigned int rtype, 397ab03eff5SChuck Lever unsigned int wtype 398ab03eff5SChuck Lever ), 399ab03eff5SChuck Lever 400ab03eff5SChuck Lever TP_ARGS(rqst, hdrlen, rtype, wtype), 401ab03eff5SChuck Lever 402ab03eff5SChuck Lever TP_STRUCT__entry( 403ab03eff5SChuck Lever __field(unsigned int, task_id) 404ab03eff5SChuck Lever __field(unsigned int, client_id) 405ab03eff5SChuck Lever __field(u32, xid) 406ab03eff5SChuck Lever __field(unsigned int, hdrlen) 407ab03eff5SChuck Lever __field(unsigned int, headlen) 408ab03eff5SChuck Lever __field(unsigned int, pagelen) 409ab03eff5SChuck Lever __field(unsigned int, taillen) 410ab03eff5SChuck Lever __field(unsigned int, rtype) 411ab03eff5SChuck Lever __field(unsigned int, wtype) 412ab03eff5SChuck Lever ), 413ab03eff5SChuck Lever 414ab03eff5SChuck Lever TP_fast_assign( 415ab03eff5SChuck Lever __entry->task_id = rqst->rq_task->tk_pid; 416ab03eff5SChuck Lever __entry->client_id = rqst->rq_task->tk_client->cl_clid; 417ab03eff5SChuck Lever __entry->xid = be32_to_cpu(rqst->rq_xid); 418ab03eff5SChuck Lever __entry->hdrlen = hdrlen; 419ab03eff5SChuck Lever __entry->headlen = rqst->rq_snd_buf.head[0].iov_len; 420ab03eff5SChuck Lever __entry->pagelen = rqst->rq_snd_buf.page_len; 421ab03eff5SChuck Lever __entry->taillen = rqst->rq_snd_buf.tail[0].iov_len; 422ab03eff5SChuck Lever __entry->rtype = rtype; 423ab03eff5SChuck Lever __entry->wtype = wtype; 424ab03eff5SChuck Lever ), 425ab03eff5SChuck Lever 426ab03eff5SChuck Lever TP_printk("task:%u@%u xid=0x%08x: hdr=%u xdr=%u/%u/%u %s/%s", 427ab03eff5SChuck Lever __entry->task_id, __entry->client_id, __entry->xid, 428ab03eff5SChuck Lever __entry->hdrlen, 429ab03eff5SChuck Lever __entry->headlen, __entry->pagelen, __entry->taillen, 430ab03eff5SChuck Lever xprtrdma_show_chunktype(__entry->rtype), 431ab03eff5SChuck Lever xprtrdma_show_chunktype(__entry->wtype) 432ab03eff5SChuck Lever ) 433ab03eff5SChuck Lever ); 434ab03eff5SChuck Lever 435ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_post_send, 436ab03eff5SChuck Lever TP_PROTO( 437ab03eff5SChuck Lever const struct rpcrdma_req *req, 438ab03eff5SChuck Lever int status 439ab03eff5SChuck Lever ), 440ab03eff5SChuck Lever 441ab03eff5SChuck Lever TP_ARGS(req, status), 442ab03eff5SChuck Lever 443ab03eff5SChuck Lever TP_STRUCT__entry( 444ab03eff5SChuck Lever __field(const void *, req) 445ab03eff5SChuck Lever __field(int, num_sge) 446ab03eff5SChuck Lever __field(bool, signaled) 447ab03eff5SChuck Lever __field(int, status) 448ab03eff5SChuck Lever ), 449ab03eff5SChuck Lever 450ab03eff5SChuck Lever TP_fast_assign( 451ab03eff5SChuck Lever __entry->req = req; 452ab03eff5SChuck Lever __entry->num_sge = req->rl_sendctx->sc_wr.num_sge; 453ab03eff5SChuck Lever __entry->signaled = req->rl_sendctx->sc_wr.send_flags & 454ab03eff5SChuck Lever IB_SEND_SIGNALED; 455ab03eff5SChuck Lever __entry->status = status; 456ab03eff5SChuck Lever ), 457ab03eff5SChuck Lever 458ab03eff5SChuck Lever TP_printk("req=%p, %d SGEs%s, status=%d", 459ab03eff5SChuck Lever __entry->req, __entry->num_sge, 460ab03eff5SChuck Lever (__entry->signaled ? ", signaled" : ""), 461ab03eff5SChuck Lever __entry->status 462ab03eff5SChuck Lever ) 463ab03eff5SChuck Lever ); 464ab03eff5SChuck Lever 465b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_post_recv, 466b4a7f91cSChuck Lever TP_PROTO( 467b4a7f91cSChuck Lever const struct rpcrdma_rep *rep, 468b4a7f91cSChuck Lever int status 469b4a7f91cSChuck Lever ), 470b4a7f91cSChuck Lever 471b4a7f91cSChuck Lever TP_ARGS(rep, status), 472b4a7f91cSChuck Lever 473b4a7f91cSChuck Lever TP_STRUCT__entry( 474b4a7f91cSChuck Lever __field(const void *, rep) 475b4a7f91cSChuck Lever __field(int, status) 476b4a7f91cSChuck Lever ), 477b4a7f91cSChuck Lever 478b4a7f91cSChuck Lever TP_fast_assign( 479b4a7f91cSChuck Lever __entry->rep = rep; 480b4a7f91cSChuck Lever __entry->status = status; 481b4a7f91cSChuck Lever ), 482b4a7f91cSChuck Lever 483b4a7f91cSChuck Lever TP_printk("rep=%p status=%d", 484b4a7f91cSChuck Lever __entry->rep, __entry->status 485b4a7f91cSChuck Lever ) 486b4a7f91cSChuck Lever ); 487b4a7f91cSChuck Lever 488ab03eff5SChuck Lever /** 489ab03eff5SChuck Lever ** Completion events 490ab03eff5SChuck Lever **/ 491ab03eff5SChuck Lever 492ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_wc_send, 493ab03eff5SChuck Lever TP_PROTO( 494ab03eff5SChuck Lever const struct rpcrdma_sendctx *sc, 495ab03eff5SChuck Lever const struct ib_wc *wc 496ab03eff5SChuck Lever ), 497ab03eff5SChuck Lever 498ab03eff5SChuck Lever TP_ARGS(sc, wc), 499ab03eff5SChuck Lever 500ab03eff5SChuck Lever TP_STRUCT__entry( 501ab03eff5SChuck Lever __field(const void *, req) 502ab03eff5SChuck Lever __field(unsigned int, unmap_count) 503ab03eff5SChuck Lever __field(unsigned int, status) 504ab03eff5SChuck Lever __field(unsigned int, vendor_err) 505ab03eff5SChuck Lever ), 506ab03eff5SChuck Lever 507ab03eff5SChuck Lever TP_fast_assign( 508ab03eff5SChuck Lever __entry->req = sc->sc_req; 509ab03eff5SChuck Lever __entry->unmap_count = sc->sc_unmap_count; 510ab03eff5SChuck Lever __entry->status = wc->status; 511ab03eff5SChuck Lever __entry->vendor_err = __entry->status ? wc->vendor_err : 0; 512ab03eff5SChuck Lever ), 513ab03eff5SChuck Lever 514ab03eff5SChuck Lever TP_printk("req=%p, unmapped %u pages: %s (%u/0x%x)", 515ab03eff5SChuck Lever __entry->req, __entry->unmap_count, 516ab03eff5SChuck Lever rdma_show_wc_status(__entry->status), 517ab03eff5SChuck Lever __entry->status, __entry->vendor_err 518ab03eff5SChuck Lever ) 519ab03eff5SChuck Lever ); 520ab03eff5SChuck Lever 521b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_wc_receive, 522b4a7f91cSChuck Lever TP_PROTO( 523b4a7f91cSChuck Lever const struct rpcrdma_rep *rep, 524b4a7f91cSChuck Lever const struct ib_wc *wc 525b4a7f91cSChuck Lever ), 526b4a7f91cSChuck Lever 527b4a7f91cSChuck Lever TP_ARGS(rep, wc), 528b4a7f91cSChuck Lever 529b4a7f91cSChuck Lever TP_STRUCT__entry( 530b4a7f91cSChuck Lever __field(const void *, rep) 531b4a7f91cSChuck Lever __field(unsigned int, byte_len) 532b4a7f91cSChuck Lever __field(unsigned int, status) 533b4a7f91cSChuck Lever __field(unsigned int, vendor_err) 534b4a7f91cSChuck Lever ), 535b4a7f91cSChuck Lever 536b4a7f91cSChuck Lever TP_fast_assign( 537b4a7f91cSChuck Lever __entry->rep = rep; 538b4a7f91cSChuck Lever __entry->byte_len = wc->byte_len; 539b4a7f91cSChuck Lever __entry->status = wc->status; 540b4a7f91cSChuck Lever __entry->vendor_err = __entry->status ? wc->vendor_err : 0; 541b4a7f91cSChuck Lever ), 542b4a7f91cSChuck Lever 543b4a7f91cSChuck Lever TP_printk("rep=%p, %u bytes: %s (%u/0x%x)", 544b4a7f91cSChuck Lever __entry->rep, __entry->byte_len, 545b4a7f91cSChuck Lever rdma_show_wc_status(__entry->status), 546b4a7f91cSChuck Lever __entry->status, __entry->vendor_err 547b4a7f91cSChuck Lever ) 548b4a7f91cSChuck Lever ); 549b4a7f91cSChuck Lever 55058f10ad4SChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_fastreg); 5512937fedeSChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li); 5522937fedeSChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li_wake); 5532937fedeSChuck Lever 5542937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_localinv); 5552937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_dma_unmap); 5562937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_remoteinv); 5571c443effSChuck Lever DEFINE_MR_EVENT(xprtrdma_recover_mr); 55858f10ad4SChuck Lever 559b4a7f91cSChuck Lever /** 560b4a7f91cSChuck Lever ** Reply events 561b4a7f91cSChuck Lever **/ 562b4a7f91cSChuck Lever 563b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_reply, 564b4a7f91cSChuck Lever TP_PROTO( 565b4a7f91cSChuck Lever const struct rpc_task *task, 566b4a7f91cSChuck Lever const struct rpcrdma_rep *rep, 567b4a7f91cSChuck Lever const struct rpcrdma_req *req, 568b4a7f91cSChuck Lever unsigned int credits 569b4a7f91cSChuck Lever ), 570b4a7f91cSChuck Lever 571b4a7f91cSChuck Lever TP_ARGS(task, rep, req, credits), 572b4a7f91cSChuck Lever 573b4a7f91cSChuck Lever TP_STRUCT__entry( 574b4a7f91cSChuck Lever __field(unsigned int, task_id) 575b4a7f91cSChuck Lever __field(unsigned int, client_id) 576b4a7f91cSChuck Lever __field(const void *, rep) 577b4a7f91cSChuck Lever __field(const void *, req) 578b4a7f91cSChuck Lever __field(u32, xid) 579b4a7f91cSChuck Lever __field(unsigned int, credits) 580b4a7f91cSChuck Lever ), 581b4a7f91cSChuck Lever 582b4a7f91cSChuck Lever TP_fast_assign( 583b4a7f91cSChuck Lever __entry->task_id = task->tk_pid; 584b4a7f91cSChuck Lever __entry->client_id = task->tk_client->cl_clid; 585b4a7f91cSChuck Lever __entry->rep = rep; 586b4a7f91cSChuck Lever __entry->req = req; 587b4a7f91cSChuck Lever __entry->xid = be32_to_cpu(rep->rr_xid); 588b4a7f91cSChuck Lever __entry->credits = credits; 589b4a7f91cSChuck Lever ), 590b4a7f91cSChuck Lever 591b4a7f91cSChuck Lever TP_printk("task:%u@%u xid=0x%08x, %u credits, rep=%p -> req=%p", 592b4a7f91cSChuck Lever __entry->task_id, __entry->client_id, __entry->xid, 593b4a7f91cSChuck Lever __entry->credits, __entry->rep, __entry->req 594b4a7f91cSChuck Lever ) 595b4a7f91cSChuck Lever ); 596b4a7f91cSChuck Lever 597b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_defer_cmp, 598b4a7f91cSChuck Lever TP_PROTO( 599b4a7f91cSChuck Lever const struct rpcrdma_rep *rep 600b4a7f91cSChuck Lever ), 601b4a7f91cSChuck Lever 602b4a7f91cSChuck Lever TP_ARGS(rep), 603b4a7f91cSChuck Lever 604b4a7f91cSChuck Lever TP_STRUCT__entry( 605b4a7f91cSChuck Lever __field(unsigned int, task_id) 606b4a7f91cSChuck Lever __field(unsigned int, client_id) 607b4a7f91cSChuck Lever __field(const void *, rep) 608b4a7f91cSChuck Lever __field(u32, xid) 609b4a7f91cSChuck Lever ), 610b4a7f91cSChuck Lever 611b4a7f91cSChuck Lever TP_fast_assign( 612b4a7f91cSChuck Lever __entry->task_id = rep->rr_rqst->rq_task->tk_pid; 613b4a7f91cSChuck Lever __entry->client_id = rep->rr_rqst->rq_task->tk_client->cl_clid; 614b4a7f91cSChuck Lever __entry->rep = rep; 615b4a7f91cSChuck Lever __entry->xid = be32_to_cpu(rep->rr_xid); 616b4a7f91cSChuck Lever ), 617b4a7f91cSChuck Lever 618b4a7f91cSChuck Lever TP_printk("task:%u@%u xid=0x%08x rep=%p", 619b4a7f91cSChuck Lever __entry->task_id, __entry->client_id, __entry->xid, 620b4a7f91cSChuck Lever __entry->rep 621b4a7f91cSChuck Lever ) 622b4a7f91cSChuck Lever ); 623b4a7f91cSChuck Lever 624b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_vers); 625b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_rqst); 626b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_short); 627b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_hdr); 628b4a7f91cSChuck Lever 629e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup, 630e11b7c96SChuck Lever TP_PROTO( 631e11b7c96SChuck Lever const struct rpc_rqst *rqst, 632e11b7c96SChuck Lever int len, 633e11b7c96SChuck Lever int hdrlen 634e11b7c96SChuck Lever ), 635e11b7c96SChuck Lever 636e11b7c96SChuck Lever TP_ARGS(rqst, len, hdrlen), 637e11b7c96SChuck Lever 638e11b7c96SChuck Lever TP_STRUCT__entry( 639e11b7c96SChuck Lever __field(unsigned int, task_id) 640e11b7c96SChuck Lever __field(unsigned int, client_id) 641e11b7c96SChuck Lever __field(const void *, base) 642e11b7c96SChuck Lever __field(int, len) 643e11b7c96SChuck Lever __field(int, hdrlen) 644e11b7c96SChuck Lever ), 645e11b7c96SChuck Lever 646e11b7c96SChuck Lever TP_fast_assign( 647e11b7c96SChuck Lever __entry->task_id = rqst->rq_task->tk_pid; 648e11b7c96SChuck Lever __entry->client_id = rqst->rq_task->tk_client->cl_clid; 649e11b7c96SChuck Lever __entry->base = rqst->rq_rcv_buf.head[0].iov_base; 650e11b7c96SChuck Lever __entry->len = len; 651e11b7c96SChuck Lever __entry->hdrlen = hdrlen; 652e11b7c96SChuck Lever ), 653e11b7c96SChuck Lever 654e11b7c96SChuck Lever TP_printk("task:%u@%u base=%p len=%d hdrlen=%d", 655e11b7c96SChuck Lever __entry->task_id, __entry->client_id, 656e11b7c96SChuck Lever __entry->base, __entry->len, __entry->hdrlen 657e11b7c96SChuck Lever ) 658e11b7c96SChuck Lever ); 659e11b7c96SChuck Lever 660e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup_pg, 661e11b7c96SChuck Lever TP_PROTO( 662e11b7c96SChuck Lever const struct rpc_rqst *rqst, 663e11b7c96SChuck Lever int pageno, 664e11b7c96SChuck Lever const void *pos, 665e11b7c96SChuck Lever int len, 666e11b7c96SChuck Lever int curlen 667e11b7c96SChuck Lever ), 668e11b7c96SChuck Lever 669e11b7c96SChuck Lever TP_ARGS(rqst, pageno, pos, len, curlen), 670e11b7c96SChuck Lever 671e11b7c96SChuck Lever TP_STRUCT__entry( 672e11b7c96SChuck Lever __field(unsigned int, task_id) 673e11b7c96SChuck Lever __field(unsigned int, client_id) 674e11b7c96SChuck Lever __field(const void *, pos) 675e11b7c96SChuck Lever __field(int, pageno) 676e11b7c96SChuck Lever __field(int, len) 677e11b7c96SChuck Lever __field(int, curlen) 678e11b7c96SChuck Lever ), 679e11b7c96SChuck Lever 680e11b7c96SChuck Lever TP_fast_assign( 681e11b7c96SChuck Lever __entry->task_id = rqst->rq_task->tk_pid; 682e11b7c96SChuck Lever __entry->client_id = rqst->rq_task->tk_client->cl_clid; 683e11b7c96SChuck Lever __entry->pos = pos; 684e11b7c96SChuck Lever __entry->pageno = pageno; 685e11b7c96SChuck Lever __entry->len = len; 686e11b7c96SChuck Lever __entry->curlen = curlen; 687e11b7c96SChuck Lever ), 688e11b7c96SChuck Lever 689e11b7c96SChuck Lever TP_printk("task:%u@%u pageno=%d pos=%p len=%d curlen=%d", 690e11b7c96SChuck Lever __entry->task_id, __entry->client_id, 691e11b7c96SChuck Lever __entry->pageno, __entry->pos, __entry->len, __entry->curlen 692e11b7c96SChuck Lever ) 693e11b7c96SChuck Lever ); 694e11b7c96SChuck Lever 695e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_decode_seg, 696e11b7c96SChuck Lever TP_PROTO( 697e11b7c96SChuck Lever u32 handle, 698e11b7c96SChuck Lever u32 length, 699e11b7c96SChuck Lever u64 offset 700e11b7c96SChuck Lever ), 701e11b7c96SChuck Lever 702e11b7c96SChuck Lever TP_ARGS(handle, length, offset), 703e11b7c96SChuck Lever 704e11b7c96SChuck Lever TP_STRUCT__entry( 705e11b7c96SChuck Lever __field(u32, handle) 706e11b7c96SChuck Lever __field(u32, length) 707e11b7c96SChuck Lever __field(u64, offset) 708e11b7c96SChuck Lever ), 709e11b7c96SChuck Lever 710e11b7c96SChuck Lever TP_fast_assign( 711e11b7c96SChuck Lever __entry->handle = handle; 712e11b7c96SChuck Lever __entry->length = length; 713e11b7c96SChuck Lever __entry->offset = offset; 714e11b7c96SChuck Lever ), 715e11b7c96SChuck Lever 716e11b7c96SChuck Lever TP_printk("%u@0x%016llx:0x%08x", 717e11b7c96SChuck Lever __entry->length, (unsigned long long)__entry->offset, 718e11b7c96SChuck Lever __entry->handle 719e11b7c96SChuck Lever ) 720e11b7c96SChuck Lever ); 721e11b7c96SChuck Lever 722e48f083eSChuck Lever #endif /* _TRACE_RPCRDMA_H */ 723e48f083eSChuck Lever 724e48f083eSChuck Lever #include <trace/define_trace.h> 725