| /* AFS tracepoints | |
| * | |
| * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved. | |
| * Written by David Howells (dhowells@redhat.com) | |
| * | |
| * This program is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU General Public Licence | |
| * as published by the Free Software Foundation; either version | |
| * 2 of the Licence, or (at your option) any later version. | |
| */ | |
| #undef TRACE_SYSTEM | |
| #define TRACE_SYSTEM afs | |
| #if !defined(_TRACE_AFS_H) || defined(TRACE_HEADER_MULTI_READ) | |
| #define _TRACE_AFS_H | |
| #include <linux/tracepoint.h> | |
| /* | |
| * Define enums for tracing information. | |
| */ | |
| #ifndef __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY | |
| #define __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY | |
| enum afs_call_trace { | |
| afs_call_trace_alloc, | |
| afs_call_trace_free, | |
| afs_call_trace_put, | |
| afs_call_trace_wake, | |
| afs_call_trace_work, | |
| }; | |
| #endif /* end __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY */ | |
| /* | |
| * Declare tracing information enums and their string mappings for display. | |
| */ | |
| #define afs_call_traces \ | |
| EM(afs_call_trace_alloc, "ALLOC") \ | |
| EM(afs_call_trace_free, "FREE ") \ | |
| EM(afs_call_trace_put, "PUT ") \ | |
| EM(afs_call_trace_wake, "WAKE ") \ | |
| E_(afs_call_trace_work, "WORK ") | |
| /* | |
| * Export enum symbols via userspace. | |
| */ | |
| #undef EM | |
| #undef E_ | |
| #define EM(a, b) TRACE_DEFINE_ENUM(a); | |
| #define E_(a, b) TRACE_DEFINE_ENUM(a); | |
| afs_call_traces; | |
| /* | |
| * Now redefine the EM() and E_() macros to map the enums to the strings that | |
| * will be printed in the output. | |
| */ | |
| #undef EM | |
| #undef E_ | |
| #define EM(a, b) { a, b }, | |
| #define E_(a, b) { a, b } | |
| TRACE_EVENT(afs_recv_data, | |
| TP_PROTO(struct afs_call *call, unsigned count, unsigned offset, | |
| bool want_more, int ret), | |
| TP_ARGS(call, count, offset, want_more, ret), | |
| TP_STRUCT__entry( | |
| __field(struct rxrpc_call *, rxcall ) | |
| __field(struct afs_call *, call ) | |
| __field(enum afs_call_state, state ) | |
| __field(unsigned int, count ) | |
| __field(unsigned int, offset ) | |
| __field(unsigned short, unmarshall ) | |
| __field(bool, want_more ) | |
| __field(int, ret ) | |
| ), | |
| TP_fast_assign( | |
| __entry->rxcall = call->rxcall; | |
| __entry->call = call; | |
| __entry->state = call->state; | |
| __entry->unmarshall = call->unmarshall; | |
| __entry->count = count; | |
| __entry->offset = offset; | |
| __entry->want_more = want_more; | |
| __entry->ret = ret; | |
| ), | |
| TP_printk("c=%p ac=%p s=%u u=%u %u/%u wm=%u ret=%d", | |
| __entry->rxcall, | |
| __entry->call, | |
| __entry->state, __entry->unmarshall, | |
| __entry->offset, __entry->count, | |
| __entry->want_more, __entry->ret) | |
| ); | |
| TRACE_EVENT(afs_notify_call, | |
| TP_PROTO(struct rxrpc_call *rxcall, struct afs_call *call), | |
| TP_ARGS(rxcall, call), | |
| TP_STRUCT__entry( | |
| __field(struct rxrpc_call *, rxcall ) | |
| __field(struct afs_call *, call ) | |
| __field(enum afs_call_state, state ) | |
| __field(unsigned short, unmarshall ) | |
| ), | |
| TP_fast_assign( | |
| __entry->rxcall = rxcall; | |
| __entry->call = call; | |
| __entry->state = call->state; | |
| __entry->unmarshall = call->unmarshall; | |
| ), | |
| TP_printk("c=%p ac=%p s=%u u=%u", | |
| __entry->rxcall, | |
| __entry->call, | |
| __entry->state, __entry->unmarshall) | |
| ); | |
| TRACE_EVENT(afs_cb_call, | |
| TP_PROTO(struct afs_call *call), | |
| TP_ARGS(call), | |
| TP_STRUCT__entry( | |
| __field(struct rxrpc_call *, rxcall ) | |
| __field(struct afs_call *, call ) | |
| __field(const char *, name ) | |
| __field(u32, op ) | |
| ), | |
| TP_fast_assign( | |
| __entry->rxcall = call->rxcall; | |
| __entry->call = call; | |
| __entry->name = call->type->name; | |
| __entry->op = call->operation_ID; | |
| ), | |
| TP_printk("c=%p ac=%p %s o=%u", | |
| __entry->rxcall, | |
| __entry->call, | |
| __entry->name, | |
| __entry->op) | |
| ); | |
| TRACE_EVENT(afs_call, | |
| TP_PROTO(struct afs_call *call, enum afs_call_trace op, | |
| int usage, int outstanding, const void *where), | |
| TP_ARGS(call, op, usage, outstanding, where), | |
| TP_STRUCT__entry( | |
| __field(struct afs_call *, call ) | |
| __field(int, op ) | |
| __field(int, usage ) | |
| __field(int, outstanding ) | |
| __field(const void *, where ) | |
| ), | |
| TP_fast_assign( | |
| __entry->call = call; | |
| __entry->op = op; | |
| __entry->usage = usage; | |
| __entry->outstanding = outstanding; | |
| __entry->where = where; | |
| ), | |
| TP_printk("c=%p %s u=%d o=%d sp=%pSR", | |
| __entry->call, | |
| __print_symbolic(__entry->op, afs_call_traces), | |
| __entry->usage, | |
| __entry->outstanding, | |
| __entry->where) | |
| ); | |
| #endif /* _TRACE_AFS_H */ | |
| /* This part must be outside protection */ | |
| #include <trace/define_trace.h> |