1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* Copyright(c) 2013 - 2018 Intel Corporation. */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun /* Modeled on trace-events-sample.h */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun /* The trace subsystem name for iavf will be "iavf". 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * This file is named iavf_trace.h. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Since this include file's name is different from the trace 11*4882a593Smuzhiyun * subsystem name, we'll have to define TRACE_INCLUDE_FILE at the end 12*4882a593Smuzhiyun * of this file. 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun #undef TRACE_SYSTEM 15*4882a593Smuzhiyun #define TRACE_SYSTEM iavf 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* See trace-events-sample.h for a detailed description of why this 18*4882a593Smuzhiyun * guard clause is different from most normal include files. 19*4882a593Smuzhiyun */ 20*4882a593Smuzhiyun #if !defined(_IAVF_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) 21*4882a593Smuzhiyun #define _IAVF_TRACE_H_ 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #include <linux/tracepoint.h> 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* 26*4882a593Smuzhiyun * iavf_trace() macro enables shared code to refer to trace points 27*4882a593Smuzhiyun * like: 28*4882a593Smuzhiyun * 29*4882a593Smuzhiyun * trace_iavf{,vf}_example(args...) 30*4882a593Smuzhiyun * 31*4882a593Smuzhiyun * ... as: 32*4882a593Smuzhiyun * 33*4882a593Smuzhiyun * iavf_trace(example, args...) 34*4882a593Smuzhiyun * 35*4882a593Smuzhiyun * ... to resolve to the PF or VF version of the tracepoint without 36*4882a593Smuzhiyun * ifdefs, and to allow tracepoints to be disabled entirely at build 37*4882a593Smuzhiyun * time. 38*4882a593Smuzhiyun * 39*4882a593Smuzhiyun * Trace point should always be referred to in the driver via this 40*4882a593Smuzhiyun * macro. 41*4882a593Smuzhiyun * 42*4882a593Smuzhiyun * Similarly, iavf_trace_enabled(trace_name) wraps references to 43*4882a593Smuzhiyun * trace_iavf{,vf}_<trace_name>_enabled() functions. 44*4882a593Smuzhiyun */ 45*4882a593Smuzhiyun #define _IAVF_TRACE_NAME(trace_name) (trace_ ## iavf ## _ ## trace_name) 46*4882a593Smuzhiyun #define IAVF_TRACE_NAME(trace_name) _IAVF_TRACE_NAME(trace_name) 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define iavf_trace(trace_name, args...) IAVF_TRACE_NAME(trace_name)(args) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define iavf_trace_enabled(trace_name) IAVF_TRACE_NAME(trace_name##_enabled)() 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* Events common to PF and VF. Corresponding versions will be defined 53*4882a593Smuzhiyun * for both, named trace_iavf_* and trace_iavf_*. The iavf_trace() 54*4882a593Smuzhiyun * macro above will select the right trace point name for the driver 55*4882a593Smuzhiyun * being built from shared code. 56*4882a593Smuzhiyun */ 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* Events related to a vsi & ring */ 59*4882a593Smuzhiyun DECLARE_EVENT_CLASS( 60*4882a593Smuzhiyun iavf_tx_template, 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun TP_PROTO(struct iavf_ring *ring, 63*4882a593Smuzhiyun struct iavf_tx_desc *desc, 64*4882a593Smuzhiyun struct iavf_tx_buffer *buf), 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun TP_ARGS(ring, desc, buf), 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* The convention here is to make the first fields in the 69*4882a593Smuzhiyun * TP_STRUCT match the TP_PROTO exactly. This enables the use 70*4882a593Smuzhiyun * of the args struct generated by the tplist tool (from the 71*4882a593Smuzhiyun * bcc-tools package) to be used for those fields. To access 72*4882a593Smuzhiyun * fields other than the tracepoint args will require the 73*4882a593Smuzhiyun * tplist output to be adjusted. 74*4882a593Smuzhiyun */ 75*4882a593Smuzhiyun TP_STRUCT__entry( 76*4882a593Smuzhiyun __field(void*, ring) 77*4882a593Smuzhiyun __field(void*, desc) 78*4882a593Smuzhiyun __field(void*, buf) 79*4882a593Smuzhiyun __string(devname, ring->netdev->name) 80*4882a593Smuzhiyun ), 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun TP_fast_assign( 83*4882a593Smuzhiyun __entry->ring = ring; 84*4882a593Smuzhiyun __entry->desc = desc; 85*4882a593Smuzhiyun __entry->buf = buf; 86*4882a593Smuzhiyun __assign_str(devname, ring->netdev->name); 87*4882a593Smuzhiyun ), 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun TP_printk( 90*4882a593Smuzhiyun "netdev: %s ring: %p desc: %p buf %p", 91*4882a593Smuzhiyun __get_str(devname), __entry->ring, 92*4882a593Smuzhiyun __entry->desc, __entry->buf) 93*4882a593Smuzhiyun ); 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun DEFINE_EVENT( 96*4882a593Smuzhiyun iavf_tx_template, iavf_clean_tx_irq, 97*4882a593Smuzhiyun TP_PROTO(struct iavf_ring *ring, 98*4882a593Smuzhiyun struct iavf_tx_desc *desc, 99*4882a593Smuzhiyun struct iavf_tx_buffer *buf), 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun TP_ARGS(ring, desc, buf)); 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun DEFINE_EVENT( 104*4882a593Smuzhiyun iavf_tx_template, iavf_clean_tx_irq_unmap, 105*4882a593Smuzhiyun TP_PROTO(struct iavf_ring *ring, 106*4882a593Smuzhiyun struct iavf_tx_desc *desc, 107*4882a593Smuzhiyun struct iavf_tx_buffer *buf), 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun TP_ARGS(ring, desc, buf)); 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun DECLARE_EVENT_CLASS( 112*4882a593Smuzhiyun iavf_rx_template, 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun TP_PROTO(struct iavf_ring *ring, 115*4882a593Smuzhiyun union iavf_32byte_rx_desc *desc, 116*4882a593Smuzhiyun struct sk_buff *skb), 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun TP_ARGS(ring, desc, skb), 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun TP_STRUCT__entry( 121*4882a593Smuzhiyun __field(void*, ring) 122*4882a593Smuzhiyun __field(void*, desc) 123*4882a593Smuzhiyun __field(void*, skb) 124*4882a593Smuzhiyun __string(devname, ring->netdev->name) 125*4882a593Smuzhiyun ), 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun TP_fast_assign( 128*4882a593Smuzhiyun __entry->ring = ring; 129*4882a593Smuzhiyun __entry->desc = desc; 130*4882a593Smuzhiyun __entry->skb = skb; 131*4882a593Smuzhiyun __assign_str(devname, ring->netdev->name); 132*4882a593Smuzhiyun ), 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun TP_printk( 135*4882a593Smuzhiyun "netdev: %s ring: %p desc: %p skb %p", 136*4882a593Smuzhiyun __get_str(devname), __entry->ring, 137*4882a593Smuzhiyun __entry->desc, __entry->skb) 138*4882a593Smuzhiyun ); 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun DEFINE_EVENT( 141*4882a593Smuzhiyun iavf_rx_template, iavf_clean_rx_irq, 142*4882a593Smuzhiyun TP_PROTO(struct iavf_ring *ring, 143*4882a593Smuzhiyun union iavf_32byte_rx_desc *desc, 144*4882a593Smuzhiyun struct sk_buff *skb), 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun TP_ARGS(ring, desc, skb)); 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun DEFINE_EVENT( 149*4882a593Smuzhiyun iavf_rx_template, iavf_clean_rx_irq_rx, 150*4882a593Smuzhiyun TP_PROTO(struct iavf_ring *ring, 151*4882a593Smuzhiyun union iavf_32byte_rx_desc *desc, 152*4882a593Smuzhiyun struct sk_buff *skb), 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun TP_ARGS(ring, desc, skb)); 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun DECLARE_EVENT_CLASS( 157*4882a593Smuzhiyun iavf_xmit_template, 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun TP_PROTO(struct sk_buff *skb, 160*4882a593Smuzhiyun struct iavf_ring *ring), 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun TP_ARGS(skb, ring), 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun TP_STRUCT__entry( 165*4882a593Smuzhiyun __field(void*, skb) 166*4882a593Smuzhiyun __field(void*, ring) 167*4882a593Smuzhiyun __string(devname, ring->netdev->name) 168*4882a593Smuzhiyun ), 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun TP_fast_assign( 171*4882a593Smuzhiyun __entry->skb = skb; 172*4882a593Smuzhiyun __entry->ring = ring; 173*4882a593Smuzhiyun __assign_str(devname, ring->netdev->name); 174*4882a593Smuzhiyun ), 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun TP_printk( 177*4882a593Smuzhiyun "netdev: %s skb: %p ring: %p", 178*4882a593Smuzhiyun __get_str(devname), __entry->skb, 179*4882a593Smuzhiyun __entry->ring) 180*4882a593Smuzhiyun ); 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun DEFINE_EVENT( 183*4882a593Smuzhiyun iavf_xmit_template, iavf_xmit_frame_ring, 184*4882a593Smuzhiyun TP_PROTO(struct sk_buff *skb, 185*4882a593Smuzhiyun struct iavf_ring *ring), 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun TP_ARGS(skb, ring)); 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun DEFINE_EVENT( 190*4882a593Smuzhiyun iavf_xmit_template, iavf_xmit_frame_ring_drop, 191*4882a593Smuzhiyun TP_PROTO(struct sk_buff *skb, 192*4882a593Smuzhiyun struct iavf_ring *ring), 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun TP_ARGS(skb, ring)); 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun /* Events unique to the VF. */ 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun #endif /* _IAVF_TRACE_H_ */ 199*4882a593Smuzhiyun /* This must be outside ifdef _IAVF_TRACE_H */ 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /* This trace include file is not located in the .../include/trace 202*4882a593Smuzhiyun * with the kernel tracepoint definitions, because we're a loadable 203*4882a593Smuzhiyun * module. 204*4882a593Smuzhiyun */ 205*4882a593Smuzhiyun #undef TRACE_INCLUDE_PATH 206*4882a593Smuzhiyun #define TRACE_INCLUDE_PATH . 207*4882a593Smuzhiyun #undef TRACE_INCLUDE_FILE 208*4882a593Smuzhiyun #define TRACE_INCLUDE_FILE iavf_trace 209*4882a593Smuzhiyun #include <trace/define_trace.h> 210