1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright(c) 2016 Intel Corporation. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * This file is provided under a dual BSD/GPLv2 license. When using or 5*4882a593Smuzhiyun * redistributing this file, you may do so under either license. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * GPL LICENSE SUMMARY 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 10*4882a593Smuzhiyun * it under the terms of version 2 of the GNU General Public License as 11*4882a593Smuzhiyun * published by the Free Software Foundation. 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but 14*4882a593Smuzhiyun * WITHOUT ANY WARRANTY; without even the implied warranty of 15*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16*4882a593Smuzhiyun * General Public License for more details. 17*4882a593Smuzhiyun * 18*4882a593Smuzhiyun * BSD LICENSE 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without 21*4882a593Smuzhiyun * modification, are permitted provided that the following conditions 22*4882a593Smuzhiyun * are met: 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * - Redistributions of source code must retain the above copyright 25*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer. 26*4882a593Smuzhiyun * - Redistributions in binary form must reproduce the above copyright 27*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer in 28*4882a593Smuzhiyun * the documentation and/or other materials provided with the 29*4882a593Smuzhiyun * distribution. 30*4882a593Smuzhiyun * - Neither the name of Intel Corporation nor the names of its 31*4882a593Smuzhiyun * contributors may be used to endorse or promote products derived 32*4882a593Smuzhiyun * from this software without specific prior written permission. 33*4882a593Smuzhiyun * 34*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 35*4882a593Smuzhiyun * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 36*4882a593Smuzhiyun * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 37*4882a593Smuzhiyun * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 38*4882a593Smuzhiyun * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 39*4882a593Smuzhiyun * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 40*4882a593Smuzhiyun * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 41*4882a593Smuzhiyun * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 42*4882a593Smuzhiyun * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 43*4882a593Smuzhiyun * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 44*4882a593Smuzhiyun * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 45*4882a593Smuzhiyun * 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun #if !defined(__RVT_TRACE_MR_H) || defined(TRACE_HEADER_MULTI_READ) 48*4882a593Smuzhiyun #define __RVT_TRACE_MR_H 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #include <linux/tracepoint.h> 51*4882a593Smuzhiyun #include <linux/trace_seq.h> 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #include <rdma/ib_verbs.h> 54*4882a593Smuzhiyun #include <rdma/rdma_vt.h> 55*4882a593Smuzhiyun #include <rdma/rdmavt_mr.h> 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun #include "mr.h" 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #undef TRACE_SYSTEM 60*4882a593Smuzhiyun #define TRACE_SYSTEM rvt_mr 61*4882a593Smuzhiyun DECLARE_EVENT_CLASS( 62*4882a593Smuzhiyun rvt_mr_template, 63*4882a593Smuzhiyun TP_PROTO(struct rvt_mregion *mr, u16 m, u16 n, void *v, size_t len), 64*4882a593Smuzhiyun TP_ARGS(mr, m, n, v, len), 65*4882a593Smuzhiyun TP_STRUCT__entry( 66*4882a593Smuzhiyun RDI_DEV_ENTRY(ib_to_rvt(mr->pd->device)) 67*4882a593Smuzhiyun __field(void *, vaddr) 68*4882a593Smuzhiyun __field(struct page *, page) 69*4882a593Smuzhiyun __field(u64, iova) 70*4882a593Smuzhiyun __field(u64, user_base) 71*4882a593Smuzhiyun __field(size_t, len) 72*4882a593Smuzhiyun __field(size_t, length) 73*4882a593Smuzhiyun __field(u32, lkey) 74*4882a593Smuzhiyun __field(u32, offset) 75*4882a593Smuzhiyun __field(u16, m) 76*4882a593Smuzhiyun __field(u16, n) 77*4882a593Smuzhiyun ), 78*4882a593Smuzhiyun TP_fast_assign( 79*4882a593Smuzhiyun RDI_DEV_ASSIGN(ib_to_rvt(mr->pd->device)); 80*4882a593Smuzhiyun __entry->vaddr = v; 81*4882a593Smuzhiyun __entry->page = virt_to_page(v); 82*4882a593Smuzhiyun __entry->iova = mr->iova; 83*4882a593Smuzhiyun __entry->user_base = mr->user_base; 84*4882a593Smuzhiyun __entry->lkey = mr->lkey; 85*4882a593Smuzhiyun __entry->m = m; 86*4882a593Smuzhiyun __entry->n = n; 87*4882a593Smuzhiyun __entry->len = len; 88*4882a593Smuzhiyun __entry->length = mr->length; 89*4882a593Smuzhiyun __entry->offset = mr->offset; 90*4882a593Smuzhiyun ), 91*4882a593Smuzhiyun TP_printk( 92*4882a593Smuzhiyun "[%s] lkey %x iova %llx user_base %llx mr_len %lu vaddr %llx page %p m %u n %u len %lu off %u", 93*4882a593Smuzhiyun __get_str(dev), 94*4882a593Smuzhiyun __entry->lkey, 95*4882a593Smuzhiyun __entry->iova, 96*4882a593Smuzhiyun __entry->user_base, 97*4882a593Smuzhiyun __entry->length, 98*4882a593Smuzhiyun (unsigned long long)__entry->vaddr, 99*4882a593Smuzhiyun __entry->page, 100*4882a593Smuzhiyun __entry->m, 101*4882a593Smuzhiyun __entry->n, 102*4882a593Smuzhiyun __entry->len, 103*4882a593Smuzhiyun __entry->offset 104*4882a593Smuzhiyun ) 105*4882a593Smuzhiyun ); 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun DEFINE_EVENT( 108*4882a593Smuzhiyun rvt_mr_template, rvt_mr_page_seg, 109*4882a593Smuzhiyun TP_PROTO(struct rvt_mregion *mr, u16 m, u16 n, void *v, size_t len), 110*4882a593Smuzhiyun TP_ARGS(mr, m, n, v, len)); 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun DEFINE_EVENT( 113*4882a593Smuzhiyun rvt_mr_template, rvt_mr_fmr_seg, 114*4882a593Smuzhiyun TP_PROTO(struct rvt_mregion *mr, u16 m, u16 n, void *v, size_t len), 115*4882a593Smuzhiyun TP_ARGS(mr, m, n, v, len)); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun DEFINE_EVENT( 118*4882a593Smuzhiyun rvt_mr_template, rvt_mr_user_seg, 119*4882a593Smuzhiyun TP_PROTO(struct rvt_mregion *mr, u16 m, u16 n, void *v, size_t len), 120*4882a593Smuzhiyun TP_ARGS(mr, m, n, v, len)); 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun DECLARE_EVENT_CLASS( 123*4882a593Smuzhiyun rvt_sge_template, 124*4882a593Smuzhiyun TP_PROTO(struct rvt_sge *sge, struct ib_sge *isge), 125*4882a593Smuzhiyun TP_ARGS(sge, isge), 126*4882a593Smuzhiyun TP_STRUCT__entry( 127*4882a593Smuzhiyun RDI_DEV_ENTRY(ib_to_rvt(sge->mr->pd->device)) 128*4882a593Smuzhiyun __field(struct rvt_mregion *, mr) 129*4882a593Smuzhiyun __field(struct rvt_sge *, sge) 130*4882a593Smuzhiyun __field(struct ib_sge *, isge) 131*4882a593Smuzhiyun __field(void *, vaddr) 132*4882a593Smuzhiyun __field(u64, ivaddr) 133*4882a593Smuzhiyun __field(u32, lkey) 134*4882a593Smuzhiyun __field(u32, sge_length) 135*4882a593Smuzhiyun __field(u32, length) 136*4882a593Smuzhiyun __field(u32, ilength) 137*4882a593Smuzhiyun __field(int, user) 138*4882a593Smuzhiyun __field(u16, m) 139*4882a593Smuzhiyun __field(u16, n) 140*4882a593Smuzhiyun ), 141*4882a593Smuzhiyun TP_fast_assign( 142*4882a593Smuzhiyun RDI_DEV_ASSIGN(ib_to_rvt(sge->mr->pd->device)); 143*4882a593Smuzhiyun __entry->mr = sge->mr; 144*4882a593Smuzhiyun __entry->sge = sge; 145*4882a593Smuzhiyun __entry->isge = isge; 146*4882a593Smuzhiyun __entry->vaddr = sge->vaddr; 147*4882a593Smuzhiyun __entry->ivaddr = isge->addr; 148*4882a593Smuzhiyun __entry->lkey = sge->mr->lkey; 149*4882a593Smuzhiyun __entry->sge_length = sge->sge_length; 150*4882a593Smuzhiyun __entry->length = sge->length; 151*4882a593Smuzhiyun __entry->ilength = isge->length; 152*4882a593Smuzhiyun __entry->m = sge->m; 153*4882a593Smuzhiyun __entry->n = sge->m; 154*4882a593Smuzhiyun __entry->user = ibpd_to_rvtpd(sge->mr->pd)->user; 155*4882a593Smuzhiyun ), 156*4882a593Smuzhiyun TP_printk( 157*4882a593Smuzhiyun "[%s] mr %p sge %p isge %p vaddr %p ivaddr %llx lkey %x sge_length %u length %u ilength %u m %u n %u user %u", 158*4882a593Smuzhiyun __get_str(dev), 159*4882a593Smuzhiyun __entry->mr, 160*4882a593Smuzhiyun __entry->sge, 161*4882a593Smuzhiyun __entry->isge, 162*4882a593Smuzhiyun __entry->vaddr, 163*4882a593Smuzhiyun __entry->ivaddr, 164*4882a593Smuzhiyun __entry->lkey, 165*4882a593Smuzhiyun __entry->sge_length, 166*4882a593Smuzhiyun __entry->length, 167*4882a593Smuzhiyun __entry->ilength, 168*4882a593Smuzhiyun __entry->m, 169*4882a593Smuzhiyun __entry->n, 170*4882a593Smuzhiyun __entry->user 171*4882a593Smuzhiyun ) 172*4882a593Smuzhiyun ); 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun DEFINE_EVENT( 175*4882a593Smuzhiyun rvt_sge_template, rvt_sge_adjacent, 176*4882a593Smuzhiyun TP_PROTO(struct rvt_sge *sge, struct ib_sge *isge), 177*4882a593Smuzhiyun TP_ARGS(sge, isge)); 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun DEFINE_EVENT( 180*4882a593Smuzhiyun rvt_sge_template, rvt_sge_new, 181*4882a593Smuzhiyun TP_PROTO(struct rvt_sge *sge, struct ib_sge *isge), 182*4882a593Smuzhiyun TP_ARGS(sge, isge)); 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun TRACE_EVENT( 185*4882a593Smuzhiyun rvt_map_mr_sg, 186*4882a593Smuzhiyun TP_PROTO(struct ib_mr *ibmr, int sg_nents, unsigned int *sg_offset), 187*4882a593Smuzhiyun TP_ARGS(ibmr, sg_nents, sg_offset), 188*4882a593Smuzhiyun TP_STRUCT__entry( 189*4882a593Smuzhiyun RDI_DEV_ENTRY(ib_to_rvt(to_imr(ibmr)->mr.pd->device)) 190*4882a593Smuzhiyun __field(u64, iova) 191*4882a593Smuzhiyun __field(u64, ibmr_iova) 192*4882a593Smuzhiyun __field(u64, user_base) 193*4882a593Smuzhiyun __field(u64, ibmr_length) 194*4882a593Smuzhiyun __field(int, sg_nents) 195*4882a593Smuzhiyun __field(uint, sg_offset) 196*4882a593Smuzhiyun ), 197*4882a593Smuzhiyun TP_fast_assign( 198*4882a593Smuzhiyun RDI_DEV_ASSIGN(ib_to_rvt(to_imr(ibmr)->mr.pd->device)) 199*4882a593Smuzhiyun __entry->ibmr_iova = ibmr->iova; 200*4882a593Smuzhiyun __entry->iova = to_imr(ibmr)->mr.iova; 201*4882a593Smuzhiyun __entry->user_base = to_imr(ibmr)->mr.user_base; 202*4882a593Smuzhiyun __entry->ibmr_length = to_imr(ibmr)->mr.length; 203*4882a593Smuzhiyun __entry->sg_nents = sg_nents; 204*4882a593Smuzhiyun __entry->sg_offset = sg_offset ? *sg_offset : 0; 205*4882a593Smuzhiyun ), 206*4882a593Smuzhiyun TP_printk( 207*4882a593Smuzhiyun "[%s] ibmr_iova %llx iova %llx user_base %llx length %llx sg_nents %d sg_offset %u", 208*4882a593Smuzhiyun __get_str(dev), 209*4882a593Smuzhiyun __entry->ibmr_iova, 210*4882a593Smuzhiyun __entry->iova, 211*4882a593Smuzhiyun __entry->user_base, 212*4882a593Smuzhiyun __entry->ibmr_length, 213*4882a593Smuzhiyun __entry->sg_nents, 214*4882a593Smuzhiyun __entry->sg_offset 215*4882a593Smuzhiyun ) 216*4882a593Smuzhiyun ); 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun #endif /* __RVT_TRACE_MR_H */ 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun #undef TRACE_INCLUDE_PATH 221*4882a593Smuzhiyun #undef TRACE_INCLUDE_FILE 222*4882a593Smuzhiyun #define TRACE_INCLUDE_PATH . 223*4882a593Smuzhiyun #define TRACE_INCLUDE_FILE trace_mr 224*4882a593Smuzhiyun #include <trace/define_trace.h> 225