1df844fd4SDavid Howells /* AF_RXRPC tracepoints 2df844fd4SDavid Howells * 3df844fd4SDavid Howells * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved. 4df844fd4SDavid Howells * Written by David Howells (dhowells@redhat.com) 5df844fd4SDavid Howells * 6df844fd4SDavid Howells * This program is free software; you can redistribute it and/or 7df844fd4SDavid Howells * modify it under the terms of the GNU General Public Licence 8df844fd4SDavid Howells * as published by the Free Software Foundation; either version 9df844fd4SDavid Howells * 2 of the Licence, or (at your option) any later version. 10df844fd4SDavid Howells */ 11df844fd4SDavid Howells #undef TRACE_SYSTEM 12df844fd4SDavid Howells #define TRACE_SYSTEM rxrpc 13df844fd4SDavid Howells 14df844fd4SDavid Howells #if !defined(_TRACE_RXRPC_H) || defined(TRACE_HEADER_MULTI_READ) 15df844fd4SDavid Howells #define _TRACE_RXRPC_H 16df844fd4SDavid Howells 17df844fd4SDavid Howells #include <linux/tracepoint.h> 18df844fd4SDavid Howells 19363deeabSDavid Howells TRACE_EVENT(rxrpc_conn, 20363deeabSDavid Howells TP_PROTO(struct rxrpc_connection *conn, enum rxrpc_conn_trace op, 21363deeabSDavid Howells int usage, const void *where), 22363deeabSDavid Howells 23363deeabSDavid Howells TP_ARGS(conn, op, usage, where), 24363deeabSDavid Howells 25363deeabSDavid Howells TP_STRUCT__entry( 26363deeabSDavid Howells __field(struct rxrpc_connection *, conn ) 27363deeabSDavid Howells __field(int, op ) 28363deeabSDavid Howells __field(int, usage ) 29363deeabSDavid Howells __field(const void *, where ) 30363deeabSDavid Howells ), 31363deeabSDavid Howells 32363deeabSDavid Howells TP_fast_assign( 33363deeabSDavid Howells __entry->conn = conn; 34363deeabSDavid Howells __entry->op = op; 35363deeabSDavid Howells __entry->usage = usage; 36363deeabSDavid Howells __entry->where = where; 37363deeabSDavid Howells ), 38363deeabSDavid Howells 39363deeabSDavid Howells TP_printk("C=%p %s u=%d sp=%pSR", 40363deeabSDavid Howells __entry->conn, 41363deeabSDavid Howells rxrpc_conn_traces[__entry->op], 42363deeabSDavid Howells __entry->usage, 43363deeabSDavid Howells __entry->where) 44363deeabSDavid Howells ); 45363deeabSDavid Howells 46363deeabSDavid Howells TRACE_EVENT(rxrpc_client, 47363deeabSDavid Howells TP_PROTO(struct rxrpc_connection *conn, int channel, 48363deeabSDavid Howells enum rxrpc_client_trace op), 49363deeabSDavid Howells 50363deeabSDavid Howells TP_ARGS(conn, channel, op), 51363deeabSDavid Howells 52363deeabSDavid Howells TP_STRUCT__entry( 53363deeabSDavid Howells __field(struct rxrpc_connection *, conn ) 54363deeabSDavid Howells __field(u32, cid ) 55363deeabSDavid Howells __field(int, channel ) 56363deeabSDavid Howells __field(int, usage ) 57363deeabSDavid Howells __field(enum rxrpc_client_trace, op ) 58363deeabSDavid Howells __field(enum rxrpc_conn_cache_state, cs ) 59363deeabSDavid Howells ), 60363deeabSDavid Howells 61363deeabSDavid Howells TP_fast_assign( 62363deeabSDavid Howells __entry->conn = conn; 63363deeabSDavid Howells __entry->channel = channel; 64363deeabSDavid Howells __entry->usage = atomic_read(&conn->usage); 65363deeabSDavid Howells __entry->op = op; 66363deeabSDavid Howells __entry->cid = conn->proto.cid; 67363deeabSDavid Howells __entry->cs = conn->cache_state; 68363deeabSDavid Howells ), 69363deeabSDavid Howells 70363deeabSDavid Howells TP_printk("C=%p h=%2d %s %s i=%08x u=%d", 71363deeabSDavid Howells __entry->conn, 72363deeabSDavid Howells __entry->channel, 73363deeabSDavid Howells rxrpc_client_traces[__entry->op], 74363deeabSDavid Howells rxrpc_conn_cache_states[__entry->cs], 75363deeabSDavid Howells __entry->cid, 76363deeabSDavid Howells __entry->usage) 77363deeabSDavid Howells ); 78363deeabSDavid Howells 79e34d4234SDavid Howells TRACE_EVENT(rxrpc_call, 80fff72429SDavid Howells TP_PROTO(struct rxrpc_call *call, enum rxrpc_call_trace op, 812ab27215SDavid Howells int usage, const void *where, const void *aux), 82e34d4234SDavid Howells 832ab27215SDavid Howells TP_ARGS(call, op, usage, where, aux), 84e34d4234SDavid Howells 85e34d4234SDavid Howells TP_STRUCT__entry( 86e34d4234SDavid Howells __field(struct rxrpc_call *, call ) 87e34d4234SDavid Howells __field(int, op ) 88e34d4234SDavid Howells __field(int, usage ) 89e34d4234SDavid Howells __field(const void *, where ) 90e34d4234SDavid Howells __field(const void *, aux ) 91e34d4234SDavid Howells ), 92e34d4234SDavid Howells 93e34d4234SDavid Howells TP_fast_assign( 94e34d4234SDavid Howells __entry->call = call; 95e34d4234SDavid Howells __entry->op = op; 96e34d4234SDavid Howells __entry->usage = usage; 97e34d4234SDavid Howells __entry->where = where; 98e34d4234SDavid Howells __entry->aux = aux; 99e34d4234SDavid Howells ), 100e34d4234SDavid Howells 1012ab27215SDavid Howells TP_printk("c=%p %s u=%d sp=%pSR a=%p", 102e34d4234SDavid Howells __entry->call, 103fff72429SDavid Howells rxrpc_call_traces[__entry->op], 104e34d4234SDavid Howells __entry->usage, 105e34d4234SDavid Howells __entry->where, 106e34d4234SDavid Howells __entry->aux) 107e34d4234SDavid Howells ); 108e34d4234SDavid Howells 109df844fd4SDavid Howells TRACE_EVENT(rxrpc_skb, 110df844fd4SDavid Howells TP_PROTO(struct sk_buff *skb, int op, int usage, int mod_count, 111df844fd4SDavid Howells const void *where), 112df844fd4SDavid Howells 113df844fd4SDavid Howells TP_ARGS(skb, op, usage, mod_count, where), 114df844fd4SDavid Howells 115df844fd4SDavid Howells TP_STRUCT__entry( 116df844fd4SDavid Howells __field(struct sk_buff *, skb ) 117df844fd4SDavid Howells __field(int, op ) 118df844fd4SDavid Howells __field(int, usage ) 119df844fd4SDavid Howells __field(int, mod_count ) 120df844fd4SDavid Howells __field(const void *, where ) 121df844fd4SDavid Howells ), 122df844fd4SDavid Howells 123df844fd4SDavid Howells TP_fast_assign( 124df844fd4SDavid Howells __entry->skb = skb; 125df844fd4SDavid Howells __entry->op = op; 126df844fd4SDavid Howells __entry->usage = usage; 127df844fd4SDavid Howells __entry->mod_count = mod_count; 128df844fd4SDavid Howells __entry->where = where; 129df844fd4SDavid Howells ), 130df844fd4SDavid Howells 131df844fd4SDavid Howells TP_printk("s=%p %s u=%d m=%d p=%pSR", 132df844fd4SDavid Howells __entry->skb, 133df844fd4SDavid Howells (__entry->op == 0 ? "NEW" : 134df844fd4SDavid Howells __entry->op == 1 ? "SEE" : 135df844fd4SDavid Howells __entry->op == 2 ? "GET" : 136df844fd4SDavid Howells __entry->op == 3 ? "FRE" : 137df844fd4SDavid Howells "PUR"), 138df844fd4SDavid Howells __entry->usage, 139df844fd4SDavid Howells __entry->mod_count, 140df844fd4SDavid Howells __entry->where) 141df844fd4SDavid Howells ); 142df844fd4SDavid Howells 14349e19ec7SDavid Howells TRACE_EVENT(rxrpc_rx_packet, 14449e19ec7SDavid Howells TP_PROTO(struct rxrpc_skb_priv *sp), 14549e19ec7SDavid Howells 14649e19ec7SDavid Howells TP_ARGS(sp), 14749e19ec7SDavid Howells 14849e19ec7SDavid Howells TP_STRUCT__entry( 14949e19ec7SDavid Howells __field_struct(struct rxrpc_host_header, hdr ) 15049e19ec7SDavid Howells ), 15149e19ec7SDavid Howells 15249e19ec7SDavid Howells TP_fast_assign( 15349e19ec7SDavid Howells memcpy(&__entry->hdr, &sp->hdr, sizeof(__entry->hdr)); 15449e19ec7SDavid Howells ), 15549e19ec7SDavid Howells 156a3868bfcSDavid Howells TP_printk("%08x:%08x:%08x:%04x %08x %08x %02x %02x %s", 15749e19ec7SDavid Howells __entry->hdr.epoch, __entry->hdr.cid, 15849e19ec7SDavid Howells __entry->hdr.callNumber, __entry->hdr.serviceId, 15949e19ec7SDavid Howells __entry->hdr.serial, __entry->hdr.seq, 160a3868bfcSDavid Howells __entry->hdr.type, __entry->hdr.flags, 161a3868bfcSDavid Howells __entry->hdr.type <= 15 ? rxrpc_pkts[__entry->hdr.type] : "?UNK") 16249e19ec7SDavid Howells ); 16349e19ec7SDavid Howells 16449e19ec7SDavid Howells TRACE_EVENT(rxrpc_rx_done, 16549e19ec7SDavid Howells TP_PROTO(int result, int abort_code), 16649e19ec7SDavid Howells 16749e19ec7SDavid Howells TP_ARGS(result, abort_code), 16849e19ec7SDavid Howells 16949e19ec7SDavid Howells TP_STRUCT__entry( 17049e19ec7SDavid Howells __field(int, result ) 17149e19ec7SDavid Howells __field(int, abort_code ) 17249e19ec7SDavid Howells ), 17349e19ec7SDavid Howells 17449e19ec7SDavid Howells TP_fast_assign( 17549e19ec7SDavid Howells __entry->result = result; 17649e19ec7SDavid Howells __entry->abort_code = abort_code; 17749e19ec7SDavid Howells ), 17849e19ec7SDavid Howells 17949e19ec7SDavid Howells TP_printk("r=%d a=%d", __entry->result, __entry->abort_code) 18049e19ec7SDavid Howells ); 18149e19ec7SDavid Howells 1825a42976dSDavid Howells TRACE_EVENT(rxrpc_abort, 1835a42976dSDavid Howells TP_PROTO(const char *why, u32 cid, u32 call_id, rxrpc_seq_t seq, 1845a42976dSDavid Howells int abort_code, int error), 1855a42976dSDavid Howells 1865a42976dSDavid Howells TP_ARGS(why, cid, call_id, seq, abort_code, error), 1875a42976dSDavid Howells 1885a42976dSDavid Howells TP_STRUCT__entry( 1895a42976dSDavid Howells __array(char, why, 4 ) 1905a42976dSDavid Howells __field(u32, cid ) 1915a42976dSDavid Howells __field(u32, call_id ) 1925a42976dSDavid Howells __field(rxrpc_seq_t, seq ) 1935a42976dSDavid Howells __field(int, abort_code ) 1945a42976dSDavid Howells __field(int, error ) 1955a42976dSDavid Howells ), 1965a42976dSDavid Howells 1975a42976dSDavid Howells TP_fast_assign( 1985a42976dSDavid Howells memcpy(__entry->why, why, 4); 1995a42976dSDavid Howells __entry->cid = cid; 2005a42976dSDavid Howells __entry->call_id = call_id; 2015a42976dSDavid Howells __entry->abort_code = abort_code; 2025a42976dSDavid Howells __entry->error = error; 2035a42976dSDavid Howells __entry->seq = seq; 2045a42976dSDavid Howells ), 2055a42976dSDavid Howells 2065a42976dSDavid Howells TP_printk("%08x:%08x s=%u a=%d e=%d %s", 2075a42976dSDavid Howells __entry->cid, __entry->call_id, __entry->seq, 2085a42976dSDavid Howells __entry->abort_code, __entry->error, __entry->why) 2095a42976dSDavid Howells ); 2105a42976dSDavid Howells 211a124fe3eSDavid Howells TRACE_EVENT(rxrpc_transmit, 212a124fe3eSDavid Howells TP_PROTO(struct rxrpc_call *call, enum rxrpc_transmit_trace why), 213a124fe3eSDavid Howells 214a124fe3eSDavid Howells TP_ARGS(call, why), 215a124fe3eSDavid Howells 216a124fe3eSDavid Howells TP_STRUCT__entry( 217a124fe3eSDavid Howells __field(struct rxrpc_call *, call ) 218a124fe3eSDavid Howells __field(enum rxrpc_transmit_trace, why ) 219a124fe3eSDavid Howells __field(rxrpc_seq_t, tx_hard_ack ) 220a124fe3eSDavid Howells __field(rxrpc_seq_t, tx_top ) 221a124fe3eSDavid Howells ), 222a124fe3eSDavid Howells 223a124fe3eSDavid Howells TP_fast_assign( 224a124fe3eSDavid Howells __entry->call = call; 225a124fe3eSDavid Howells __entry->why = why; 226a124fe3eSDavid Howells __entry->tx_hard_ack = call->tx_hard_ack; 227a124fe3eSDavid Howells __entry->tx_top = call->tx_top; 228a124fe3eSDavid Howells ), 229a124fe3eSDavid Howells 230a124fe3eSDavid Howells TP_printk("c=%p %s f=%08x n=%u", 231a124fe3eSDavid Howells __entry->call, 232a124fe3eSDavid Howells rxrpc_transmit_traces[__entry->why], 233a124fe3eSDavid Howells __entry->tx_hard_ack + 1, 234a124fe3eSDavid Howells __entry->tx_top - __entry->tx_hard_ack) 235a124fe3eSDavid Howells ); 236a124fe3eSDavid Howells 237ec71eb9aSDavid Howells TRACE_EVENT(rxrpc_rx_ack, 238ec71eb9aSDavid Howells TP_PROTO(struct rxrpc_call *call, rxrpc_seq_t first, u8 reason, u8 n_acks), 239ec71eb9aSDavid Howells 240ec71eb9aSDavid Howells TP_ARGS(call, first, reason, n_acks), 241ec71eb9aSDavid Howells 242ec71eb9aSDavid Howells TP_STRUCT__entry( 243ec71eb9aSDavid Howells __field(struct rxrpc_call *, call ) 244ec71eb9aSDavid Howells __field(rxrpc_seq_t, first ) 245ec71eb9aSDavid Howells __field(u8, reason ) 246ec71eb9aSDavid Howells __field(u8, n_acks ) 247ec71eb9aSDavid Howells ), 248ec71eb9aSDavid Howells 249ec71eb9aSDavid Howells TP_fast_assign( 250ec71eb9aSDavid Howells __entry->call = call; 251ec71eb9aSDavid Howells __entry->first = first; 252ec71eb9aSDavid Howells __entry->reason = reason; 253ec71eb9aSDavid Howells __entry->n_acks = n_acks; 254ec71eb9aSDavid Howells ), 255ec71eb9aSDavid Howells 256ec71eb9aSDavid Howells TP_printk("c=%p %s f=%08x n=%u", 257ec71eb9aSDavid Howells __entry->call, 258ec71eb9aSDavid Howells rxrpc_acks(__entry->reason), 259ec71eb9aSDavid Howells __entry->first, 260ec71eb9aSDavid Howells __entry->n_acks) 261ec71eb9aSDavid Howells ); 262ec71eb9aSDavid Howells 263f3639df2SDavid Howells TRACE_EVENT(rxrpc_tx_ack, 264f3639df2SDavid Howells TP_PROTO(struct rxrpc_call *call, rxrpc_seq_t first, 265f3639df2SDavid Howells rxrpc_serial_t serial, u8 reason, u8 n_acks), 266f3639df2SDavid Howells 267f3639df2SDavid Howells TP_ARGS(call, first, serial, reason, n_acks), 268f3639df2SDavid Howells 269f3639df2SDavid Howells TP_STRUCT__entry( 270f3639df2SDavid Howells __field(struct rxrpc_call *, call ) 271f3639df2SDavid Howells __field(rxrpc_seq_t, first ) 272f3639df2SDavid Howells __field(rxrpc_serial_t, serial ) 273f3639df2SDavid Howells __field(u8, reason ) 274f3639df2SDavid Howells __field(u8, n_acks ) 275f3639df2SDavid Howells ), 276f3639df2SDavid Howells 277f3639df2SDavid Howells TP_fast_assign( 278f3639df2SDavid Howells __entry->call = call; 279f3639df2SDavid Howells __entry->first = first; 280f3639df2SDavid Howells __entry->serial = serial; 281f3639df2SDavid Howells __entry->reason = reason; 282f3639df2SDavid Howells __entry->n_acks = n_acks; 283f3639df2SDavid Howells ), 284f3639df2SDavid Howells 285f3639df2SDavid Howells TP_printk("c=%p %s f=%08x r=%08x n=%u", 286f3639df2SDavid Howells __entry->call, 287f3639df2SDavid Howells rxrpc_acks(__entry->reason), 288f3639df2SDavid Howells __entry->first, 289f3639df2SDavid Howells __entry->serial, 290f3639df2SDavid Howells __entry->n_acks) 291f3639df2SDavid Howells ); 292f3639df2SDavid Howells 29358dc63c9SDavid Howells TRACE_EVENT(rxrpc_receive, 29458dc63c9SDavid Howells TP_PROTO(struct rxrpc_call *call, enum rxrpc_receive_trace why, 29558dc63c9SDavid Howells rxrpc_serial_t serial, rxrpc_seq_t seq), 29658dc63c9SDavid Howells 29758dc63c9SDavid Howells TP_ARGS(call, why, serial, seq), 29858dc63c9SDavid Howells 29958dc63c9SDavid Howells TP_STRUCT__entry( 30058dc63c9SDavid Howells __field(struct rxrpc_call *, call ) 30158dc63c9SDavid Howells __field(enum rxrpc_receive_trace, why ) 30258dc63c9SDavid Howells __field(rxrpc_serial_t, serial ) 30358dc63c9SDavid Howells __field(rxrpc_seq_t, seq ) 30458dc63c9SDavid Howells __field(rxrpc_seq_t, hard_ack ) 30558dc63c9SDavid Howells __field(rxrpc_seq_t, top ) 30658dc63c9SDavid Howells ), 30758dc63c9SDavid Howells 30858dc63c9SDavid Howells TP_fast_assign( 30958dc63c9SDavid Howells __entry->call = call; 31058dc63c9SDavid Howells __entry->why = why; 31158dc63c9SDavid Howells __entry->serial = serial; 31258dc63c9SDavid Howells __entry->seq = seq; 31358dc63c9SDavid Howells __entry->hard_ack = call->rx_hard_ack; 31458dc63c9SDavid Howells __entry->top = call->rx_top; 31558dc63c9SDavid Howells ), 31658dc63c9SDavid Howells 31758dc63c9SDavid Howells TP_printk("c=%p %s r=%08x q=%08x w=%08x-%08x", 31858dc63c9SDavid Howells __entry->call, 31958dc63c9SDavid Howells rxrpc_receive_traces[__entry->why], 32058dc63c9SDavid Howells __entry->serial, 32158dc63c9SDavid Howells __entry->seq, 32258dc63c9SDavid Howells __entry->hard_ack, 32358dc63c9SDavid Howells __entry->top) 32458dc63c9SDavid Howells ); 32558dc63c9SDavid Howells 326*84997905SDavid Howells TRACE_EVENT(rxrpc_recvmsg, 327*84997905SDavid Howells TP_PROTO(struct rxrpc_call *call, enum rxrpc_recvmsg_trace why, 328*84997905SDavid Howells rxrpc_seq_t seq, unsigned int offset, unsigned int len, 329*84997905SDavid Howells int ret), 330*84997905SDavid Howells 331*84997905SDavid Howells TP_ARGS(call, why, seq, offset, len, ret), 332*84997905SDavid Howells 333*84997905SDavid Howells TP_STRUCT__entry( 334*84997905SDavid Howells __field(struct rxrpc_call *, call ) 335*84997905SDavid Howells __field(enum rxrpc_recvmsg_trace, why ) 336*84997905SDavid Howells __field(rxrpc_seq_t, seq ) 337*84997905SDavid Howells __field(unsigned int, offset ) 338*84997905SDavid Howells __field(unsigned int, len ) 339*84997905SDavid Howells __field(int, ret ) 340*84997905SDavid Howells ), 341*84997905SDavid Howells 342*84997905SDavid Howells TP_fast_assign( 343*84997905SDavid Howells __entry->call = call; 344*84997905SDavid Howells __entry->why = why; 345*84997905SDavid Howells __entry->seq = seq; 346*84997905SDavid Howells __entry->offset = offset; 347*84997905SDavid Howells __entry->len = len; 348*84997905SDavid Howells __entry->ret = ret; 349*84997905SDavid Howells ), 350*84997905SDavid Howells 351*84997905SDavid Howells TP_printk("c=%p %s q=%08x o=%u l=%u ret=%d", 352*84997905SDavid Howells __entry->call, 353*84997905SDavid Howells rxrpc_recvmsg_traces[__entry->why], 354*84997905SDavid Howells __entry->seq, 355*84997905SDavid Howells __entry->offset, 356*84997905SDavid Howells __entry->len, 357*84997905SDavid Howells __entry->ret) 358*84997905SDavid Howells ); 359*84997905SDavid Howells 360df844fd4SDavid Howells #endif /* _TRACE_RXRPC_H */ 361df844fd4SDavid Howells 362df844fd4SDavid Howells /* This part must be outside protection */ 363df844fd4SDavid Howells #include <trace/define_trace.h> 364