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 87341f741fSDavid Howells #endif /* end __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY */ 88341f741fSDavid Howells 89341f741fSDavid Howells /* 90341f741fSDavid Howells * Declare tracing information enums and their string mappings for display. 91341f741fSDavid Howells */ 92341f741fSDavid Howells #define afs_call_traces \ 93341f741fSDavid Howells EM(afs_call_trace_alloc, "ALLOC") \ 94341f741fSDavid Howells EM(afs_call_trace_free, "FREE ") \ 95341f741fSDavid Howells EM(afs_call_trace_put, "PUT ") \ 96341f741fSDavid Howells EM(afs_call_trace_wake, "WAKE ") \ 97341f741fSDavid Howells E_(afs_call_trace_work, "WORK ") 98341f741fSDavid Howells 99025db80cSDavid Howells #define afs_fs_operations \ 100025db80cSDavid Howells EM(afs_FS_FetchData, "FS.FetchData") \ 101025db80cSDavid Howells EM(afs_FS_FetchStatus, "FS.FetchStatus") \ 102025db80cSDavid Howells EM(afs_FS_StoreData, "FS.StoreData") \ 103025db80cSDavid Howells EM(afs_FS_StoreStatus, "FS.StoreStatus") \ 104025db80cSDavid Howells EM(afs_FS_RemoveFile, "FS.RemoveFile") \ 105025db80cSDavid Howells EM(afs_FS_CreateFile, "FS.CreateFile") \ 106025db80cSDavid Howells EM(afs_FS_Rename, "FS.Rename") \ 107025db80cSDavid Howells EM(afs_FS_Symlink, "FS.Symlink") \ 108025db80cSDavid Howells EM(afs_FS_Link, "FS.Link") \ 109025db80cSDavid Howells EM(afs_FS_MakeDir, "FS.MakeDir") \ 110025db80cSDavid Howells EM(afs_FS_RemoveDir, "FS.RemoveDir") \ 111025db80cSDavid Howells EM(afs_FS_GetVolumeInfo, "FS.GetVolumeInfo") \ 112025db80cSDavid Howells EM(afs_FS_GetVolumeStatus, "FS.GetVolumeStatus") \ 113025db80cSDavid Howells EM(afs_FS_GetRootVolume, "FS.GetRootVolume") \ 114025db80cSDavid Howells EM(afs_FS_SetLock, "FS.SetLock") \ 115025db80cSDavid Howells EM(afs_FS_ExtendLock, "FS.ExtendLock") \ 116025db80cSDavid Howells EM(afs_FS_ReleaseLock, "FS.ReleaseLock") \ 117025db80cSDavid Howells EM(afs_FS_Lookup, "FS.Lookup") \ 1185cf9dd55SDavid Howells EM(afs_FS_InlineBulkStatus, "FS.InlineBulkStatus") \ 119025db80cSDavid Howells EM(afs_FS_FetchData64, "FS.FetchData64") \ 120025db80cSDavid Howells EM(afs_FS_StoreData64, "FS.StoreData64") \ 121025db80cSDavid Howells EM(afs_FS_GiveUpAllCallBacks, "FS.GiveUpAllCallBacks") \ 122025db80cSDavid Howells E_(afs_FS_GetCapabilities, "FS.GetCapabilities") 123025db80cSDavid Howells 124025db80cSDavid Howells #define afs_vl_operations \ 125025db80cSDavid Howells EM(afs_VL_GetEntryByNameU, "VL.GetEntryByNameU") \ 126025db80cSDavid Howells EM(afs_VL_GetAddrsU, "VL.GetAddrsU") \ 127025db80cSDavid Howells EM(afs_YFSVL_GetEndpoints, "YFSVL.GetEndpoints") \ 128025db80cSDavid Howells E_(afs_VL_GetCapabilities, "VL.GetCapabilities") 129025db80cSDavid Howells 13063a4681fSDavid Howells #define afs_edit_dir_ops \ 13163a4681fSDavid Howells EM(afs_edit_dir_create, "create") \ 13263a4681fSDavid Howells EM(afs_edit_dir_create_error, "c_fail") \ 13363a4681fSDavid Howells EM(afs_edit_dir_create_inval, "c_invl") \ 13463a4681fSDavid Howells EM(afs_edit_dir_create_nospc, "c_nspc") \ 13563a4681fSDavid Howells EM(afs_edit_dir_delete, "delete") \ 13663a4681fSDavid Howells EM(afs_edit_dir_delete_error, "d_err ") \ 13763a4681fSDavid Howells EM(afs_edit_dir_delete_inval, "d_invl") \ 13863a4681fSDavid Howells E_(afs_edit_dir_delete_noent, "d_nent") 13963a4681fSDavid Howells 14063a4681fSDavid Howells #define afs_edit_dir_reasons \ 14163a4681fSDavid Howells EM(afs_edit_dir_for_create, "Create") \ 14263a4681fSDavid Howells EM(afs_edit_dir_for_link, "Link ") \ 14363a4681fSDavid Howells EM(afs_edit_dir_for_mkdir, "MkDir ") \ 14463a4681fSDavid Howells EM(afs_edit_dir_for_rename, "Rename") \ 14563a4681fSDavid Howells EM(afs_edit_dir_for_rmdir, "RmDir ") \ 14663a4681fSDavid Howells EM(afs_edit_dir_for_symlink, "Symlnk") \ 14763a4681fSDavid Howells E_(afs_edit_dir_for_unlink, "Unlink") 14863a4681fSDavid Howells 149025db80cSDavid Howells 150341f741fSDavid Howells /* 151341f741fSDavid Howells * Export enum symbols via userspace. 152341f741fSDavid Howells */ 153341f741fSDavid Howells #undef EM 154341f741fSDavid Howells #undef E_ 155341f741fSDavid Howells #define EM(a, b) TRACE_DEFINE_ENUM(a); 156341f741fSDavid Howells #define E_(a, b) TRACE_DEFINE_ENUM(a); 157341f741fSDavid Howells 158341f741fSDavid Howells afs_call_traces; 159025db80cSDavid Howells afs_fs_operations; 160025db80cSDavid Howells afs_vl_operations; 16163a4681fSDavid Howells afs_edit_dir_ops; 16263a4681fSDavid Howells afs_edit_dir_reasons; 163341f741fSDavid Howells 164341f741fSDavid Howells /* 165341f741fSDavid Howells * Now redefine the EM() and E_() macros to map the enums to the strings that 166341f741fSDavid Howells * will be printed in the output. 167341f741fSDavid Howells */ 168341f741fSDavid Howells #undef EM 169341f741fSDavid Howells #undef E_ 170341f741fSDavid Howells #define EM(a, b) { a, b }, 171341f741fSDavid Howells #define E_(a, b) { a, b } 172341f741fSDavid Howells 1738e8d7f13SDavid Howells TRACE_EVENT(afs_recv_data, 1748e8d7f13SDavid Howells TP_PROTO(struct afs_call *call, unsigned count, unsigned offset, 1758e8d7f13SDavid Howells bool want_more, int ret), 1768e8d7f13SDavid Howells 1778e8d7f13SDavid Howells TP_ARGS(call, count, offset, want_more, ret), 1788e8d7f13SDavid Howells 1798e8d7f13SDavid Howells TP_STRUCT__entry( 180a25e21f0SDavid Howells __field(unsigned int, call ) 1818e8d7f13SDavid Howells __field(enum afs_call_state, state ) 1828e8d7f13SDavid Howells __field(unsigned int, count ) 1838e8d7f13SDavid Howells __field(unsigned int, offset ) 1848e8d7f13SDavid Howells __field(unsigned short, unmarshall ) 1858e8d7f13SDavid Howells __field(bool, want_more ) 1868e8d7f13SDavid Howells __field(int, ret ) 1878e8d7f13SDavid Howells ), 1888e8d7f13SDavid Howells 1898e8d7f13SDavid Howells TP_fast_assign( 190a25e21f0SDavid Howells __entry->call = call->debug_id; 1918e8d7f13SDavid Howells __entry->state = call->state; 1928e8d7f13SDavid Howells __entry->unmarshall = call->unmarshall; 1938e8d7f13SDavid Howells __entry->count = count; 1948e8d7f13SDavid Howells __entry->offset = offset; 1958e8d7f13SDavid Howells __entry->want_more = want_more; 1968e8d7f13SDavid Howells __entry->ret = ret; 1978e8d7f13SDavid Howells ), 1988e8d7f13SDavid Howells 199a25e21f0SDavid Howells TP_printk("c=%08x s=%u u=%u %u/%u wm=%u ret=%d", 2008e8d7f13SDavid Howells __entry->call, 2018e8d7f13SDavid Howells __entry->state, __entry->unmarshall, 2028e8d7f13SDavid Howells __entry->offset, __entry->count, 2038e8d7f13SDavid Howells __entry->want_more, __entry->ret) 2048e8d7f13SDavid Howells ); 2058e8d7f13SDavid Howells 2068e8d7f13SDavid Howells TRACE_EVENT(afs_notify_call, 2078e8d7f13SDavid Howells TP_PROTO(struct rxrpc_call *rxcall, struct afs_call *call), 2088e8d7f13SDavid Howells 2098e8d7f13SDavid Howells TP_ARGS(rxcall, call), 2108e8d7f13SDavid Howells 2118e8d7f13SDavid Howells TP_STRUCT__entry( 212a25e21f0SDavid Howells __field(unsigned int, call ) 2138e8d7f13SDavid Howells __field(enum afs_call_state, state ) 2148e8d7f13SDavid Howells __field(unsigned short, unmarshall ) 2158e8d7f13SDavid Howells ), 2168e8d7f13SDavid Howells 2178e8d7f13SDavid Howells TP_fast_assign( 218a25e21f0SDavid Howells __entry->call = call->debug_id; 2198e8d7f13SDavid Howells __entry->state = call->state; 2208e8d7f13SDavid Howells __entry->unmarshall = call->unmarshall; 2218e8d7f13SDavid Howells ), 2228e8d7f13SDavid Howells 223a25e21f0SDavid Howells TP_printk("c=%08x s=%u u=%u", 2248e8d7f13SDavid Howells __entry->call, 2258e8d7f13SDavid Howells __entry->state, __entry->unmarshall) 2268e8d7f13SDavid Howells ); 2278e8d7f13SDavid Howells 2288e8d7f13SDavid Howells TRACE_EVENT(afs_cb_call, 2298e8d7f13SDavid Howells TP_PROTO(struct afs_call *call), 2308e8d7f13SDavid Howells 2318e8d7f13SDavid Howells TP_ARGS(call), 2328e8d7f13SDavid Howells 2338e8d7f13SDavid Howells TP_STRUCT__entry( 234a25e21f0SDavid Howells __field(unsigned int, call ) 2358e8d7f13SDavid Howells __field(const char *, name ) 2368e8d7f13SDavid Howells __field(u32, op ) 2378e8d7f13SDavid Howells ), 2388e8d7f13SDavid Howells 2398e8d7f13SDavid Howells TP_fast_assign( 240a25e21f0SDavid Howells __entry->call = call->debug_id; 2418e8d7f13SDavid Howells __entry->name = call->type->name; 2428e8d7f13SDavid Howells __entry->op = call->operation_ID; 2438e8d7f13SDavid Howells ), 2448e8d7f13SDavid Howells 245a25e21f0SDavid Howells TP_printk("c=%08x %s o=%u", 2468e8d7f13SDavid Howells __entry->call, 2478e8d7f13SDavid Howells __entry->name, 2488e8d7f13SDavid Howells __entry->op) 2498e8d7f13SDavid Howells ); 2508e8d7f13SDavid Howells 251341f741fSDavid Howells TRACE_EVENT(afs_call, 252341f741fSDavid Howells TP_PROTO(struct afs_call *call, enum afs_call_trace op, 253341f741fSDavid Howells int usage, int outstanding, const void *where), 254341f741fSDavid Howells 255341f741fSDavid Howells TP_ARGS(call, op, usage, outstanding, where), 256341f741fSDavid Howells 257341f741fSDavid Howells TP_STRUCT__entry( 258a25e21f0SDavid Howells __field(unsigned int, call ) 259341f741fSDavid Howells __field(int, op ) 260341f741fSDavid Howells __field(int, usage ) 261341f741fSDavid Howells __field(int, outstanding ) 262341f741fSDavid Howells __field(const void *, where ) 263341f741fSDavid Howells ), 264341f741fSDavid Howells 265341f741fSDavid Howells TP_fast_assign( 266a25e21f0SDavid Howells __entry->call = call->debug_id; 267341f741fSDavid Howells __entry->op = op; 268341f741fSDavid Howells __entry->usage = usage; 269341f741fSDavid Howells __entry->outstanding = outstanding; 270341f741fSDavid Howells __entry->where = where; 271341f741fSDavid Howells ), 272341f741fSDavid Howells 273a25e21f0SDavid Howells TP_printk("c=%08x %s u=%d o=%d sp=%pSR", 274341f741fSDavid Howells __entry->call, 275341f741fSDavid Howells __print_symbolic(__entry->op, afs_call_traces), 276341f741fSDavid Howells __entry->usage, 277341f741fSDavid Howells __entry->outstanding, 278341f741fSDavid Howells __entry->where) 279341f741fSDavid Howells ); 280341f741fSDavid Howells 281025db80cSDavid Howells TRACE_EVENT(afs_make_fs_call, 282025db80cSDavid Howells TP_PROTO(struct afs_call *call, const struct afs_fid *fid), 283025db80cSDavid Howells 284025db80cSDavid Howells TP_ARGS(call, fid), 285025db80cSDavid Howells 286025db80cSDavid Howells TP_STRUCT__entry( 287a25e21f0SDavid Howells __field(unsigned int, call ) 288025db80cSDavid Howells __field(enum afs_fs_operation, op ) 289025db80cSDavid Howells __field_struct(struct afs_fid, fid ) 290025db80cSDavid Howells ), 291025db80cSDavid Howells 292025db80cSDavid Howells TP_fast_assign( 293a25e21f0SDavid Howells __entry->call = call->debug_id; 294025db80cSDavid Howells __entry->op = call->operation_ID; 295025db80cSDavid Howells if (fid) { 296025db80cSDavid Howells __entry->fid = *fid; 297025db80cSDavid Howells } else { 298025db80cSDavid Howells __entry->fid.vid = 0; 299025db80cSDavid Howells __entry->fid.vnode = 0; 300025db80cSDavid Howells __entry->fid.unique = 0; 301025db80cSDavid Howells } 302025db80cSDavid Howells ), 303025db80cSDavid Howells 304a25e21f0SDavid Howells TP_printk("c=%08x %06x:%06x:%06x %s", 305025db80cSDavid Howells __entry->call, 306025db80cSDavid Howells __entry->fid.vid, 307025db80cSDavid Howells __entry->fid.vnode, 308025db80cSDavid Howells __entry->fid.unique, 309025db80cSDavid Howells __print_symbolic(__entry->op, afs_fs_operations)) 310025db80cSDavid Howells ); 311025db80cSDavid Howells 312025db80cSDavid Howells TRACE_EVENT(afs_make_vl_call, 313025db80cSDavid Howells TP_PROTO(struct afs_call *call), 314025db80cSDavid Howells 315025db80cSDavid Howells TP_ARGS(call), 316025db80cSDavid Howells 317025db80cSDavid Howells TP_STRUCT__entry( 318a25e21f0SDavid Howells __field(unsigned int, call ) 319025db80cSDavid Howells __field(enum afs_vl_operation, op ) 320025db80cSDavid Howells ), 321025db80cSDavid Howells 322025db80cSDavid Howells TP_fast_assign( 323a25e21f0SDavid Howells __entry->call = call->debug_id; 324025db80cSDavid Howells __entry->op = call->operation_ID; 325025db80cSDavid Howells ), 326025db80cSDavid Howells 327a25e21f0SDavid Howells TP_printk("c=%08x %s", 328025db80cSDavid Howells __entry->call, 329025db80cSDavid Howells __print_symbolic(__entry->op, afs_vl_operations)) 330025db80cSDavid Howells ); 331025db80cSDavid Howells 332025db80cSDavid Howells TRACE_EVENT(afs_call_done, 333025db80cSDavid Howells TP_PROTO(struct afs_call *call), 334025db80cSDavid Howells 335025db80cSDavid Howells TP_ARGS(call), 336025db80cSDavid Howells 337025db80cSDavid Howells TP_STRUCT__entry( 338a25e21f0SDavid Howells __field(unsigned int, call ) 339025db80cSDavid Howells __field(struct rxrpc_call *, rx_call ) 340025db80cSDavid Howells __field(int, ret ) 341025db80cSDavid Howells __field(u32, abort_code ) 342025db80cSDavid Howells ), 343025db80cSDavid Howells 344025db80cSDavid Howells TP_fast_assign( 345a25e21f0SDavid Howells __entry->call = call->debug_id; 346025db80cSDavid Howells __entry->rx_call = call->rxcall; 347025db80cSDavid Howells __entry->ret = call->error; 348025db80cSDavid Howells __entry->abort_code = call->abort_code; 349025db80cSDavid Howells ), 350025db80cSDavid Howells 351a25e21f0SDavid Howells TP_printk(" c=%08x ret=%d ab=%d [%p]", 352025db80cSDavid Howells __entry->call, 353025db80cSDavid Howells __entry->ret, 354025db80cSDavid Howells __entry->abort_code, 355025db80cSDavid Howells __entry->rx_call) 356025db80cSDavid Howells ); 357025db80cSDavid Howells 3582c099014SDavid Howells TRACE_EVENT(afs_send_pages, 3592c099014SDavid Howells TP_PROTO(struct afs_call *call, struct msghdr *msg, 3602c099014SDavid Howells pgoff_t first, pgoff_t last, unsigned int offset), 3612c099014SDavid Howells 3622c099014SDavid Howells TP_ARGS(call, msg, first, last, offset), 3632c099014SDavid Howells 3642c099014SDavid Howells TP_STRUCT__entry( 365a25e21f0SDavid Howells __field(unsigned int, call ) 3662c099014SDavid Howells __field(pgoff_t, first ) 3672c099014SDavid Howells __field(pgoff_t, last ) 3682c099014SDavid Howells __field(unsigned int, nr ) 3692c099014SDavid Howells __field(unsigned int, bytes ) 3702c099014SDavid Howells __field(unsigned int, offset ) 3712c099014SDavid Howells __field(unsigned int, flags ) 3722c099014SDavid Howells ), 3732c099014SDavid Howells 3742c099014SDavid Howells TP_fast_assign( 375a25e21f0SDavid Howells __entry->call = call->debug_id; 3762c099014SDavid Howells __entry->first = first; 3772c099014SDavid Howells __entry->last = last; 3782c099014SDavid Howells __entry->nr = msg->msg_iter.nr_segs; 3792c099014SDavid Howells __entry->bytes = msg->msg_iter.count; 3802c099014SDavid Howells __entry->offset = offset; 3812c099014SDavid Howells __entry->flags = msg->msg_flags; 3822c099014SDavid Howells ), 3832c099014SDavid Howells 384a25e21f0SDavid Howells TP_printk(" c=%08x %lx-%lx-%lx b=%x o=%x f=%x", 3852c099014SDavid Howells __entry->call, 3862c099014SDavid Howells __entry->first, __entry->first + __entry->nr - 1, __entry->last, 3872c099014SDavid Howells __entry->bytes, __entry->offset, 3882c099014SDavid Howells __entry->flags) 3892c099014SDavid Howells ); 3902c099014SDavid Howells 3912c099014SDavid Howells TRACE_EVENT(afs_sent_pages, 3922c099014SDavid Howells TP_PROTO(struct afs_call *call, pgoff_t first, pgoff_t last, 3932c099014SDavid Howells pgoff_t cursor, int ret), 3942c099014SDavid Howells 3952c099014SDavid Howells TP_ARGS(call, first, last, cursor, ret), 3962c099014SDavid Howells 3972c099014SDavid Howells TP_STRUCT__entry( 398a25e21f0SDavid Howells __field(unsigned int, call ) 3992c099014SDavid Howells __field(pgoff_t, first ) 4002c099014SDavid Howells __field(pgoff_t, last ) 4012c099014SDavid Howells __field(pgoff_t, cursor ) 4022c099014SDavid Howells __field(int, ret ) 4032c099014SDavid Howells ), 4042c099014SDavid Howells 4052c099014SDavid Howells TP_fast_assign( 406a25e21f0SDavid Howells __entry->call = call->debug_id; 4072c099014SDavid Howells __entry->first = first; 4082c099014SDavid Howells __entry->last = last; 4092c099014SDavid Howells __entry->cursor = cursor; 4102c099014SDavid Howells __entry->ret = ret; 4112c099014SDavid Howells ), 4122c099014SDavid Howells 413a25e21f0SDavid Howells TP_printk(" c=%08x %lx-%lx c=%lx r=%d", 4142c099014SDavid Howells __entry->call, 4152c099014SDavid Howells __entry->first, __entry->last, 4162c099014SDavid Howells __entry->cursor, __entry->ret) 4172c099014SDavid Howells ); 4182c099014SDavid Howells 419dab17c1aSDavid Howells TRACE_EVENT(afs_dir_check_failed, 420dab17c1aSDavid Howells TP_PROTO(struct afs_vnode *vnode, loff_t off, loff_t i_size), 421dab17c1aSDavid Howells 422dab17c1aSDavid Howells TP_ARGS(vnode, off, i_size), 423dab17c1aSDavid Howells 424dab17c1aSDavid Howells TP_STRUCT__entry( 425dab17c1aSDavid Howells __field(struct afs_vnode *, vnode ) 426dab17c1aSDavid Howells __field(loff_t, off ) 427dab17c1aSDavid Howells __field(loff_t, i_size ) 428dab17c1aSDavid Howells ), 429dab17c1aSDavid Howells 430dab17c1aSDavid Howells TP_fast_assign( 431dab17c1aSDavid Howells __entry->vnode = vnode; 432dab17c1aSDavid Howells __entry->off = off; 433dab17c1aSDavid Howells __entry->i_size = i_size; 434dab17c1aSDavid Howells ), 435dab17c1aSDavid Howells 436dab17c1aSDavid Howells TP_printk("vn=%p %llx/%llx", 437dab17c1aSDavid Howells __entry->vnode, __entry->off, __entry->i_size) 438dab17c1aSDavid Howells ); 439dab17c1aSDavid Howells 44013524ab3SDavid Howells /* 44113524ab3SDavid Howells * We use page->private to hold the amount of the page that we've written to, 44213524ab3SDavid Howells * splitting the field into two parts. However, we need to represent a range 44313524ab3SDavid Howells * 0...PAGE_SIZE inclusive, so we can't support 64K pages on a 32-bit system. 44413524ab3SDavid Howells */ 44513524ab3SDavid Howells #if PAGE_SIZE > 32768 44613524ab3SDavid Howells #define AFS_PRIV_MAX 0xffffffff 44713524ab3SDavid Howells #define AFS_PRIV_SHIFT 32 44813524ab3SDavid Howells #else 44913524ab3SDavid Howells #define AFS_PRIV_MAX 0xffff 45013524ab3SDavid Howells #define AFS_PRIV_SHIFT 16 45113524ab3SDavid Howells #endif 45213524ab3SDavid Howells 45313524ab3SDavid Howells TRACE_EVENT(afs_page_dirty, 45413524ab3SDavid Howells TP_PROTO(struct afs_vnode *vnode, const char *where, 45513524ab3SDavid Howells pgoff_t page, unsigned long priv), 45613524ab3SDavid Howells 45713524ab3SDavid Howells TP_ARGS(vnode, where, page, priv), 45813524ab3SDavid Howells 45913524ab3SDavid Howells TP_STRUCT__entry( 46013524ab3SDavid Howells __field(struct afs_vnode *, vnode ) 46113524ab3SDavid Howells __field(const char *, where ) 46213524ab3SDavid Howells __field(pgoff_t, page ) 46313524ab3SDavid Howells __field(unsigned long, priv ) 46413524ab3SDavid Howells ), 46513524ab3SDavid Howells 46613524ab3SDavid Howells TP_fast_assign( 46713524ab3SDavid Howells __entry->vnode = vnode; 46813524ab3SDavid Howells __entry->where = where; 46913524ab3SDavid Howells __entry->page = page; 47013524ab3SDavid Howells __entry->priv = priv; 47113524ab3SDavid Howells ), 47213524ab3SDavid Howells 47313524ab3SDavid Howells TP_printk("vn=%p %lx %s %lu-%lu", 47413524ab3SDavid Howells __entry->vnode, __entry->page, __entry->where, 47513524ab3SDavid Howells __entry->priv & AFS_PRIV_MAX, 47613524ab3SDavid Howells __entry->priv >> AFS_PRIV_SHIFT) 47713524ab3SDavid Howells ); 47813524ab3SDavid Howells 47998bf40cdSDavid Howells TRACE_EVENT(afs_call_state, 48098bf40cdSDavid Howells TP_PROTO(struct afs_call *call, 48198bf40cdSDavid Howells enum afs_call_state from, 48298bf40cdSDavid Howells enum afs_call_state to, 48398bf40cdSDavid Howells int ret, u32 remote_abort), 48498bf40cdSDavid Howells 48598bf40cdSDavid Howells TP_ARGS(call, from, to, ret, remote_abort), 48698bf40cdSDavid Howells 48798bf40cdSDavid Howells TP_STRUCT__entry( 488a25e21f0SDavid Howells __field(unsigned int, call ) 48998bf40cdSDavid Howells __field(enum afs_call_state, from ) 49098bf40cdSDavid Howells __field(enum afs_call_state, to ) 49198bf40cdSDavid Howells __field(int, ret ) 49298bf40cdSDavid Howells __field(u32, abort ) 49398bf40cdSDavid Howells ), 49498bf40cdSDavid Howells 49598bf40cdSDavid Howells TP_fast_assign( 496a25e21f0SDavid Howells __entry->call = call->debug_id; 49798bf40cdSDavid Howells __entry->from = from; 49898bf40cdSDavid Howells __entry->to = to; 49998bf40cdSDavid Howells __entry->ret = ret; 50098bf40cdSDavid Howells __entry->abort = remote_abort; 50198bf40cdSDavid Howells ), 50298bf40cdSDavid Howells 503a25e21f0SDavid Howells TP_printk("c=%08x %u->%u r=%d ab=%d", 50498bf40cdSDavid Howells __entry->call, 50598bf40cdSDavid Howells __entry->from, __entry->to, 50698bf40cdSDavid Howells __entry->ret, __entry->abort) 50798bf40cdSDavid Howells ); 50898bf40cdSDavid Howells 50963a4681fSDavid Howells TRACE_EVENT(afs_edit_dir, 51063a4681fSDavid Howells TP_PROTO(struct afs_vnode *dvnode, 51163a4681fSDavid Howells enum afs_edit_dir_reason why, 51263a4681fSDavid Howells enum afs_edit_dir_op op, 51363a4681fSDavid Howells unsigned int block, 51463a4681fSDavid Howells unsigned int slot, 51563a4681fSDavid Howells unsigned int f_vnode, 51663a4681fSDavid Howells unsigned int f_unique, 51763a4681fSDavid Howells const char *name), 51863a4681fSDavid Howells 51963a4681fSDavid Howells TP_ARGS(dvnode, why, op, block, slot, f_vnode, f_unique, name), 52063a4681fSDavid Howells 52163a4681fSDavid Howells TP_STRUCT__entry( 52263a4681fSDavid Howells __field(unsigned int, vnode ) 52363a4681fSDavid Howells __field(unsigned int, unique ) 52463a4681fSDavid Howells __field(enum afs_edit_dir_reason, why ) 52563a4681fSDavid Howells __field(enum afs_edit_dir_op, op ) 52663a4681fSDavid Howells __field(unsigned int, block ) 52763a4681fSDavid Howells __field(unsigned short, slot ) 52863a4681fSDavid Howells __field(unsigned int, f_vnode ) 52963a4681fSDavid Howells __field(unsigned int, f_unique ) 53063a4681fSDavid Howells __array(char, name, 18 ) 53163a4681fSDavid Howells ), 53263a4681fSDavid Howells 53363a4681fSDavid Howells TP_fast_assign( 53463a4681fSDavid Howells int __len = strlen(name); 53563a4681fSDavid Howells __len = min(__len, 17); 53663a4681fSDavid Howells __entry->vnode = dvnode->fid.vnode; 53763a4681fSDavid Howells __entry->unique = dvnode->fid.unique; 53863a4681fSDavid Howells __entry->why = why; 53963a4681fSDavid Howells __entry->op = op; 54063a4681fSDavid Howells __entry->block = block; 54163a4681fSDavid Howells __entry->slot = slot; 54263a4681fSDavid Howells __entry->f_vnode = f_vnode; 54363a4681fSDavid Howells __entry->f_unique = f_unique; 54463a4681fSDavid Howells memcpy(__entry->name, name, __len); 54563a4681fSDavid Howells __entry->name[__len] = 0; 54663a4681fSDavid Howells ), 54763a4681fSDavid Howells 54863a4681fSDavid Howells TP_printk("d=%x:%x %s %s %u[%u] f=%x:%x %s", 54963a4681fSDavid Howells __entry->vnode, __entry->unique, 55063a4681fSDavid Howells __print_symbolic(__entry->why, afs_edit_dir_reasons), 55163a4681fSDavid Howells __print_symbolic(__entry->op, afs_edit_dir_ops), 55263a4681fSDavid Howells __entry->block, __entry->slot, 55363a4681fSDavid Howells __entry->f_vnode, __entry->f_unique, 55463a4681fSDavid Howells __entry->name) 55563a4681fSDavid Howells ); 55663a4681fSDavid Howells 5575f702c8eSDavid Howells TRACE_EVENT(afs_protocol_error, 5585f702c8eSDavid Howells TP_PROTO(struct afs_call *call, int error, const void *where), 5595f702c8eSDavid Howells 5605f702c8eSDavid Howells TP_ARGS(call, error, where), 5615f702c8eSDavid Howells 5625f702c8eSDavid Howells TP_STRUCT__entry( 5635f702c8eSDavid Howells __field(unsigned int, call ) 5645f702c8eSDavid Howells __field(int, error ) 5655f702c8eSDavid Howells __field(const void *, where ) 5665f702c8eSDavid Howells ), 5675f702c8eSDavid Howells 5685f702c8eSDavid Howells TP_fast_assign( 5695f702c8eSDavid Howells __entry->call = call ? call->debug_id : 0; 5705f702c8eSDavid Howells __entry->error = error; 5715f702c8eSDavid Howells __entry->where = where; 5725f702c8eSDavid Howells ), 5735f702c8eSDavid Howells 5745f702c8eSDavid Howells TP_printk("c=%08x r=%d sp=%pSR", 5755f702c8eSDavid Howells __entry->call, __entry->error, __entry->where) 5765f702c8eSDavid Howells ); 5775f702c8eSDavid Howells 578*3709a399SDavid Howells TRACE_EVENT(afs_cm_no_server, 579*3709a399SDavid Howells TP_PROTO(struct afs_call *call, struct sockaddr_rxrpc *srx), 580*3709a399SDavid Howells 581*3709a399SDavid Howells TP_ARGS(call, srx), 582*3709a399SDavid Howells 583*3709a399SDavid Howells TP_STRUCT__entry( 584*3709a399SDavid Howells __field(unsigned int, call ) 585*3709a399SDavid Howells __field(unsigned int, op_id ) 586*3709a399SDavid Howells __field_struct(struct sockaddr_rxrpc, srx ) 587*3709a399SDavid Howells ), 588*3709a399SDavid Howells 589*3709a399SDavid Howells TP_fast_assign( 590*3709a399SDavid Howells __entry->call = call->debug_id; 591*3709a399SDavid Howells __entry->op_id = call->operation_ID; 592*3709a399SDavid Howells memcpy(&__entry->srx, srx, sizeof(__entry->srx)); 593*3709a399SDavid Howells ), 594*3709a399SDavid Howells 595*3709a399SDavid Howells TP_printk("c=%08x op=%u %pISpc", 596*3709a399SDavid Howells __entry->call, __entry->op_id, &__entry->srx.transport) 597*3709a399SDavid Howells ); 598*3709a399SDavid Howells 599*3709a399SDavid Howells TRACE_EVENT(afs_cm_no_server_u, 600*3709a399SDavid Howells TP_PROTO(struct afs_call *call, const uuid_t *uuid), 601*3709a399SDavid Howells 602*3709a399SDavid Howells TP_ARGS(call, uuid), 603*3709a399SDavid Howells 604*3709a399SDavid Howells TP_STRUCT__entry( 605*3709a399SDavid Howells __field(unsigned int, call ) 606*3709a399SDavid Howells __field(unsigned int, op_id ) 607*3709a399SDavid Howells __field_struct(uuid_t, uuid ) 608*3709a399SDavid Howells ), 609*3709a399SDavid Howells 610*3709a399SDavid Howells TP_fast_assign( 611*3709a399SDavid Howells __entry->call = call->debug_id; 612*3709a399SDavid Howells __entry->op_id = call->operation_ID; 613*3709a399SDavid Howells memcpy(&__entry->uuid, uuid, sizeof(__entry->uuid)); 614*3709a399SDavid Howells ), 615*3709a399SDavid Howells 616*3709a399SDavid Howells TP_printk("c=%08x op=%u %pU", 617*3709a399SDavid Howells __entry->call, __entry->op_id, &__entry->uuid) 618*3709a399SDavid Howells ); 619*3709a399SDavid Howells 6208e8d7f13SDavid Howells #endif /* _TRACE_AFS_H */ 6218e8d7f13SDavid Howells 6228e8d7f13SDavid Howells /* This part must be outside protection */ 6238e8d7f13SDavid Howells #include <trace/define_trace.h> 624