18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright(c) 2016 Intel Corporation. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * This file is provided under a dual BSD/GPLv2 license. When using or 58c2ecf20Sopenharmony_ci * redistributing this file, you may do so under either license. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * GPL LICENSE SUMMARY 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * This program is free software; you can redistribute it and/or modify 108c2ecf20Sopenharmony_ci * it under the terms of version 2 of the GNU General Public License as 118c2ecf20Sopenharmony_ci * published by the Free Software Foundation. 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * This program is distributed in the hope that it will be useful, but 148c2ecf20Sopenharmony_ci * WITHOUT ANY WARRANTY; without even the implied warranty of 158c2ecf20Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 168c2ecf20Sopenharmony_ci * General Public License for more details. 178c2ecf20Sopenharmony_ci * 188c2ecf20Sopenharmony_ci * BSD LICENSE 198c2ecf20Sopenharmony_ci * 208c2ecf20Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 218c2ecf20Sopenharmony_ci * modification, are permitted provided that the following conditions 228c2ecf20Sopenharmony_ci * are met: 238c2ecf20Sopenharmony_ci * 248c2ecf20Sopenharmony_ci * - Redistributions of source code must retain the above copyright 258c2ecf20Sopenharmony_ci * notice, this list of conditions and the following disclaimer. 268c2ecf20Sopenharmony_ci * - Redistributions in binary form must reproduce the above copyright 278c2ecf20Sopenharmony_ci * notice, this list of conditions and the following disclaimer in 288c2ecf20Sopenharmony_ci * the documentation and/or other materials provided with the 298c2ecf20Sopenharmony_ci * distribution. 308c2ecf20Sopenharmony_ci * - Neither the name of Intel Corporation nor the names of its 318c2ecf20Sopenharmony_ci * contributors may be used to endorse or promote products derived 328c2ecf20Sopenharmony_ci * from this software without specific prior written permission. 338c2ecf20Sopenharmony_ci * 348c2ecf20Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 358c2ecf20Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 368c2ecf20Sopenharmony_ci * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 378c2ecf20Sopenharmony_ci * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 388c2ecf20Sopenharmony_ci * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 398c2ecf20Sopenharmony_ci * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 408c2ecf20Sopenharmony_ci * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 418c2ecf20Sopenharmony_ci * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 428c2ecf20Sopenharmony_ci * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 438c2ecf20Sopenharmony_ci * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 448c2ecf20Sopenharmony_ci * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 458c2ecf20Sopenharmony_ci * 468c2ecf20Sopenharmony_ci */ 478c2ecf20Sopenharmony_ci#if !defined(__RVT_TRACE_TX_H) || defined(TRACE_HEADER_MULTI_READ) 488c2ecf20Sopenharmony_ci#define __RVT_TRACE_TX_H 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci#include <linux/tracepoint.h> 518c2ecf20Sopenharmony_ci#include <linux/trace_seq.h> 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci#include <rdma/ib_verbs.h> 548c2ecf20Sopenharmony_ci#include <rdma/rdmavt_qp.h> 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci#undef TRACE_SYSTEM 578c2ecf20Sopenharmony_ci#define TRACE_SYSTEM rvt_tx 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci#define wr_opcode_name(opcode) { IB_WR_##opcode, #opcode } 608c2ecf20Sopenharmony_ci#define show_wr_opcode(opcode) \ 618c2ecf20Sopenharmony_ci__print_symbolic(opcode, \ 628c2ecf20Sopenharmony_ci wr_opcode_name(RDMA_WRITE), \ 638c2ecf20Sopenharmony_ci wr_opcode_name(RDMA_WRITE_WITH_IMM), \ 648c2ecf20Sopenharmony_ci wr_opcode_name(SEND), \ 658c2ecf20Sopenharmony_ci wr_opcode_name(SEND_WITH_IMM), \ 668c2ecf20Sopenharmony_ci wr_opcode_name(RDMA_READ), \ 678c2ecf20Sopenharmony_ci wr_opcode_name(ATOMIC_CMP_AND_SWP), \ 688c2ecf20Sopenharmony_ci wr_opcode_name(ATOMIC_FETCH_AND_ADD), \ 698c2ecf20Sopenharmony_ci wr_opcode_name(LSO), \ 708c2ecf20Sopenharmony_ci wr_opcode_name(SEND_WITH_INV), \ 718c2ecf20Sopenharmony_ci wr_opcode_name(RDMA_READ_WITH_INV), \ 728c2ecf20Sopenharmony_ci wr_opcode_name(LOCAL_INV), \ 738c2ecf20Sopenharmony_ci wr_opcode_name(MASKED_ATOMIC_CMP_AND_SWP), \ 748c2ecf20Sopenharmony_ci wr_opcode_name(MASKED_ATOMIC_FETCH_AND_ADD), \ 758c2ecf20Sopenharmony_ci wr_opcode_name(RESERVED1), \ 768c2ecf20Sopenharmony_ci wr_opcode_name(RESERVED2), \ 778c2ecf20Sopenharmony_ci wr_opcode_name(RESERVED3), \ 788c2ecf20Sopenharmony_ci wr_opcode_name(RESERVED4), \ 798c2ecf20Sopenharmony_ci wr_opcode_name(RESERVED5), \ 808c2ecf20Sopenharmony_ci wr_opcode_name(RESERVED6), \ 818c2ecf20Sopenharmony_ci wr_opcode_name(RESERVED7), \ 828c2ecf20Sopenharmony_ci wr_opcode_name(RESERVED8), \ 838c2ecf20Sopenharmony_ci wr_opcode_name(RESERVED9), \ 848c2ecf20Sopenharmony_ci wr_opcode_name(RESERVED10)) 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci#define POS_PRN \ 878c2ecf20Sopenharmony_ci"[%s] wqe %p wr_id %llx send_flags %x qpn %x qpt %u psn %x lpsn %x ssn %x length %u opcode 0x%.2x,%s size %u avail %u head %u last %u pid %u num_sge %u wr_num_sge %u" 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ciTRACE_EVENT( 908c2ecf20Sopenharmony_ci rvt_post_one_wr, 918c2ecf20Sopenharmony_ci TP_PROTO(struct rvt_qp *qp, struct rvt_swqe *wqe, int wr_num_sge), 928c2ecf20Sopenharmony_ci TP_ARGS(qp, wqe, wr_num_sge), 938c2ecf20Sopenharmony_ci TP_STRUCT__entry( 948c2ecf20Sopenharmony_ci RDI_DEV_ENTRY(ib_to_rvt(qp->ibqp.device)) 958c2ecf20Sopenharmony_ci __field(u64, wr_id) 968c2ecf20Sopenharmony_ci __field(struct rvt_swqe *, wqe) 978c2ecf20Sopenharmony_ci __field(u32, qpn) 988c2ecf20Sopenharmony_ci __field(u32, qpt) 998c2ecf20Sopenharmony_ci __field(u32, psn) 1008c2ecf20Sopenharmony_ci __field(u32, lpsn) 1018c2ecf20Sopenharmony_ci __field(u32, length) 1028c2ecf20Sopenharmony_ci __field(u32, opcode) 1038c2ecf20Sopenharmony_ci __field(u32, size) 1048c2ecf20Sopenharmony_ci __field(u32, avail) 1058c2ecf20Sopenharmony_ci __field(u32, head) 1068c2ecf20Sopenharmony_ci __field(u32, last) 1078c2ecf20Sopenharmony_ci __field(u32, ssn) 1088c2ecf20Sopenharmony_ci __field(int, send_flags) 1098c2ecf20Sopenharmony_ci __field(pid_t, pid) 1108c2ecf20Sopenharmony_ci __field(int, num_sge) 1118c2ecf20Sopenharmony_ci __field(int, wr_num_sge) 1128c2ecf20Sopenharmony_ci ), 1138c2ecf20Sopenharmony_ci TP_fast_assign( 1148c2ecf20Sopenharmony_ci RDI_DEV_ASSIGN(ib_to_rvt(qp->ibqp.device)) 1158c2ecf20Sopenharmony_ci __entry->wqe = wqe; 1168c2ecf20Sopenharmony_ci __entry->wr_id = wqe->wr.wr_id; 1178c2ecf20Sopenharmony_ci __entry->qpn = qp->ibqp.qp_num; 1188c2ecf20Sopenharmony_ci __entry->qpt = qp->ibqp.qp_type; 1198c2ecf20Sopenharmony_ci __entry->psn = wqe->psn; 1208c2ecf20Sopenharmony_ci __entry->lpsn = wqe->lpsn; 1218c2ecf20Sopenharmony_ci __entry->length = wqe->length; 1228c2ecf20Sopenharmony_ci __entry->opcode = wqe->wr.opcode; 1238c2ecf20Sopenharmony_ci __entry->size = qp->s_size; 1248c2ecf20Sopenharmony_ci __entry->avail = qp->s_avail; 1258c2ecf20Sopenharmony_ci __entry->head = qp->s_head; 1268c2ecf20Sopenharmony_ci __entry->last = qp->s_last; 1278c2ecf20Sopenharmony_ci __entry->pid = qp->pid; 1288c2ecf20Sopenharmony_ci __entry->ssn = wqe->ssn; 1298c2ecf20Sopenharmony_ci __entry->send_flags = wqe->wr.send_flags; 1308c2ecf20Sopenharmony_ci __entry->num_sge = wqe->wr.num_sge; 1318c2ecf20Sopenharmony_ci __entry->wr_num_sge = wr_num_sge; 1328c2ecf20Sopenharmony_ci ), 1338c2ecf20Sopenharmony_ci TP_printk( 1348c2ecf20Sopenharmony_ci POS_PRN, 1358c2ecf20Sopenharmony_ci __get_str(dev), 1368c2ecf20Sopenharmony_ci __entry->wqe, 1378c2ecf20Sopenharmony_ci __entry->wr_id, 1388c2ecf20Sopenharmony_ci __entry->send_flags, 1398c2ecf20Sopenharmony_ci __entry->qpn, 1408c2ecf20Sopenharmony_ci __entry->qpt, 1418c2ecf20Sopenharmony_ci __entry->psn, 1428c2ecf20Sopenharmony_ci __entry->lpsn, 1438c2ecf20Sopenharmony_ci __entry->ssn, 1448c2ecf20Sopenharmony_ci __entry->length, 1458c2ecf20Sopenharmony_ci __entry->opcode, show_wr_opcode(__entry->opcode), 1468c2ecf20Sopenharmony_ci __entry->size, 1478c2ecf20Sopenharmony_ci __entry->avail, 1488c2ecf20Sopenharmony_ci __entry->head, 1498c2ecf20Sopenharmony_ci __entry->last, 1508c2ecf20Sopenharmony_ci __entry->pid, 1518c2ecf20Sopenharmony_ci __entry->num_sge, 1528c2ecf20Sopenharmony_ci __entry->wr_num_sge 1538c2ecf20Sopenharmony_ci ) 1548c2ecf20Sopenharmony_ci); 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ciTRACE_EVENT( 1578c2ecf20Sopenharmony_ci rvt_qp_send_completion, 1588c2ecf20Sopenharmony_ci TP_PROTO(struct rvt_qp *qp, struct rvt_swqe *wqe, u32 idx), 1598c2ecf20Sopenharmony_ci TP_ARGS(qp, wqe, idx), 1608c2ecf20Sopenharmony_ci TP_STRUCT__entry( 1618c2ecf20Sopenharmony_ci RDI_DEV_ENTRY(ib_to_rvt(qp->ibqp.device)) 1628c2ecf20Sopenharmony_ci __field(struct rvt_swqe *, wqe) 1638c2ecf20Sopenharmony_ci __field(u64, wr_id) 1648c2ecf20Sopenharmony_ci __field(u32, qpn) 1658c2ecf20Sopenharmony_ci __field(u32, qpt) 1668c2ecf20Sopenharmony_ci __field(u32, length) 1678c2ecf20Sopenharmony_ci __field(u32, idx) 1688c2ecf20Sopenharmony_ci __field(u32, ssn) 1698c2ecf20Sopenharmony_ci __field(enum ib_wr_opcode, opcode) 1708c2ecf20Sopenharmony_ci __field(int, send_flags) 1718c2ecf20Sopenharmony_ci ), 1728c2ecf20Sopenharmony_ci TP_fast_assign( 1738c2ecf20Sopenharmony_ci RDI_DEV_ASSIGN(ib_to_rvt(qp->ibqp.device)) 1748c2ecf20Sopenharmony_ci __entry->wqe = wqe; 1758c2ecf20Sopenharmony_ci __entry->wr_id = wqe->wr.wr_id; 1768c2ecf20Sopenharmony_ci __entry->qpn = qp->ibqp.qp_num; 1778c2ecf20Sopenharmony_ci __entry->qpt = qp->ibqp.qp_type; 1788c2ecf20Sopenharmony_ci __entry->length = wqe->length; 1798c2ecf20Sopenharmony_ci __entry->idx = idx; 1808c2ecf20Sopenharmony_ci __entry->ssn = wqe->ssn; 1818c2ecf20Sopenharmony_ci __entry->opcode = wqe->wr.opcode; 1828c2ecf20Sopenharmony_ci __entry->send_flags = wqe->wr.send_flags; 1838c2ecf20Sopenharmony_ci ), 1848c2ecf20Sopenharmony_ci TP_printk( 1858c2ecf20Sopenharmony_ci "[%s] qpn 0x%x qpt %u wqe %p idx %u wr_id %llx length %u ssn %u opcode %x send_flags %x", 1868c2ecf20Sopenharmony_ci __get_str(dev), 1878c2ecf20Sopenharmony_ci __entry->qpn, 1888c2ecf20Sopenharmony_ci __entry->qpt, 1898c2ecf20Sopenharmony_ci __entry->wqe, 1908c2ecf20Sopenharmony_ci __entry->idx, 1918c2ecf20Sopenharmony_ci __entry->wr_id, 1928c2ecf20Sopenharmony_ci __entry->length, 1938c2ecf20Sopenharmony_ci __entry->ssn, 1948c2ecf20Sopenharmony_ci __entry->opcode, 1958c2ecf20Sopenharmony_ci __entry->send_flags 1968c2ecf20Sopenharmony_ci ) 1978c2ecf20Sopenharmony_ci); 1988c2ecf20Sopenharmony_ci#endif /* __RVT_TRACE_TX_H */ 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci#undef TRACE_INCLUDE_PATH 2018c2ecf20Sopenharmony_ci#undef TRACE_INCLUDE_FILE 2028c2ecf20Sopenharmony_ci#define TRACE_INCLUDE_PATH . 2038c2ecf20Sopenharmony_ci#define TRACE_INCLUDE_FILE trace_tx 2048c2ecf20Sopenharmony_ci#include <trace/define_trace.h> 2058c2ecf20Sopenharmony_ci 206