13e5901cbSChuck Lever /* SPDX-License-Identifier: GPL-2.0-only */ 23e5901cbSChuck Lever /* 33e5901cbSChuck Lever * Trace point definitions for core RDMA functions. 43e5901cbSChuck Lever * 53e5901cbSChuck Lever * Author: Chuck Lever <chuck.lever@oracle.com> 63e5901cbSChuck Lever * 73e5901cbSChuck Lever * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. 83e5901cbSChuck Lever */ 93e5901cbSChuck Lever 103e5901cbSChuck Lever #undef TRACE_SYSTEM 113e5901cbSChuck Lever #define TRACE_SYSTEM rdma_core 123e5901cbSChuck Lever 133e5901cbSChuck Lever #if !defined(_TRACE_RDMA_CORE_H) || defined(TRACE_HEADER_MULTI_READ) 143e5901cbSChuck Lever #define _TRACE_RDMA_CORE_H 153e5901cbSChuck Lever 163e5901cbSChuck Lever #include <linux/tracepoint.h> 173e5901cbSChuck Lever #include <rdma/ib_verbs.h> 183e5901cbSChuck Lever 193e5901cbSChuck Lever /* 203e5901cbSChuck Lever * enum ib_poll_context, from include/rdma/ib_verbs.h 213e5901cbSChuck Lever */ 223e5901cbSChuck Lever #define IB_POLL_CTX_LIST \ 233e5901cbSChuck Lever ib_poll_ctx(DIRECT) \ 243e5901cbSChuck Lever ib_poll_ctx(SOFTIRQ) \ 253e5901cbSChuck Lever ib_poll_ctx(WORKQUEUE) \ 263e5901cbSChuck Lever ib_poll_ctx_end(UNBOUND_WORKQUEUE) 273e5901cbSChuck Lever 283e5901cbSChuck Lever #undef ib_poll_ctx 293e5901cbSChuck Lever #undef ib_poll_ctx_end 303e5901cbSChuck Lever 313e5901cbSChuck Lever #define ib_poll_ctx(x) TRACE_DEFINE_ENUM(IB_POLL_##x); 323e5901cbSChuck Lever #define ib_poll_ctx_end(x) TRACE_DEFINE_ENUM(IB_POLL_##x); 333e5901cbSChuck Lever 343e5901cbSChuck Lever IB_POLL_CTX_LIST 353e5901cbSChuck Lever 363e5901cbSChuck Lever #undef ib_poll_ctx 373e5901cbSChuck Lever #undef ib_poll_ctx_end 383e5901cbSChuck Lever 393e5901cbSChuck Lever #define ib_poll_ctx(x) { IB_POLL_##x, #x }, 403e5901cbSChuck Lever #define ib_poll_ctx_end(x) { IB_POLL_##x, #x } 413e5901cbSChuck Lever 423e5901cbSChuck Lever #define rdma_show_ib_poll_ctx(x) \ 433e5901cbSChuck Lever __print_symbolic(x, IB_POLL_CTX_LIST) 443e5901cbSChuck Lever 453e5901cbSChuck Lever /** 463e5901cbSChuck Lever ** Completion Queue events 473e5901cbSChuck Lever **/ 483e5901cbSChuck Lever 493e5901cbSChuck Lever TRACE_EVENT(cq_schedule, 503e5901cbSChuck Lever TP_PROTO( 513e5901cbSChuck Lever struct ib_cq *cq 523e5901cbSChuck Lever ), 533e5901cbSChuck Lever 543e5901cbSChuck Lever TP_ARGS(cq), 553e5901cbSChuck Lever 563e5901cbSChuck Lever TP_STRUCT__entry( 573e5901cbSChuck Lever __field(u32, cq_id) 583e5901cbSChuck Lever ), 593e5901cbSChuck Lever 603e5901cbSChuck Lever TP_fast_assign( 613e5901cbSChuck Lever cq->timestamp = ktime_get(); 623e5901cbSChuck Lever cq->interrupt = true; 633e5901cbSChuck Lever 643e5901cbSChuck Lever __entry->cq_id = cq->res.id; 653e5901cbSChuck Lever ), 663e5901cbSChuck Lever 673e5901cbSChuck Lever TP_printk("cq.id=%u", __entry->cq_id) 683e5901cbSChuck Lever ); 693e5901cbSChuck Lever 703e5901cbSChuck Lever TRACE_EVENT(cq_reschedule, 713e5901cbSChuck Lever TP_PROTO( 723e5901cbSChuck Lever struct ib_cq *cq 733e5901cbSChuck Lever ), 743e5901cbSChuck Lever 753e5901cbSChuck Lever TP_ARGS(cq), 763e5901cbSChuck Lever 773e5901cbSChuck Lever TP_STRUCT__entry( 783e5901cbSChuck Lever __field(u32, cq_id) 793e5901cbSChuck Lever ), 803e5901cbSChuck Lever 813e5901cbSChuck Lever TP_fast_assign( 823e5901cbSChuck Lever cq->timestamp = ktime_get(); 833e5901cbSChuck Lever cq->interrupt = false; 843e5901cbSChuck Lever 853e5901cbSChuck Lever __entry->cq_id = cq->res.id; 863e5901cbSChuck Lever ), 873e5901cbSChuck Lever 883e5901cbSChuck Lever TP_printk("cq.id=%u", __entry->cq_id) 893e5901cbSChuck Lever ); 903e5901cbSChuck Lever 913e5901cbSChuck Lever TRACE_EVENT(cq_process, 923e5901cbSChuck Lever TP_PROTO( 933e5901cbSChuck Lever const struct ib_cq *cq 943e5901cbSChuck Lever ), 953e5901cbSChuck Lever 963e5901cbSChuck Lever TP_ARGS(cq), 973e5901cbSChuck Lever 983e5901cbSChuck Lever TP_STRUCT__entry( 993e5901cbSChuck Lever __field(u32, cq_id) 1003e5901cbSChuck Lever __field(bool, interrupt) 1013e5901cbSChuck Lever __field(s64, latency) 1023e5901cbSChuck Lever ), 1033e5901cbSChuck Lever 1043e5901cbSChuck Lever TP_fast_assign( 1053e5901cbSChuck Lever ktime_t latency = ktime_sub(ktime_get(), cq->timestamp); 1063e5901cbSChuck Lever 1073e5901cbSChuck Lever __entry->cq_id = cq->res.id; 1083e5901cbSChuck Lever __entry->latency = ktime_to_us(latency); 1093e5901cbSChuck Lever __entry->interrupt = cq->interrupt; 1103e5901cbSChuck Lever ), 1113e5901cbSChuck Lever 1123e5901cbSChuck Lever TP_printk("cq.id=%u wake-up took %lld [us] from %s", 1133e5901cbSChuck Lever __entry->cq_id, __entry->latency, 1143e5901cbSChuck Lever __entry->interrupt ? "interrupt" : "reschedule" 1153e5901cbSChuck Lever ) 1163e5901cbSChuck Lever ); 1173e5901cbSChuck Lever 1183e5901cbSChuck Lever TRACE_EVENT(cq_poll, 1193e5901cbSChuck Lever TP_PROTO( 1203e5901cbSChuck Lever const struct ib_cq *cq, 1213e5901cbSChuck Lever int requested, 1223e5901cbSChuck Lever int rc 1233e5901cbSChuck Lever ), 1243e5901cbSChuck Lever 1253e5901cbSChuck Lever TP_ARGS(cq, requested, rc), 1263e5901cbSChuck Lever 1273e5901cbSChuck Lever TP_STRUCT__entry( 1283e5901cbSChuck Lever __field(u32, cq_id) 1293e5901cbSChuck Lever __field(int, requested) 1303e5901cbSChuck Lever __field(int, rc) 1313e5901cbSChuck Lever ), 1323e5901cbSChuck Lever 1333e5901cbSChuck Lever TP_fast_assign( 1343e5901cbSChuck Lever __entry->cq_id = cq->res.id; 1353e5901cbSChuck Lever __entry->requested = requested; 1363e5901cbSChuck Lever __entry->rc = rc; 1373e5901cbSChuck Lever ), 1383e5901cbSChuck Lever 1393e5901cbSChuck Lever TP_printk("cq.id=%u requested %d, returned %d", 1403e5901cbSChuck Lever __entry->cq_id, __entry->requested, __entry->rc 1413e5901cbSChuck Lever ) 1423e5901cbSChuck Lever ); 1433e5901cbSChuck Lever 1443e5901cbSChuck Lever TRACE_EVENT(cq_drain_complete, 1453e5901cbSChuck Lever TP_PROTO( 1463e5901cbSChuck Lever const struct ib_cq *cq 1473e5901cbSChuck Lever ), 1483e5901cbSChuck Lever 1493e5901cbSChuck Lever TP_ARGS(cq), 1503e5901cbSChuck Lever 1513e5901cbSChuck Lever TP_STRUCT__entry( 1523e5901cbSChuck Lever __field(u32, cq_id) 1533e5901cbSChuck Lever ), 1543e5901cbSChuck Lever 1553e5901cbSChuck Lever TP_fast_assign( 1563e5901cbSChuck Lever __entry->cq_id = cq->res.id; 1573e5901cbSChuck Lever ), 1583e5901cbSChuck Lever 1593e5901cbSChuck Lever TP_printk("cq.id=%u", 1603e5901cbSChuck Lever __entry->cq_id 1613e5901cbSChuck Lever ) 1623e5901cbSChuck Lever ); 1633e5901cbSChuck Lever 1643e5901cbSChuck Lever 1653e5901cbSChuck Lever TRACE_EVENT(cq_modify, 1663e5901cbSChuck Lever TP_PROTO( 1673e5901cbSChuck Lever const struct ib_cq *cq, 1683e5901cbSChuck Lever u16 comps, 1693e5901cbSChuck Lever u16 usec 1703e5901cbSChuck Lever ), 1713e5901cbSChuck Lever 1723e5901cbSChuck Lever TP_ARGS(cq, comps, usec), 1733e5901cbSChuck Lever 1743e5901cbSChuck Lever TP_STRUCT__entry( 1753e5901cbSChuck Lever __field(u32, cq_id) 1763e5901cbSChuck Lever __field(unsigned int, comps) 1773e5901cbSChuck Lever __field(unsigned int, usec) 1783e5901cbSChuck Lever ), 1793e5901cbSChuck Lever 1803e5901cbSChuck Lever TP_fast_assign( 1813e5901cbSChuck Lever __entry->cq_id = cq->res.id; 1823e5901cbSChuck Lever __entry->comps = comps; 1833e5901cbSChuck Lever __entry->usec = usec; 1843e5901cbSChuck Lever ), 1853e5901cbSChuck Lever 1863e5901cbSChuck Lever TP_printk("cq.id=%u comps=%u usec=%u", 1873e5901cbSChuck Lever __entry->cq_id, __entry->comps, __entry->usec 1883e5901cbSChuck Lever ) 1893e5901cbSChuck Lever ); 1903e5901cbSChuck Lever 1913e5901cbSChuck Lever TRACE_EVENT(cq_alloc, 1923e5901cbSChuck Lever TP_PROTO( 1933e5901cbSChuck Lever const struct ib_cq *cq, 1943e5901cbSChuck Lever int nr_cqe, 1953e5901cbSChuck Lever int comp_vector, 1963e5901cbSChuck Lever enum ib_poll_context poll_ctx 1973e5901cbSChuck Lever ), 1983e5901cbSChuck Lever 1993e5901cbSChuck Lever TP_ARGS(cq, nr_cqe, comp_vector, poll_ctx), 2003e5901cbSChuck Lever 2013e5901cbSChuck Lever TP_STRUCT__entry( 2023e5901cbSChuck Lever __field(u32, cq_id) 2033e5901cbSChuck Lever __field(int, nr_cqe) 2043e5901cbSChuck Lever __field(int, comp_vector) 2053e5901cbSChuck Lever __field(unsigned long, poll_ctx) 2063e5901cbSChuck Lever ), 2073e5901cbSChuck Lever 2083e5901cbSChuck Lever TP_fast_assign( 2093e5901cbSChuck Lever __entry->cq_id = cq->res.id; 2103e5901cbSChuck Lever __entry->nr_cqe = nr_cqe; 2113e5901cbSChuck Lever __entry->comp_vector = comp_vector; 2123e5901cbSChuck Lever __entry->poll_ctx = poll_ctx; 2133e5901cbSChuck Lever ), 2143e5901cbSChuck Lever 2153e5901cbSChuck Lever TP_printk("cq.id=%u nr_cqe=%d comp_vector=%d poll_ctx=%s", 2163e5901cbSChuck Lever __entry->cq_id, __entry->nr_cqe, __entry->comp_vector, 2173e5901cbSChuck Lever rdma_show_ib_poll_ctx(__entry->poll_ctx) 2183e5901cbSChuck Lever ) 2193e5901cbSChuck Lever ); 2203e5901cbSChuck Lever 2213e5901cbSChuck Lever TRACE_EVENT(cq_alloc_error, 2223e5901cbSChuck Lever TP_PROTO( 2233e5901cbSChuck Lever int nr_cqe, 2243e5901cbSChuck Lever int comp_vector, 2253e5901cbSChuck Lever enum ib_poll_context poll_ctx, 2263e5901cbSChuck Lever int rc 2273e5901cbSChuck Lever ), 2283e5901cbSChuck Lever 2293e5901cbSChuck Lever TP_ARGS(nr_cqe, comp_vector, poll_ctx, rc), 2303e5901cbSChuck Lever 2313e5901cbSChuck Lever TP_STRUCT__entry( 2323e5901cbSChuck Lever __field(int, rc) 2333e5901cbSChuck Lever __field(int, nr_cqe) 2343e5901cbSChuck Lever __field(int, comp_vector) 2353e5901cbSChuck Lever __field(unsigned long, poll_ctx) 2363e5901cbSChuck Lever ), 2373e5901cbSChuck Lever 2383e5901cbSChuck Lever TP_fast_assign( 2393e5901cbSChuck Lever __entry->rc = rc; 2403e5901cbSChuck Lever __entry->nr_cqe = nr_cqe; 2413e5901cbSChuck Lever __entry->comp_vector = comp_vector; 2423e5901cbSChuck Lever __entry->poll_ctx = poll_ctx; 2433e5901cbSChuck Lever ), 2443e5901cbSChuck Lever 2453e5901cbSChuck Lever TP_printk("nr_cqe=%d comp_vector=%d poll_ctx=%s rc=%d", 2463e5901cbSChuck Lever __entry->nr_cqe, __entry->comp_vector, 2473e5901cbSChuck Lever rdma_show_ib_poll_ctx(__entry->poll_ctx), __entry->rc 2483e5901cbSChuck Lever ) 2493e5901cbSChuck Lever ); 2503e5901cbSChuck Lever 2513e5901cbSChuck Lever TRACE_EVENT(cq_free, 2523e5901cbSChuck Lever TP_PROTO( 2533e5901cbSChuck Lever const struct ib_cq *cq 2543e5901cbSChuck Lever ), 2553e5901cbSChuck Lever 2563e5901cbSChuck Lever TP_ARGS(cq), 2573e5901cbSChuck Lever 2583e5901cbSChuck Lever TP_STRUCT__entry( 2593e5901cbSChuck Lever __field(u32, cq_id) 2603e5901cbSChuck Lever ), 2613e5901cbSChuck Lever 2623e5901cbSChuck Lever TP_fast_assign( 2633e5901cbSChuck Lever __entry->cq_id = cq->res.id; 2643e5901cbSChuck Lever ), 2653e5901cbSChuck Lever 2663e5901cbSChuck Lever TP_printk("cq.id=%u", __entry->cq_id) 2673e5901cbSChuck Lever ); 2683e5901cbSChuck Lever 269*622db5b6SChuck Lever /** 270*622db5b6SChuck Lever ** Memory Region events 271*622db5b6SChuck Lever **/ 272*622db5b6SChuck Lever 273*622db5b6SChuck Lever /* 274*622db5b6SChuck Lever * enum ib_mr_type, from include/rdma/ib_verbs.h 275*622db5b6SChuck Lever */ 276*622db5b6SChuck Lever #define IB_MR_TYPE_LIST \ 277*622db5b6SChuck Lever ib_mr_type_item(MEM_REG) \ 278*622db5b6SChuck Lever ib_mr_type_item(SG_GAPS) \ 279*622db5b6SChuck Lever ib_mr_type_item(DM) \ 280*622db5b6SChuck Lever ib_mr_type_item(USER) \ 281*622db5b6SChuck Lever ib_mr_type_item(DMA) \ 282*622db5b6SChuck Lever ib_mr_type_end(INTEGRITY) 283*622db5b6SChuck Lever 284*622db5b6SChuck Lever #undef ib_mr_type_item 285*622db5b6SChuck Lever #undef ib_mr_type_end 286*622db5b6SChuck Lever 287*622db5b6SChuck Lever #define ib_mr_type_item(x) TRACE_DEFINE_ENUM(IB_MR_TYPE_##x); 288*622db5b6SChuck Lever #define ib_mr_type_end(x) TRACE_DEFINE_ENUM(IB_MR_TYPE_##x); 289*622db5b6SChuck Lever 290*622db5b6SChuck Lever IB_MR_TYPE_LIST 291*622db5b6SChuck Lever 292*622db5b6SChuck Lever #undef ib_mr_type_item 293*622db5b6SChuck Lever #undef ib_mr_type_end 294*622db5b6SChuck Lever 295*622db5b6SChuck Lever #define ib_mr_type_item(x) { IB_MR_TYPE_##x, #x }, 296*622db5b6SChuck Lever #define ib_mr_type_end(x) { IB_MR_TYPE_##x, #x } 297*622db5b6SChuck Lever 298*622db5b6SChuck Lever #define rdma_show_ib_mr_type(x) \ 299*622db5b6SChuck Lever __print_symbolic(x, IB_MR_TYPE_LIST) 300*622db5b6SChuck Lever 301*622db5b6SChuck Lever TRACE_EVENT(mr_alloc, 302*622db5b6SChuck Lever TP_PROTO( 303*622db5b6SChuck Lever const struct ib_pd *pd, 304*622db5b6SChuck Lever enum ib_mr_type mr_type, 305*622db5b6SChuck Lever u32 max_num_sg, 306*622db5b6SChuck Lever const struct ib_mr *mr 307*622db5b6SChuck Lever ), 308*622db5b6SChuck Lever 309*622db5b6SChuck Lever TP_ARGS(pd, mr_type, max_num_sg, mr), 310*622db5b6SChuck Lever 311*622db5b6SChuck Lever TP_STRUCT__entry( 312*622db5b6SChuck Lever __field(u32, pd_id) 313*622db5b6SChuck Lever __field(u32, mr_id) 314*622db5b6SChuck Lever __field(u32, max_num_sg) 315*622db5b6SChuck Lever __field(int, rc) 316*622db5b6SChuck Lever __field(unsigned long, mr_type) 317*622db5b6SChuck Lever ), 318*622db5b6SChuck Lever 319*622db5b6SChuck Lever TP_fast_assign( 320*622db5b6SChuck Lever __entry->pd_id = pd->res.id; 321*622db5b6SChuck Lever if (IS_ERR(mr)) { 322*622db5b6SChuck Lever __entry->mr_id = 0; 323*622db5b6SChuck Lever __entry->rc = PTR_ERR(mr); 324*622db5b6SChuck Lever } else { 325*622db5b6SChuck Lever __entry->mr_id = mr->res.id; 326*622db5b6SChuck Lever __entry->rc = 0; 327*622db5b6SChuck Lever } 328*622db5b6SChuck Lever __entry->max_num_sg = max_num_sg; 329*622db5b6SChuck Lever __entry->mr_type = mr_type; 330*622db5b6SChuck Lever ), 331*622db5b6SChuck Lever 332*622db5b6SChuck Lever TP_printk("pd.id=%u mr.id=%u type=%s max_num_sg=%u rc=%d", 333*622db5b6SChuck Lever __entry->pd_id, __entry->mr_id, 334*622db5b6SChuck Lever rdma_show_ib_mr_type(__entry->mr_type), 335*622db5b6SChuck Lever __entry->max_num_sg, __entry->rc) 336*622db5b6SChuck Lever ); 337*622db5b6SChuck Lever 338*622db5b6SChuck Lever TRACE_EVENT(mr_integ_alloc, 339*622db5b6SChuck Lever TP_PROTO( 340*622db5b6SChuck Lever const struct ib_pd *pd, 341*622db5b6SChuck Lever u32 max_num_data_sg, 342*622db5b6SChuck Lever u32 max_num_meta_sg, 343*622db5b6SChuck Lever const struct ib_mr *mr 344*622db5b6SChuck Lever ), 345*622db5b6SChuck Lever 346*622db5b6SChuck Lever TP_ARGS(pd, max_num_data_sg, max_num_meta_sg, mr), 347*622db5b6SChuck Lever 348*622db5b6SChuck Lever TP_STRUCT__entry( 349*622db5b6SChuck Lever __field(u32, pd_id) 350*622db5b6SChuck Lever __field(u32, mr_id) 351*622db5b6SChuck Lever __field(u32, max_num_data_sg) 352*622db5b6SChuck Lever __field(u32, max_num_meta_sg) 353*622db5b6SChuck Lever __field(int, rc) 354*622db5b6SChuck Lever ), 355*622db5b6SChuck Lever 356*622db5b6SChuck Lever TP_fast_assign( 357*622db5b6SChuck Lever __entry->pd_id = pd->res.id; 358*622db5b6SChuck Lever if (IS_ERR(mr)) { 359*622db5b6SChuck Lever __entry->mr_id = 0; 360*622db5b6SChuck Lever __entry->rc = PTR_ERR(mr); 361*622db5b6SChuck Lever } else { 362*622db5b6SChuck Lever __entry->mr_id = mr->res.id; 363*622db5b6SChuck Lever __entry->rc = 0; 364*622db5b6SChuck Lever } 365*622db5b6SChuck Lever __entry->max_num_data_sg = max_num_data_sg; 366*622db5b6SChuck Lever __entry->max_num_meta_sg = max_num_meta_sg; 367*622db5b6SChuck Lever ), 368*622db5b6SChuck Lever 369*622db5b6SChuck Lever TP_printk("pd.id=%u mr.id=%u max_num_data_sg=%u max_num_meta_sg=%u rc=%d", 370*622db5b6SChuck Lever __entry->pd_id, __entry->mr_id, __entry->max_num_data_sg, 371*622db5b6SChuck Lever __entry->max_num_meta_sg, __entry->rc) 372*622db5b6SChuck Lever ); 373*622db5b6SChuck Lever 374*622db5b6SChuck Lever TRACE_EVENT(mr_dereg, 375*622db5b6SChuck Lever TP_PROTO( 376*622db5b6SChuck Lever const struct ib_mr *mr 377*622db5b6SChuck Lever ), 378*622db5b6SChuck Lever 379*622db5b6SChuck Lever TP_ARGS(mr), 380*622db5b6SChuck Lever 381*622db5b6SChuck Lever TP_STRUCT__entry( 382*622db5b6SChuck Lever __field(u32, id) 383*622db5b6SChuck Lever ), 384*622db5b6SChuck Lever 385*622db5b6SChuck Lever TP_fast_assign( 386*622db5b6SChuck Lever __entry->id = mr->res.id; 387*622db5b6SChuck Lever ), 388*622db5b6SChuck Lever 389*622db5b6SChuck Lever TP_printk("mr.id=%u", __entry->id) 390*622db5b6SChuck Lever ); 391*622db5b6SChuck Lever 3923e5901cbSChuck Lever #endif /* _TRACE_RDMA_CORE_H */ 3933e5901cbSChuck Lever 3943e5901cbSChuck Lever #include <trace/define_trace.h> 395