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 19341f741fSDavid Howells /* 20341f741fSDavid Howells * Define enums for tracing information. 21341f741fSDavid Howells */ 22341f741fSDavid Howells #ifndef __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY 23341f741fSDavid Howells #define __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY 24341f741fSDavid Howells 25341f741fSDavid Howells enum afs_call_trace { 26341f741fSDavid Howells afs_call_trace_alloc, 27341f741fSDavid Howells afs_call_trace_free, 28341f741fSDavid Howells afs_call_trace_put, 29341f741fSDavid Howells afs_call_trace_wake, 30341f741fSDavid Howells afs_call_trace_work, 31341f741fSDavid Howells }; 32341f741fSDavid Howells 33025db80cSDavid Howells enum afs_fs_operation { 34025db80cSDavid Howells afs_FS_FetchData = 130, /* AFS Fetch file data */ 35025db80cSDavid Howells afs_FS_FetchStatus = 132, /* AFS Fetch file status */ 36025db80cSDavid Howells afs_FS_StoreData = 133, /* AFS Store file data */ 37025db80cSDavid Howells afs_FS_StoreStatus = 135, /* AFS Store file status */ 38025db80cSDavid Howells afs_FS_RemoveFile = 136, /* AFS Remove a file */ 39025db80cSDavid Howells afs_FS_CreateFile = 137, /* AFS Create a file */ 40025db80cSDavid Howells afs_FS_Rename = 138, /* AFS Rename or move a file or directory */ 41025db80cSDavid Howells afs_FS_Symlink = 139, /* AFS Create a symbolic link */ 42025db80cSDavid Howells afs_FS_Link = 140, /* AFS Create a hard link */ 43025db80cSDavid Howells afs_FS_MakeDir = 141, /* AFS Create a directory */ 44025db80cSDavid Howells afs_FS_RemoveDir = 142, /* AFS Remove a directory */ 45025db80cSDavid Howells afs_FS_GetVolumeInfo = 148, /* AFS Get information about a volume */ 46025db80cSDavid Howells afs_FS_GetVolumeStatus = 149, /* AFS Get volume status information */ 47025db80cSDavid Howells afs_FS_GetRootVolume = 151, /* AFS Get root volume name */ 48025db80cSDavid Howells afs_FS_SetLock = 156, /* AFS Request a file lock */ 49025db80cSDavid Howells afs_FS_ExtendLock = 157, /* AFS Extend a file lock */ 50025db80cSDavid Howells afs_FS_ReleaseLock = 158, /* AFS Release a file lock */ 51025db80cSDavid Howells afs_FS_Lookup = 161, /* AFS lookup file in directory */ 525cf9dd55SDavid Howells afs_FS_InlineBulkStatus = 65536, /* AFS Fetch multiple file statuses with errors */ 53025db80cSDavid Howells afs_FS_FetchData64 = 65537, /* AFS Fetch file data */ 54025db80cSDavid Howells afs_FS_StoreData64 = 65538, /* AFS Store file data */ 55025db80cSDavid Howells afs_FS_GiveUpAllCallBacks = 65539, /* AFS Give up all our callbacks on a server */ 56025db80cSDavid Howells afs_FS_GetCapabilities = 65540, /* AFS Get FS server capabilities */ 57025db80cSDavid Howells }; 58025db80cSDavid Howells 59025db80cSDavid Howells enum afs_vl_operation { 60025db80cSDavid Howells afs_VL_GetEntryByNameU = 527, /* AFS Get Vol Entry By Name operation ID */ 61025db80cSDavid Howells afs_VL_GetAddrsU = 533, /* AFS Get FS server addresses */ 62025db80cSDavid Howells afs_YFSVL_GetEndpoints = 64002, /* YFS Get FS & Vol server addresses */ 63025db80cSDavid Howells afs_VL_GetCapabilities = 65537, /* AFS Get VL server capabilities */ 64025db80cSDavid Howells }; 65025db80cSDavid Howells 6663a4681fSDavid Howells enum afs_edit_dir_op { 6763a4681fSDavid Howells afs_edit_dir_create, 6863a4681fSDavid Howells afs_edit_dir_create_error, 6963a4681fSDavid Howells afs_edit_dir_create_inval, 7063a4681fSDavid Howells afs_edit_dir_create_nospc, 7163a4681fSDavid Howells afs_edit_dir_delete, 7263a4681fSDavid Howells afs_edit_dir_delete_error, 7363a4681fSDavid Howells afs_edit_dir_delete_inval, 7463a4681fSDavid Howells afs_edit_dir_delete_noent, 7563a4681fSDavid Howells }; 7663a4681fSDavid Howells 7763a4681fSDavid Howells enum afs_edit_dir_reason { 7863a4681fSDavid Howells afs_edit_dir_for_create, 7963a4681fSDavid Howells afs_edit_dir_for_link, 8063a4681fSDavid Howells afs_edit_dir_for_mkdir, 8163a4681fSDavid Howells afs_edit_dir_for_rename, 8263a4681fSDavid Howells afs_edit_dir_for_rmdir, 8363a4681fSDavid Howells afs_edit_dir_for_symlink, 8463a4681fSDavid Howells afs_edit_dir_for_unlink, 8563a4681fSDavid Howells }; 8663a4681fSDavid Howells 87*160cb957SDavid Howells enum afs_eproto_cause { 88*160cb957SDavid Howells afs_eproto_bad_status, 89*160cb957SDavid Howells afs_eproto_cb_count, 90*160cb957SDavid Howells afs_eproto_cb_fid_count, 91*160cb957SDavid Howells afs_eproto_file_type, 92*160cb957SDavid Howells afs_eproto_ibulkst_cb_count, 93*160cb957SDavid Howells afs_eproto_ibulkst_count, 94*160cb957SDavid Howells afs_eproto_motd_len, 95*160cb957SDavid Howells afs_eproto_offline_msg_len, 96*160cb957SDavid Howells afs_eproto_volname_len, 97*160cb957SDavid Howells afs_eproto_yvl_fsendpt4_len, 98*160cb957SDavid Howells afs_eproto_yvl_fsendpt6_len, 99*160cb957SDavid Howells afs_eproto_yvl_fsendpt_num, 100*160cb957SDavid Howells afs_eproto_yvl_fsendpt_type, 101*160cb957SDavid Howells afs_eproto_yvl_vlendpt4_len, 102*160cb957SDavid Howells afs_eproto_yvl_vlendpt6_len, 103*160cb957SDavid Howells afs_eproto_yvl_vlendpt_type, 104*160cb957SDavid Howells }; 105*160cb957SDavid Howells 106341f741fSDavid Howells #endif /* end __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY */ 107341f741fSDavid Howells 108341f741fSDavid Howells /* 109341f741fSDavid Howells * Declare tracing information enums and their string mappings for display. 110341f741fSDavid Howells */ 111341f741fSDavid Howells #define afs_call_traces \ 112341f741fSDavid Howells EM(afs_call_trace_alloc, "ALLOC") \ 113341f741fSDavid Howells EM(afs_call_trace_free, "FREE ") \ 114341f741fSDavid Howells EM(afs_call_trace_put, "PUT ") \ 115341f741fSDavid Howells EM(afs_call_trace_wake, "WAKE ") \ 116341f741fSDavid Howells E_(afs_call_trace_work, "WORK ") 117341f741fSDavid Howells 118025db80cSDavid Howells #define afs_fs_operations \ 119025db80cSDavid Howells EM(afs_FS_FetchData, "FS.FetchData") \ 120025db80cSDavid Howells EM(afs_FS_FetchStatus, "FS.FetchStatus") \ 121025db80cSDavid Howells EM(afs_FS_StoreData, "FS.StoreData") \ 122025db80cSDavid Howells EM(afs_FS_StoreStatus, "FS.StoreStatus") \ 123025db80cSDavid Howells EM(afs_FS_RemoveFile, "FS.RemoveFile") \ 124025db80cSDavid Howells EM(afs_FS_CreateFile, "FS.CreateFile") \ 125025db80cSDavid Howells EM(afs_FS_Rename, "FS.Rename") \ 126025db80cSDavid Howells EM(afs_FS_Symlink, "FS.Symlink") \ 127025db80cSDavid Howells EM(afs_FS_Link, "FS.Link") \ 128025db80cSDavid Howells EM(afs_FS_MakeDir, "FS.MakeDir") \ 129025db80cSDavid Howells EM(afs_FS_RemoveDir, "FS.RemoveDir") \ 130025db80cSDavid Howells EM(afs_FS_GetVolumeInfo, "FS.GetVolumeInfo") \ 131025db80cSDavid Howells EM(afs_FS_GetVolumeStatus, "FS.GetVolumeStatus") \ 132025db80cSDavid Howells EM(afs_FS_GetRootVolume, "FS.GetRootVolume") \ 133025db80cSDavid Howells EM(afs_FS_SetLock, "FS.SetLock") \ 134025db80cSDavid Howells EM(afs_FS_ExtendLock, "FS.ExtendLock") \ 135025db80cSDavid Howells EM(afs_FS_ReleaseLock, "FS.ReleaseLock") \ 136025db80cSDavid Howells EM(afs_FS_Lookup, "FS.Lookup") \ 1375cf9dd55SDavid Howells EM(afs_FS_InlineBulkStatus, "FS.InlineBulkStatus") \ 138025db80cSDavid Howells EM(afs_FS_FetchData64, "FS.FetchData64") \ 139025db80cSDavid Howells EM(afs_FS_StoreData64, "FS.StoreData64") \ 140025db80cSDavid Howells EM(afs_FS_GiveUpAllCallBacks, "FS.GiveUpAllCallBacks") \ 141025db80cSDavid Howells E_(afs_FS_GetCapabilities, "FS.GetCapabilities") 142025db80cSDavid Howells 143025db80cSDavid Howells #define afs_vl_operations \ 144025db80cSDavid Howells EM(afs_VL_GetEntryByNameU, "VL.GetEntryByNameU") \ 145025db80cSDavid Howells EM(afs_VL_GetAddrsU, "VL.GetAddrsU") \ 146025db80cSDavid Howells EM(afs_YFSVL_GetEndpoints, "YFSVL.GetEndpoints") \ 147025db80cSDavid Howells E_(afs_VL_GetCapabilities, "VL.GetCapabilities") 148025db80cSDavid Howells 14963a4681fSDavid Howells #define afs_edit_dir_ops \ 15063a4681fSDavid Howells EM(afs_edit_dir_create, "create") \ 15163a4681fSDavid Howells EM(afs_edit_dir_create_error, "c_fail") \ 15263a4681fSDavid Howells EM(afs_edit_dir_create_inval, "c_invl") \ 15363a4681fSDavid Howells EM(afs_edit_dir_create_nospc, "c_nspc") \ 15463a4681fSDavid Howells EM(afs_edit_dir_delete, "delete") \ 15563a4681fSDavid Howells EM(afs_edit_dir_delete_error, "d_err ") \ 15663a4681fSDavid Howells EM(afs_edit_dir_delete_inval, "d_invl") \ 15763a4681fSDavid Howells E_(afs_edit_dir_delete_noent, "d_nent") 15863a4681fSDavid Howells 15963a4681fSDavid Howells #define afs_edit_dir_reasons \ 16063a4681fSDavid Howells EM(afs_edit_dir_for_create, "Create") \ 16163a4681fSDavid Howells EM(afs_edit_dir_for_link, "Link ") \ 16263a4681fSDavid Howells EM(afs_edit_dir_for_mkdir, "MkDir ") \ 16363a4681fSDavid Howells EM(afs_edit_dir_for_rename, "Rename") \ 16463a4681fSDavid Howells EM(afs_edit_dir_for_rmdir, "RmDir ") \ 16563a4681fSDavid Howells EM(afs_edit_dir_for_symlink, "Symlnk") \ 16663a4681fSDavid Howells E_(afs_edit_dir_for_unlink, "Unlink") 16763a4681fSDavid Howells 168*160cb957SDavid Howells #define afs_eproto_causes \ 169*160cb957SDavid Howells EM(afs_eproto_bad_status, "BadStatus") \ 170*160cb957SDavid Howells EM(afs_eproto_cb_count, "CbCount") \ 171*160cb957SDavid Howells EM(afs_eproto_cb_fid_count, "CbFidCount") \ 172*160cb957SDavid Howells EM(afs_eproto_file_type, "FileTYpe") \ 173*160cb957SDavid Howells EM(afs_eproto_ibulkst_cb_count, "IBS.CbCount") \ 174*160cb957SDavid Howells EM(afs_eproto_ibulkst_count, "IBS.FidCount") \ 175*160cb957SDavid Howells EM(afs_eproto_motd_len, "MotdLen") \ 176*160cb957SDavid Howells EM(afs_eproto_offline_msg_len, "OfflineMsgLen") \ 177*160cb957SDavid Howells EM(afs_eproto_volname_len, "VolNameLen") \ 178*160cb957SDavid Howells EM(afs_eproto_yvl_fsendpt4_len, "YVL.FsEnd4Len") \ 179*160cb957SDavid Howells EM(afs_eproto_yvl_fsendpt6_len, "YVL.FsEnd6Len") \ 180*160cb957SDavid Howells EM(afs_eproto_yvl_fsendpt_num, "YVL.FsEndCount") \ 181*160cb957SDavid Howells EM(afs_eproto_yvl_fsendpt_type, "YVL.FsEndType") \ 182*160cb957SDavid Howells EM(afs_eproto_yvl_vlendpt4_len, "YVL.VlEnd4Len") \ 183*160cb957SDavid Howells EM(afs_eproto_yvl_vlendpt6_len, "YVL.VlEnd6Len") \ 184*160cb957SDavid Howells E_(afs_eproto_yvl_vlendpt_type, "YVL.VlEndType") 185*160cb957SDavid Howells 186025db80cSDavid Howells 187341f741fSDavid Howells /* 188341f741fSDavid Howells * Export enum symbols via userspace. 189341f741fSDavid Howells */ 190341f741fSDavid Howells #undef EM 191341f741fSDavid Howells #undef E_ 192341f741fSDavid Howells #define EM(a, b) TRACE_DEFINE_ENUM(a); 193341f741fSDavid Howells #define E_(a, b) TRACE_DEFINE_ENUM(a); 194341f741fSDavid Howells 195341f741fSDavid Howells afs_call_traces; 196025db80cSDavid Howells afs_fs_operations; 197025db80cSDavid Howells afs_vl_operations; 19863a4681fSDavid Howells afs_edit_dir_ops; 19963a4681fSDavid Howells afs_edit_dir_reasons; 200341f741fSDavid Howells 201341f741fSDavid Howells /* 202341f741fSDavid Howells * Now redefine the EM() and E_() macros to map the enums to the strings that 203341f741fSDavid Howells * will be printed in the output. 204341f741fSDavid Howells */ 205341f741fSDavid Howells #undef EM 206341f741fSDavid Howells #undef E_ 207341f741fSDavid Howells #define EM(a, b) { a, b }, 208341f741fSDavid Howells #define E_(a, b) { a, b } 209341f741fSDavid Howells 2108e8d7f13SDavid Howells TRACE_EVENT(afs_recv_data, 2118e8d7f13SDavid Howells TP_PROTO(struct afs_call *call, unsigned count, unsigned offset, 2128e8d7f13SDavid Howells bool want_more, int ret), 2138e8d7f13SDavid Howells 2148e8d7f13SDavid Howells TP_ARGS(call, count, offset, want_more, ret), 2158e8d7f13SDavid Howells 2168e8d7f13SDavid Howells TP_STRUCT__entry( 217a25e21f0SDavid Howells __field(unsigned int, call ) 2188e8d7f13SDavid Howells __field(enum afs_call_state, state ) 2198e8d7f13SDavid Howells __field(unsigned int, count ) 2208e8d7f13SDavid Howells __field(unsigned int, offset ) 2218e8d7f13SDavid Howells __field(unsigned short, unmarshall ) 2228e8d7f13SDavid Howells __field(bool, want_more ) 2238e8d7f13SDavid Howells __field(int, ret ) 2248e8d7f13SDavid Howells ), 2258e8d7f13SDavid Howells 2268e8d7f13SDavid Howells TP_fast_assign( 227a25e21f0SDavid Howells __entry->call = call->debug_id; 2288e8d7f13SDavid Howells __entry->state = call->state; 2298e8d7f13SDavid Howells __entry->unmarshall = call->unmarshall; 2308e8d7f13SDavid Howells __entry->count = count; 2318e8d7f13SDavid Howells __entry->offset = offset; 2328e8d7f13SDavid Howells __entry->want_more = want_more; 2338e8d7f13SDavid Howells __entry->ret = ret; 2348e8d7f13SDavid Howells ), 2358e8d7f13SDavid Howells 236a25e21f0SDavid Howells TP_printk("c=%08x s=%u u=%u %u/%u wm=%u ret=%d", 2378e8d7f13SDavid Howells __entry->call, 2388e8d7f13SDavid Howells __entry->state, __entry->unmarshall, 2398e8d7f13SDavid Howells __entry->offset, __entry->count, 2408e8d7f13SDavid Howells __entry->want_more, __entry->ret) 2418e8d7f13SDavid Howells ); 2428e8d7f13SDavid Howells 2438e8d7f13SDavid Howells TRACE_EVENT(afs_notify_call, 2448e8d7f13SDavid Howells TP_PROTO(struct rxrpc_call *rxcall, struct afs_call *call), 2458e8d7f13SDavid Howells 2468e8d7f13SDavid Howells TP_ARGS(rxcall, call), 2478e8d7f13SDavid Howells 2488e8d7f13SDavid Howells TP_STRUCT__entry( 249a25e21f0SDavid Howells __field(unsigned int, call ) 2508e8d7f13SDavid Howells __field(enum afs_call_state, state ) 2518e8d7f13SDavid Howells __field(unsigned short, unmarshall ) 2528e8d7f13SDavid Howells ), 2538e8d7f13SDavid Howells 2548e8d7f13SDavid Howells TP_fast_assign( 255a25e21f0SDavid Howells __entry->call = call->debug_id; 2568e8d7f13SDavid Howells __entry->state = call->state; 2578e8d7f13SDavid Howells __entry->unmarshall = call->unmarshall; 2588e8d7f13SDavid Howells ), 2598e8d7f13SDavid Howells 260a25e21f0SDavid Howells TP_printk("c=%08x s=%u u=%u", 2618e8d7f13SDavid Howells __entry->call, 2628e8d7f13SDavid Howells __entry->state, __entry->unmarshall) 2638e8d7f13SDavid Howells ); 2648e8d7f13SDavid Howells 2658e8d7f13SDavid Howells TRACE_EVENT(afs_cb_call, 2668e8d7f13SDavid Howells TP_PROTO(struct afs_call *call), 2678e8d7f13SDavid Howells 2688e8d7f13SDavid Howells TP_ARGS(call), 2698e8d7f13SDavid Howells 2708e8d7f13SDavid Howells TP_STRUCT__entry( 271a25e21f0SDavid Howells __field(unsigned int, call ) 2728e8d7f13SDavid Howells __field(const char *, name ) 2738e8d7f13SDavid Howells __field(u32, op ) 2748e8d7f13SDavid Howells ), 2758e8d7f13SDavid Howells 2768e8d7f13SDavid Howells TP_fast_assign( 277a25e21f0SDavid Howells __entry->call = call->debug_id; 2788e8d7f13SDavid Howells __entry->name = call->type->name; 2798e8d7f13SDavid Howells __entry->op = call->operation_ID; 2808e8d7f13SDavid Howells ), 2818e8d7f13SDavid Howells 282a25e21f0SDavid Howells TP_printk("c=%08x %s o=%u", 2838e8d7f13SDavid Howells __entry->call, 2848e8d7f13SDavid Howells __entry->name, 2858e8d7f13SDavid Howells __entry->op) 2868e8d7f13SDavid Howells ); 2878e8d7f13SDavid Howells 288341f741fSDavid Howells TRACE_EVENT(afs_call, 289341f741fSDavid Howells TP_PROTO(struct afs_call *call, enum afs_call_trace op, 290341f741fSDavid Howells int usage, int outstanding, const void *where), 291341f741fSDavid Howells 292341f741fSDavid Howells TP_ARGS(call, op, usage, outstanding, where), 293341f741fSDavid Howells 294341f741fSDavid Howells TP_STRUCT__entry( 295a25e21f0SDavid Howells __field(unsigned int, call ) 296341f741fSDavid Howells __field(int, op ) 297341f741fSDavid Howells __field(int, usage ) 298341f741fSDavid Howells __field(int, outstanding ) 299341f741fSDavid Howells __field(const void *, where ) 300341f741fSDavid Howells ), 301341f741fSDavid Howells 302341f741fSDavid Howells TP_fast_assign( 303a25e21f0SDavid Howells __entry->call = call->debug_id; 304341f741fSDavid Howells __entry->op = op; 305341f741fSDavid Howells __entry->usage = usage; 306341f741fSDavid Howells __entry->outstanding = outstanding; 307341f741fSDavid Howells __entry->where = where; 308341f741fSDavid Howells ), 309341f741fSDavid Howells 310a25e21f0SDavid Howells TP_printk("c=%08x %s u=%d o=%d sp=%pSR", 311341f741fSDavid Howells __entry->call, 312341f741fSDavid Howells __print_symbolic(__entry->op, afs_call_traces), 313341f741fSDavid Howells __entry->usage, 314341f741fSDavid Howells __entry->outstanding, 315341f741fSDavid Howells __entry->where) 316341f741fSDavid Howells ); 317341f741fSDavid Howells 318025db80cSDavid Howells TRACE_EVENT(afs_make_fs_call, 319025db80cSDavid Howells TP_PROTO(struct afs_call *call, const struct afs_fid *fid), 320025db80cSDavid Howells 321025db80cSDavid Howells TP_ARGS(call, fid), 322025db80cSDavid Howells 323025db80cSDavid Howells TP_STRUCT__entry( 324a25e21f0SDavid Howells __field(unsigned int, call ) 325025db80cSDavid Howells __field(enum afs_fs_operation, op ) 326025db80cSDavid Howells __field_struct(struct afs_fid, fid ) 327025db80cSDavid Howells ), 328025db80cSDavid Howells 329025db80cSDavid Howells TP_fast_assign( 330a25e21f0SDavid Howells __entry->call = call->debug_id; 331025db80cSDavid Howells __entry->op = call->operation_ID; 332025db80cSDavid Howells if (fid) { 333025db80cSDavid Howells __entry->fid = *fid; 334025db80cSDavid Howells } else { 335025db80cSDavid Howells __entry->fid.vid = 0; 336025db80cSDavid Howells __entry->fid.vnode = 0; 337025db80cSDavid Howells __entry->fid.unique = 0; 338025db80cSDavid Howells } 339025db80cSDavid Howells ), 340025db80cSDavid Howells 341a25e21f0SDavid Howells TP_printk("c=%08x %06x:%06x:%06x %s", 342025db80cSDavid Howells __entry->call, 343025db80cSDavid Howells __entry->fid.vid, 344025db80cSDavid Howells __entry->fid.vnode, 345025db80cSDavid Howells __entry->fid.unique, 346025db80cSDavid Howells __print_symbolic(__entry->op, afs_fs_operations)) 347025db80cSDavid Howells ); 348025db80cSDavid Howells 349025db80cSDavid Howells TRACE_EVENT(afs_make_vl_call, 350025db80cSDavid Howells TP_PROTO(struct afs_call *call), 351025db80cSDavid Howells 352025db80cSDavid Howells TP_ARGS(call), 353025db80cSDavid Howells 354025db80cSDavid Howells TP_STRUCT__entry( 355a25e21f0SDavid Howells __field(unsigned int, call ) 356025db80cSDavid Howells __field(enum afs_vl_operation, op ) 357025db80cSDavid Howells ), 358025db80cSDavid Howells 359025db80cSDavid Howells TP_fast_assign( 360a25e21f0SDavid Howells __entry->call = call->debug_id; 361025db80cSDavid Howells __entry->op = call->operation_ID; 362025db80cSDavid Howells ), 363025db80cSDavid Howells 364a25e21f0SDavid Howells TP_printk("c=%08x %s", 365025db80cSDavid Howells __entry->call, 366025db80cSDavid Howells __print_symbolic(__entry->op, afs_vl_operations)) 367025db80cSDavid Howells ); 368025db80cSDavid Howells 369025db80cSDavid Howells TRACE_EVENT(afs_call_done, 370025db80cSDavid Howells TP_PROTO(struct afs_call *call), 371025db80cSDavid Howells 372025db80cSDavid Howells TP_ARGS(call), 373025db80cSDavid Howells 374025db80cSDavid Howells TP_STRUCT__entry( 375a25e21f0SDavid Howells __field(unsigned int, call ) 376025db80cSDavid Howells __field(struct rxrpc_call *, rx_call ) 377025db80cSDavid Howells __field(int, ret ) 378025db80cSDavid Howells __field(u32, abort_code ) 379025db80cSDavid Howells ), 380025db80cSDavid Howells 381025db80cSDavid Howells TP_fast_assign( 382a25e21f0SDavid Howells __entry->call = call->debug_id; 383025db80cSDavid Howells __entry->rx_call = call->rxcall; 384025db80cSDavid Howells __entry->ret = call->error; 385025db80cSDavid Howells __entry->abort_code = call->abort_code; 386025db80cSDavid Howells ), 387025db80cSDavid Howells 388a25e21f0SDavid Howells TP_printk(" c=%08x ret=%d ab=%d [%p]", 389025db80cSDavid Howells __entry->call, 390025db80cSDavid Howells __entry->ret, 391025db80cSDavid Howells __entry->abort_code, 392025db80cSDavid Howells __entry->rx_call) 393025db80cSDavid Howells ); 394025db80cSDavid Howells 3952c099014SDavid Howells TRACE_EVENT(afs_send_pages, 3962c099014SDavid Howells TP_PROTO(struct afs_call *call, struct msghdr *msg, 3972c099014SDavid Howells pgoff_t first, pgoff_t last, unsigned int offset), 3982c099014SDavid Howells 3992c099014SDavid Howells TP_ARGS(call, msg, first, last, offset), 4002c099014SDavid Howells 4012c099014SDavid Howells TP_STRUCT__entry( 402a25e21f0SDavid Howells __field(unsigned int, call ) 4032c099014SDavid Howells __field(pgoff_t, first ) 4042c099014SDavid Howells __field(pgoff_t, last ) 4052c099014SDavid Howells __field(unsigned int, nr ) 4062c099014SDavid Howells __field(unsigned int, bytes ) 4072c099014SDavid Howells __field(unsigned int, offset ) 4082c099014SDavid Howells __field(unsigned int, flags ) 4092c099014SDavid Howells ), 4102c099014SDavid Howells 4112c099014SDavid Howells TP_fast_assign( 412a25e21f0SDavid Howells __entry->call = call->debug_id; 4132c099014SDavid Howells __entry->first = first; 4142c099014SDavid Howells __entry->last = last; 4152c099014SDavid Howells __entry->nr = msg->msg_iter.nr_segs; 4162c099014SDavid Howells __entry->bytes = msg->msg_iter.count; 4172c099014SDavid Howells __entry->offset = offset; 4182c099014SDavid Howells __entry->flags = msg->msg_flags; 4192c099014SDavid Howells ), 4202c099014SDavid Howells 421a25e21f0SDavid Howells TP_printk(" c=%08x %lx-%lx-%lx b=%x o=%x f=%x", 4222c099014SDavid Howells __entry->call, 4232c099014SDavid Howells __entry->first, __entry->first + __entry->nr - 1, __entry->last, 4242c099014SDavid Howells __entry->bytes, __entry->offset, 4252c099014SDavid Howells __entry->flags) 4262c099014SDavid Howells ); 4272c099014SDavid Howells 4282c099014SDavid Howells TRACE_EVENT(afs_sent_pages, 4292c099014SDavid Howells TP_PROTO(struct afs_call *call, pgoff_t first, pgoff_t last, 4302c099014SDavid Howells pgoff_t cursor, int ret), 4312c099014SDavid Howells 4322c099014SDavid Howells TP_ARGS(call, first, last, cursor, ret), 4332c099014SDavid Howells 4342c099014SDavid Howells TP_STRUCT__entry( 435a25e21f0SDavid Howells __field(unsigned int, call ) 4362c099014SDavid Howells __field(pgoff_t, first ) 4372c099014SDavid Howells __field(pgoff_t, last ) 4382c099014SDavid Howells __field(pgoff_t, cursor ) 4392c099014SDavid Howells __field(int, ret ) 4402c099014SDavid Howells ), 4412c099014SDavid Howells 4422c099014SDavid Howells TP_fast_assign( 443a25e21f0SDavid Howells __entry->call = call->debug_id; 4442c099014SDavid Howells __entry->first = first; 4452c099014SDavid Howells __entry->last = last; 4462c099014SDavid Howells __entry->cursor = cursor; 4472c099014SDavid Howells __entry->ret = ret; 4482c099014SDavid Howells ), 4492c099014SDavid Howells 450a25e21f0SDavid Howells TP_printk(" c=%08x %lx-%lx c=%lx r=%d", 4512c099014SDavid Howells __entry->call, 4522c099014SDavid Howells __entry->first, __entry->last, 4532c099014SDavid Howells __entry->cursor, __entry->ret) 4542c099014SDavid Howells ); 4552c099014SDavid Howells 456dab17c1aSDavid Howells TRACE_EVENT(afs_dir_check_failed, 457dab17c1aSDavid Howells TP_PROTO(struct afs_vnode *vnode, loff_t off, loff_t i_size), 458dab17c1aSDavid Howells 459dab17c1aSDavid Howells TP_ARGS(vnode, off, i_size), 460dab17c1aSDavid Howells 461dab17c1aSDavid Howells TP_STRUCT__entry( 462dab17c1aSDavid Howells __field(struct afs_vnode *, vnode ) 463dab17c1aSDavid Howells __field(loff_t, off ) 464dab17c1aSDavid Howells __field(loff_t, i_size ) 465dab17c1aSDavid Howells ), 466dab17c1aSDavid Howells 467dab17c1aSDavid Howells TP_fast_assign( 468dab17c1aSDavid Howells __entry->vnode = vnode; 469dab17c1aSDavid Howells __entry->off = off; 470dab17c1aSDavid Howells __entry->i_size = i_size; 471dab17c1aSDavid Howells ), 472dab17c1aSDavid Howells 473dab17c1aSDavid Howells TP_printk("vn=%p %llx/%llx", 474dab17c1aSDavid Howells __entry->vnode, __entry->off, __entry->i_size) 475dab17c1aSDavid Howells ); 476dab17c1aSDavid Howells 47713524ab3SDavid Howells /* 47813524ab3SDavid Howells * We use page->private to hold the amount of the page that we've written to, 47913524ab3SDavid Howells * splitting the field into two parts. However, we need to represent a range 48013524ab3SDavid Howells * 0...PAGE_SIZE inclusive, so we can't support 64K pages on a 32-bit system. 48113524ab3SDavid Howells */ 48213524ab3SDavid Howells #if PAGE_SIZE > 32768 48313524ab3SDavid Howells #define AFS_PRIV_MAX 0xffffffff 48413524ab3SDavid Howells #define AFS_PRIV_SHIFT 32 48513524ab3SDavid Howells #else 48613524ab3SDavid Howells #define AFS_PRIV_MAX 0xffff 48713524ab3SDavid Howells #define AFS_PRIV_SHIFT 16 48813524ab3SDavid Howells #endif 48913524ab3SDavid Howells 49013524ab3SDavid Howells TRACE_EVENT(afs_page_dirty, 49113524ab3SDavid Howells TP_PROTO(struct afs_vnode *vnode, const char *where, 49213524ab3SDavid Howells pgoff_t page, unsigned long priv), 49313524ab3SDavid Howells 49413524ab3SDavid Howells TP_ARGS(vnode, where, page, priv), 49513524ab3SDavid Howells 49613524ab3SDavid Howells TP_STRUCT__entry( 49713524ab3SDavid Howells __field(struct afs_vnode *, vnode ) 49813524ab3SDavid Howells __field(const char *, where ) 49913524ab3SDavid Howells __field(pgoff_t, page ) 50013524ab3SDavid Howells __field(unsigned long, priv ) 50113524ab3SDavid Howells ), 50213524ab3SDavid Howells 50313524ab3SDavid Howells TP_fast_assign( 50413524ab3SDavid Howells __entry->vnode = vnode; 50513524ab3SDavid Howells __entry->where = where; 50613524ab3SDavid Howells __entry->page = page; 50713524ab3SDavid Howells __entry->priv = priv; 50813524ab3SDavid Howells ), 50913524ab3SDavid Howells 51013524ab3SDavid Howells TP_printk("vn=%p %lx %s %lu-%lu", 51113524ab3SDavid Howells __entry->vnode, __entry->page, __entry->where, 51213524ab3SDavid Howells __entry->priv & AFS_PRIV_MAX, 51313524ab3SDavid Howells __entry->priv >> AFS_PRIV_SHIFT) 51413524ab3SDavid Howells ); 51513524ab3SDavid Howells 51698bf40cdSDavid Howells TRACE_EVENT(afs_call_state, 51798bf40cdSDavid Howells TP_PROTO(struct afs_call *call, 51898bf40cdSDavid Howells enum afs_call_state from, 51998bf40cdSDavid Howells enum afs_call_state to, 52098bf40cdSDavid Howells int ret, u32 remote_abort), 52198bf40cdSDavid Howells 52298bf40cdSDavid Howells TP_ARGS(call, from, to, ret, remote_abort), 52398bf40cdSDavid Howells 52498bf40cdSDavid Howells TP_STRUCT__entry( 525a25e21f0SDavid Howells __field(unsigned int, call ) 52698bf40cdSDavid Howells __field(enum afs_call_state, from ) 52798bf40cdSDavid Howells __field(enum afs_call_state, to ) 52898bf40cdSDavid Howells __field(int, ret ) 52998bf40cdSDavid Howells __field(u32, abort ) 53098bf40cdSDavid Howells ), 53198bf40cdSDavid Howells 53298bf40cdSDavid Howells TP_fast_assign( 533a25e21f0SDavid Howells __entry->call = call->debug_id; 53498bf40cdSDavid Howells __entry->from = from; 53598bf40cdSDavid Howells __entry->to = to; 53698bf40cdSDavid Howells __entry->ret = ret; 53798bf40cdSDavid Howells __entry->abort = remote_abort; 53898bf40cdSDavid Howells ), 53998bf40cdSDavid Howells 540a25e21f0SDavid Howells TP_printk("c=%08x %u->%u r=%d ab=%d", 54198bf40cdSDavid Howells __entry->call, 54298bf40cdSDavid Howells __entry->from, __entry->to, 54398bf40cdSDavid Howells __entry->ret, __entry->abort) 54498bf40cdSDavid Howells ); 54598bf40cdSDavid Howells 54663a4681fSDavid Howells TRACE_EVENT(afs_edit_dir, 54763a4681fSDavid Howells TP_PROTO(struct afs_vnode *dvnode, 54863a4681fSDavid Howells enum afs_edit_dir_reason why, 54963a4681fSDavid Howells enum afs_edit_dir_op op, 55063a4681fSDavid Howells unsigned int block, 55163a4681fSDavid Howells unsigned int slot, 55263a4681fSDavid Howells unsigned int f_vnode, 55363a4681fSDavid Howells unsigned int f_unique, 55463a4681fSDavid Howells const char *name), 55563a4681fSDavid Howells 55663a4681fSDavid Howells TP_ARGS(dvnode, why, op, block, slot, f_vnode, f_unique, name), 55763a4681fSDavid Howells 55863a4681fSDavid Howells TP_STRUCT__entry( 55963a4681fSDavid Howells __field(unsigned int, vnode ) 56063a4681fSDavid Howells __field(unsigned int, unique ) 56163a4681fSDavid Howells __field(enum afs_edit_dir_reason, why ) 56263a4681fSDavid Howells __field(enum afs_edit_dir_op, op ) 56363a4681fSDavid Howells __field(unsigned int, block ) 56463a4681fSDavid Howells __field(unsigned short, slot ) 56563a4681fSDavid Howells __field(unsigned int, f_vnode ) 56663a4681fSDavid Howells __field(unsigned int, f_unique ) 56763a4681fSDavid Howells __array(char, name, 18 ) 56863a4681fSDavid Howells ), 56963a4681fSDavid Howells 57063a4681fSDavid Howells TP_fast_assign( 57163a4681fSDavid Howells int __len = strlen(name); 57263a4681fSDavid Howells __len = min(__len, 17); 57363a4681fSDavid Howells __entry->vnode = dvnode->fid.vnode; 57463a4681fSDavid Howells __entry->unique = dvnode->fid.unique; 57563a4681fSDavid Howells __entry->why = why; 57663a4681fSDavid Howells __entry->op = op; 57763a4681fSDavid Howells __entry->block = block; 57863a4681fSDavid Howells __entry->slot = slot; 57963a4681fSDavid Howells __entry->f_vnode = f_vnode; 58063a4681fSDavid Howells __entry->f_unique = f_unique; 58163a4681fSDavid Howells memcpy(__entry->name, name, __len); 58263a4681fSDavid Howells __entry->name[__len] = 0; 58363a4681fSDavid Howells ), 58463a4681fSDavid Howells 58563a4681fSDavid Howells TP_printk("d=%x:%x %s %s %u[%u] f=%x:%x %s", 58663a4681fSDavid Howells __entry->vnode, __entry->unique, 58763a4681fSDavid Howells __print_symbolic(__entry->why, afs_edit_dir_reasons), 58863a4681fSDavid Howells __print_symbolic(__entry->op, afs_edit_dir_ops), 58963a4681fSDavid Howells __entry->block, __entry->slot, 59063a4681fSDavid Howells __entry->f_vnode, __entry->f_unique, 59163a4681fSDavid Howells __entry->name) 59263a4681fSDavid Howells ); 59363a4681fSDavid Howells 5945f702c8eSDavid Howells TRACE_EVENT(afs_protocol_error, 595*160cb957SDavid Howells TP_PROTO(struct afs_call *call, int error, enum afs_eproto_cause cause), 5965f702c8eSDavid Howells 597*160cb957SDavid Howells TP_ARGS(call, error, cause), 5985f702c8eSDavid Howells 5995f702c8eSDavid Howells TP_STRUCT__entry( 6005f702c8eSDavid Howells __field(unsigned int, call ) 6015f702c8eSDavid Howells __field(int, error ) 602*160cb957SDavid Howells __field(enum afs_eproto_cause, cause ) 6035f702c8eSDavid Howells ), 6045f702c8eSDavid Howells 6055f702c8eSDavid Howells TP_fast_assign( 6065f702c8eSDavid Howells __entry->call = call ? call->debug_id : 0; 6075f702c8eSDavid Howells __entry->error = error; 608*160cb957SDavid Howells __entry->cause = cause; 6095f702c8eSDavid Howells ), 6105f702c8eSDavid Howells 611*160cb957SDavid Howells TP_printk("c=%08x r=%d %s", 612*160cb957SDavid Howells __entry->call, __entry->error, 613*160cb957SDavid Howells __print_symbolic(__entry->cause, afs_eproto_causes)) 6145f702c8eSDavid Howells ); 6155f702c8eSDavid Howells 6163709a399SDavid Howells TRACE_EVENT(afs_cm_no_server, 6173709a399SDavid Howells TP_PROTO(struct afs_call *call, struct sockaddr_rxrpc *srx), 6183709a399SDavid Howells 6193709a399SDavid Howells TP_ARGS(call, srx), 6203709a399SDavid Howells 6213709a399SDavid Howells TP_STRUCT__entry( 6223709a399SDavid Howells __field(unsigned int, call ) 6233709a399SDavid Howells __field(unsigned int, op_id ) 6243709a399SDavid Howells __field_struct(struct sockaddr_rxrpc, srx ) 6253709a399SDavid Howells ), 6263709a399SDavid Howells 6273709a399SDavid Howells TP_fast_assign( 6283709a399SDavid Howells __entry->call = call->debug_id; 6293709a399SDavid Howells __entry->op_id = call->operation_ID; 6303709a399SDavid Howells memcpy(&__entry->srx, srx, sizeof(__entry->srx)); 6313709a399SDavid Howells ), 6323709a399SDavid Howells 6333709a399SDavid Howells TP_printk("c=%08x op=%u %pISpc", 6343709a399SDavid Howells __entry->call, __entry->op_id, &__entry->srx.transport) 6353709a399SDavid Howells ); 6363709a399SDavid Howells 6373709a399SDavid Howells TRACE_EVENT(afs_cm_no_server_u, 6383709a399SDavid Howells TP_PROTO(struct afs_call *call, const uuid_t *uuid), 6393709a399SDavid Howells 6403709a399SDavid Howells TP_ARGS(call, uuid), 6413709a399SDavid Howells 6423709a399SDavid Howells TP_STRUCT__entry( 6433709a399SDavid Howells __field(unsigned int, call ) 6443709a399SDavid Howells __field(unsigned int, op_id ) 6453709a399SDavid Howells __field_struct(uuid_t, uuid ) 6463709a399SDavid Howells ), 6473709a399SDavid Howells 6483709a399SDavid Howells TP_fast_assign( 6493709a399SDavid Howells __entry->call = call->debug_id; 6503709a399SDavid Howells __entry->op_id = call->operation_ID; 6513709a399SDavid Howells memcpy(&__entry->uuid, uuid, sizeof(__entry->uuid)); 6523709a399SDavid Howells ), 6533709a399SDavid Howells 6543709a399SDavid Howells TP_printk("c=%08x op=%u %pU", 6553709a399SDavid Howells __entry->call, __entry->op_id, &__entry->uuid) 6563709a399SDavid Howells ); 6573709a399SDavid Howells 6588e8d7f13SDavid Howells #endif /* _TRACE_AFS_H */ 6598e8d7f13SDavid Howells 6608e8d7f13SDavid Howells /* This part must be outside protection */ 6618e8d7f13SDavid Howells #include <trace/define_trace.h> 662