18e8d7f13SDavid Howells /* AFS tracepoints 28e8d7f13SDavid Howells * 38e8d7f13SDavid Howells * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved. 48e8d7f13SDavid Howells * Written by David Howells (dhowells@redhat.com) 58e8d7f13SDavid Howells * 68e8d7f13SDavid Howells * This program is free software; you can redistribute it and/or 78e8d7f13SDavid Howells * modify it under the terms of the GNU General Public Licence 88e8d7f13SDavid Howells * as published by the Free Software Foundation; either version 98e8d7f13SDavid Howells * 2 of the Licence, or (at your option) any later version. 108e8d7f13SDavid Howells */ 118e8d7f13SDavid Howells #undef TRACE_SYSTEM 128e8d7f13SDavid Howells #define TRACE_SYSTEM afs 138e8d7f13SDavid Howells 148e8d7f13SDavid Howells #if !defined(_TRACE_AFS_H) || defined(TRACE_HEADER_MULTI_READ) 158e8d7f13SDavid Howells #define _TRACE_AFS_H 168e8d7f13SDavid Howells 178e8d7f13SDavid Howells #include <linux/tracepoint.h> 188e8d7f13SDavid Howells 19*341f741fSDavid Howells /* 20*341f741fSDavid Howells * Define enums for tracing information. 21*341f741fSDavid Howells */ 22*341f741fSDavid Howells #ifndef __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY 23*341f741fSDavid Howells #define __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY 24*341f741fSDavid Howells 25*341f741fSDavid Howells enum afs_call_trace { 26*341f741fSDavid Howells afs_call_trace_alloc, 27*341f741fSDavid Howells afs_call_trace_free, 28*341f741fSDavid Howells afs_call_trace_put, 29*341f741fSDavid Howells afs_call_trace_wake, 30*341f741fSDavid Howells afs_call_trace_work, 31*341f741fSDavid Howells }; 32*341f741fSDavid Howells 33*341f741fSDavid Howells #endif /* end __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY */ 34*341f741fSDavid Howells 35*341f741fSDavid Howells /* 36*341f741fSDavid Howells * Declare tracing information enums and their string mappings for display. 37*341f741fSDavid Howells */ 38*341f741fSDavid Howells #define afs_call_traces \ 39*341f741fSDavid Howells EM(afs_call_trace_alloc, "ALLOC") \ 40*341f741fSDavid Howells EM(afs_call_trace_free, "FREE ") \ 41*341f741fSDavid Howells EM(afs_call_trace_put, "PUT ") \ 42*341f741fSDavid Howells EM(afs_call_trace_wake, "WAKE ") \ 43*341f741fSDavid Howells E_(afs_call_trace_work, "WORK ") 44*341f741fSDavid Howells 45*341f741fSDavid Howells /* 46*341f741fSDavid Howells * Export enum symbols via userspace. 47*341f741fSDavid Howells */ 48*341f741fSDavid Howells #undef EM 49*341f741fSDavid Howells #undef E_ 50*341f741fSDavid Howells #define EM(a, b) TRACE_DEFINE_ENUM(a); 51*341f741fSDavid Howells #define E_(a, b) TRACE_DEFINE_ENUM(a); 52*341f741fSDavid Howells 53*341f741fSDavid Howells afs_call_traces; 54*341f741fSDavid Howells 55*341f741fSDavid Howells /* 56*341f741fSDavid Howells * Now redefine the EM() and E_() macros to map the enums to the strings that 57*341f741fSDavid Howells * will be printed in the output. 58*341f741fSDavid Howells */ 59*341f741fSDavid Howells #undef EM 60*341f741fSDavid Howells #undef E_ 61*341f741fSDavid Howells #define EM(a, b) { a, b }, 62*341f741fSDavid Howells #define E_(a, b) { a, b } 63*341f741fSDavid Howells 648e8d7f13SDavid Howells TRACE_EVENT(afs_recv_data, 658e8d7f13SDavid Howells TP_PROTO(struct afs_call *call, unsigned count, unsigned offset, 668e8d7f13SDavid Howells bool want_more, int ret), 678e8d7f13SDavid Howells 688e8d7f13SDavid Howells TP_ARGS(call, count, offset, want_more, ret), 698e8d7f13SDavid Howells 708e8d7f13SDavid Howells TP_STRUCT__entry( 718e8d7f13SDavid Howells __field(struct rxrpc_call *, rxcall ) 728e8d7f13SDavid Howells __field(struct afs_call *, call ) 738e8d7f13SDavid Howells __field(enum afs_call_state, state ) 748e8d7f13SDavid Howells __field(unsigned int, count ) 758e8d7f13SDavid Howells __field(unsigned int, offset ) 768e8d7f13SDavid Howells __field(unsigned short, unmarshall ) 778e8d7f13SDavid Howells __field(bool, want_more ) 788e8d7f13SDavid Howells __field(int, ret ) 798e8d7f13SDavid Howells ), 808e8d7f13SDavid Howells 818e8d7f13SDavid Howells TP_fast_assign( 828e8d7f13SDavid Howells __entry->rxcall = call->rxcall; 838e8d7f13SDavid Howells __entry->call = call; 848e8d7f13SDavid Howells __entry->state = call->state; 858e8d7f13SDavid Howells __entry->unmarshall = call->unmarshall; 868e8d7f13SDavid Howells __entry->count = count; 878e8d7f13SDavid Howells __entry->offset = offset; 888e8d7f13SDavid Howells __entry->want_more = want_more; 898e8d7f13SDavid Howells __entry->ret = ret; 908e8d7f13SDavid Howells ), 918e8d7f13SDavid Howells 928e8d7f13SDavid Howells TP_printk("c=%p ac=%p s=%u u=%u %u/%u wm=%u ret=%d", 938e8d7f13SDavid Howells __entry->rxcall, 948e8d7f13SDavid Howells __entry->call, 958e8d7f13SDavid Howells __entry->state, __entry->unmarshall, 968e8d7f13SDavid Howells __entry->offset, __entry->count, 978e8d7f13SDavid Howells __entry->want_more, __entry->ret) 988e8d7f13SDavid Howells ); 998e8d7f13SDavid Howells 1008e8d7f13SDavid Howells TRACE_EVENT(afs_notify_call, 1018e8d7f13SDavid Howells TP_PROTO(struct rxrpc_call *rxcall, struct afs_call *call), 1028e8d7f13SDavid Howells 1038e8d7f13SDavid Howells TP_ARGS(rxcall, call), 1048e8d7f13SDavid Howells 1058e8d7f13SDavid Howells TP_STRUCT__entry( 1068e8d7f13SDavid Howells __field(struct rxrpc_call *, rxcall ) 1078e8d7f13SDavid Howells __field(struct afs_call *, call ) 1088e8d7f13SDavid Howells __field(enum afs_call_state, state ) 1098e8d7f13SDavid Howells __field(unsigned short, unmarshall ) 1108e8d7f13SDavid Howells ), 1118e8d7f13SDavid Howells 1128e8d7f13SDavid Howells TP_fast_assign( 1138e8d7f13SDavid Howells __entry->rxcall = rxcall; 1148e8d7f13SDavid Howells __entry->call = call; 1158e8d7f13SDavid Howells __entry->state = call->state; 1168e8d7f13SDavid Howells __entry->unmarshall = call->unmarshall; 1178e8d7f13SDavid Howells ), 1188e8d7f13SDavid Howells 1198e8d7f13SDavid Howells TP_printk("c=%p ac=%p s=%u u=%u", 1208e8d7f13SDavid Howells __entry->rxcall, 1218e8d7f13SDavid Howells __entry->call, 1228e8d7f13SDavid Howells __entry->state, __entry->unmarshall) 1238e8d7f13SDavid Howells ); 1248e8d7f13SDavid Howells 1258e8d7f13SDavid Howells TRACE_EVENT(afs_cb_call, 1268e8d7f13SDavid Howells TP_PROTO(struct afs_call *call), 1278e8d7f13SDavid Howells 1288e8d7f13SDavid Howells TP_ARGS(call), 1298e8d7f13SDavid Howells 1308e8d7f13SDavid Howells TP_STRUCT__entry( 1318e8d7f13SDavid Howells __field(struct rxrpc_call *, rxcall ) 1328e8d7f13SDavid Howells __field(struct afs_call *, call ) 1338e8d7f13SDavid Howells __field(const char *, name ) 1348e8d7f13SDavid Howells __field(u32, op ) 1358e8d7f13SDavid Howells ), 1368e8d7f13SDavid Howells 1378e8d7f13SDavid Howells TP_fast_assign( 1388e8d7f13SDavid Howells __entry->rxcall = call->rxcall; 1398e8d7f13SDavid Howells __entry->call = call; 1408e8d7f13SDavid Howells __entry->name = call->type->name; 1418e8d7f13SDavid Howells __entry->op = call->operation_ID; 1428e8d7f13SDavid Howells ), 1438e8d7f13SDavid Howells 1448e8d7f13SDavid Howells TP_printk("c=%p ac=%p %s o=%u", 1458e8d7f13SDavid Howells __entry->rxcall, 1468e8d7f13SDavid Howells __entry->call, 1478e8d7f13SDavid Howells __entry->name, 1488e8d7f13SDavid Howells __entry->op) 1498e8d7f13SDavid Howells ); 1508e8d7f13SDavid Howells 151*341f741fSDavid Howells TRACE_EVENT(afs_call, 152*341f741fSDavid Howells TP_PROTO(struct afs_call *call, enum afs_call_trace op, 153*341f741fSDavid Howells int usage, int outstanding, const void *where), 154*341f741fSDavid Howells 155*341f741fSDavid Howells TP_ARGS(call, op, usage, outstanding, where), 156*341f741fSDavid Howells 157*341f741fSDavid Howells TP_STRUCT__entry( 158*341f741fSDavid Howells __field(struct afs_call *, call ) 159*341f741fSDavid Howells __field(int, op ) 160*341f741fSDavid Howells __field(int, usage ) 161*341f741fSDavid Howells __field(int, outstanding ) 162*341f741fSDavid Howells __field(const void *, where ) 163*341f741fSDavid Howells ), 164*341f741fSDavid Howells 165*341f741fSDavid Howells TP_fast_assign( 166*341f741fSDavid Howells __entry->call = call; 167*341f741fSDavid Howells __entry->op = op; 168*341f741fSDavid Howells __entry->usage = usage; 169*341f741fSDavid Howells __entry->outstanding = outstanding; 170*341f741fSDavid Howells __entry->where = where; 171*341f741fSDavid Howells ), 172*341f741fSDavid Howells 173*341f741fSDavid Howells TP_printk("c=%p %s u=%d o=%d sp=%pSR", 174*341f741fSDavid Howells __entry->call, 175*341f741fSDavid Howells __print_symbolic(__entry->op, afs_call_traces), 176*341f741fSDavid Howells __entry->usage, 177*341f741fSDavid Howells __entry->outstanding, 178*341f741fSDavid Howells __entry->where) 179*341f741fSDavid Howells ); 180*341f741fSDavid Howells 1818e8d7f13SDavid Howells #endif /* _TRACE_AFS_H */ 1828e8d7f13SDavid Howells 1838e8d7f13SDavid Howells /* This part must be outside protection */ 1848e8d7f13SDavid Howells #include <trace/define_trace.h> 185