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 */ 52025db80cSDavid Howells afs_FS_FetchData64 = 65537, /* AFS Fetch file data */ 53025db80cSDavid Howells afs_FS_StoreData64 = 65538, /* AFS Store file data */ 54025db80cSDavid Howells afs_FS_GiveUpAllCallBacks = 65539, /* AFS Give up all our callbacks on a server */ 55025db80cSDavid Howells afs_FS_GetCapabilities = 65540, /* AFS Get FS server capabilities */ 56025db80cSDavid Howells }; 57025db80cSDavid Howells 58025db80cSDavid Howells enum afs_vl_operation { 59025db80cSDavid Howells afs_VL_GetEntryByNameU = 527, /* AFS Get Vol Entry By Name operation ID */ 60025db80cSDavid Howells afs_VL_GetAddrsU = 533, /* AFS Get FS server addresses */ 61025db80cSDavid Howells afs_YFSVL_GetEndpoints = 64002, /* YFS Get FS & Vol server addresses */ 62025db80cSDavid Howells afs_VL_GetCapabilities = 65537, /* AFS Get VL server capabilities */ 63025db80cSDavid Howells }; 64025db80cSDavid Howells 65341f741fSDavid Howells #endif /* end __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY */ 66341f741fSDavid Howells 67341f741fSDavid Howells /* 68341f741fSDavid Howells * Declare tracing information enums and their string mappings for display. 69341f741fSDavid Howells */ 70341f741fSDavid Howells #define afs_call_traces \ 71341f741fSDavid Howells EM(afs_call_trace_alloc, "ALLOC") \ 72341f741fSDavid Howells EM(afs_call_trace_free, "FREE ") \ 73341f741fSDavid Howells EM(afs_call_trace_put, "PUT ") \ 74341f741fSDavid Howells EM(afs_call_trace_wake, "WAKE ") \ 75341f741fSDavid Howells E_(afs_call_trace_work, "WORK ") 76341f741fSDavid Howells 77025db80cSDavid Howells #define afs_fs_operations \ 78025db80cSDavid Howells EM(afs_FS_FetchData, "FS.FetchData") \ 79025db80cSDavid Howells EM(afs_FS_FetchStatus, "FS.FetchStatus") \ 80025db80cSDavid Howells EM(afs_FS_StoreData, "FS.StoreData") \ 81025db80cSDavid Howells EM(afs_FS_StoreStatus, "FS.StoreStatus") \ 82025db80cSDavid Howells EM(afs_FS_RemoveFile, "FS.RemoveFile") \ 83025db80cSDavid Howells EM(afs_FS_CreateFile, "FS.CreateFile") \ 84025db80cSDavid Howells EM(afs_FS_Rename, "FS.Rename") \ 85025db80cSDavid Howells EM(afs_FS_Symlink, "FS.Symlink") \ 86025db80cSDavid Howells EM(afs_FS_Link, "FS.Link") \ 87025db80cSDavid Howells EM(afs_FS_MakeDir, "FS.MakeDir") \ 88025db80cSDavid Howells EM(afs_FS_RemoveDir, "FS.RemoveDir") \ 89025db80cSDavid Howells EM(afs_FS_GetVolumeInfo, "FS.GetVolumeInfo") \ 90025db80cSDavid Howells EM(afs_FS_GetVolumeStatus, "FS.GetVolumeStatus") \ 91025db80cSDavid Howells EM(afs_FS_GetRootVolume, "FS.GetRootVolume") \ 92025db80cSDavid Howells EM(afs_FS_SetLock, "FS.SetLock") \ 93025db80cSDavid Howells EM(afs_FS_ExtendLock, "FS.ExtendLock") \ 94025db80cSDavid Howells EM(afs_FS_ReleaseLock, "FS.ReleaseLock") \ 95025db80cSDavid Howells EM(afs_FS_Lookup, "FS.Lookup") \ 96025db80cSDavid Howells EM(afs_FS_FetchData64, "FS.FetchData64") \ 97025db80cSDavid Howells EM(afs_FS_StoreData64, "FS.StoreData64") \ 98025db80cSDavid Howells EM(afs_FS_GiveUpAllCallBacks, "FS.GiveUpAllCallBacks") \ 99025db80cSDavid Howells E_(afs_FS_GetCapabilities, "FS.GetCapabilities") 100025db80cSDavid Howells 101025db80cSDavid Howells #define afs_vl_operations \ 102025db80cSDavid Howells EM(afs_VL_GetEntryByNameU, "VL.GetEntryByNameU") \ 103025db80cSDavid Howells EM(afs_VL_GetAddrsU, "VL.GetAddrsU") \ 104025db80cSDavid Howells EM(afs_YFSVL_GetEndpoints, "YFSVL.GetEndpoints") \ 105025db80cSDavid Howells E_(afs_VL_GetCapabilities, "VL.GetCapabilities") 106025db80cSDavid Howells 107025db80cSDavid Howells 108341f741fSDavid Howells /* 109341f741fSDavid Howells * Export enum symbols via userspace. 110341f741fSDavid Howells */ 111341f741fSDavid Howells #undef EM 112341f741fSDavid Howells #undef E_ 113341f741fSDavid Howells #define EM(a, b) TRACE_DEFINE_ENUM(a); 114341f741fSDavid Howells #define E_(a, b) TRACE_DEFINE_ENUM(a); 115341f741fSDavid Howells 116341f741fSDavid Howells afs_call_traces; 117025db80cSDavid Howells afs_fs_operations; 118025db80cSDavid Howells afs_vl_operations; 119341f741fSDavid Howells 120341f741fSDavid Howells /* 121341f741fSDavid Howells * Now redefine the EM() and E_() macros to map the enums to the strings that 122341f741fSDavid Howells * will be printed in the output. 123341f741fSDavid Howells */ 124341f741fSDavid Howells #undef EM 125341f741fSDavid Howells #undef E_ 126341f741fSDavid Howells #define EM(a, b) { a, b }, 127341f741fSDavid Howells #define E_(a, b) { a, b } 128341f741fSDavid Howells 1298e8d7f13SDavid Howells TRACE_EVENT(afs_recv_data, 1308e8d7f13SDavid Howells TP_PROTO(struct afs_call *call, unsigned count, unsigned offset, 1318e8d7f13SDavid Howells bool want_more, int ret), 1328e8d7f13SDavid Howells 1338e8d7f13SDavid Howells TP_ARGS(call, count, offset, want_more, ret), 1348e8d7f13SDavid Howells 1358e8d7f13SDavid Howells TP_STRUCT__entry( 1368e8d7f13SDavid Howells __field(struct rxrpc_call *, rxcall ) 1378e8d7f13SDavid Howells __field(struct afs_call *, call ) 1388e8d7f13SDavid Howells __field(enum afs_call_state, state ) 1398e8d7f13SDavid Howells __field(unsigned int, count ) 1408e8d7f13SDavid Howells __field(unsigned int, offset ) 1418e8d7f13SDavid Howells __field(unsigned short, unmarshall ) 1428e8d7f13SDavid Howells __field(bool, want_more ) 1438e8d7f13SDavid Howells __field(int, ret ) 1448e8d7f13SDavid Howells ), 1458e8d7f13SDavid Howells 1468e8d7f13SDavid Howells TP_fast_assign( 1478e8d7f13SDavid Howells __entry->rxcall = call->rxcall; 1488e8d7f13SDavid Howells __entry->call = call; 1498e8d7f13SDavid Howells __entry->state = call->state; 1508e8d7f13SDavid Howells __entry->unmarshall = call->unmarshall; 1518e8d7f13SDavid Howells __entry->count = count; 1528e8d7f13SDavid Howells __entry->offset = offset; 1538e8d7f13SDavid Howells __entry->want_more = want_more; 1548e8d7f13SDavid Howells __entry->ret = ret; 1558e8d7f13SDavid Howells ), 1568e8d7f13SDavid Howells 1578e8d7f13SDavid Howells TP_printk("c=%p ac=%p s=%u u=%u %u/%u wm=%u ret=%d", 1588e8d7f13SDavid Howells __entry->rxcall, 1598e8d7f13SDavid Howells __entry->call, 1608e8d7f13SDavid Howells __entry->state, __entry->unmarshall, 1618e8d7f13SDavid Howells __entry->offset, __entry->count, 1628e8d7f13SDavid Howells __entry->want_more, __entry->ret) 1638e8d7f13SDavid Howells ); 1648e8d7f13SDavid Howells 1658e8d7f13SDavid Howells TRACE_EVENT(afs_notify_call, 1668e8d7f13SDavid Howells TP_PROTO(struct rxrpc_call *rxcall, struct afs_call *call), 1678e8d7f13SDavid Howells 1688e8d7f13SDavid Howells TP_ARGS(rxcall, call), 1698e8d7f13SDavid Howells 1708e8d7f13SDavid Howells TP_STRUCT__entry( 1718e8d7f13SDavid Howells __field(struct rxrpc_call *, rxcall ) 1728e8d7f13SDavid Howells __field(struct afs_call *, call ) 1738e8d7f13SDavid Howells __field(enum afs_call_state, state ) 1748e8d7f13SDavid Howells __field(unsigned short, unmarshall ) 1758e8d7f13SDavid Howells ), 1768e8d7f13SDavid Howells 1778e8d7f13SDavid Howells TP_fast_assign( 1788e8d7f13SDavid Howells __entry->rxcall = rxcall; 1798e8d7f13SDavid Howells __entry->call = call; 1808e8d7f13SDavid Howells __entry->state = call->state; 1818e8d7f13SDavid Howells __entry->unmarshall = call->unmarshall; 1828e8d7f13SDavid Howells ), 1838e8d7f13SDavid Howells 1848e8d7f13SDavid Howells TP_printk("c=%p ac=%p s=%u u=%u", 1858e8d7f13SDavid Howells __entry->rxcall, 1868e8d7f13SDavid Howells __entry->call, 1878e8d7f13SDavid Howells __entry->state, __entry->unmarshall) 1888e8d7f13SDavid Howells ); 1898e8d7f13SDavid Howells 1908e8d7f13SDavid Howells TRACE_EVENT(afs_cb_call, 1918e8d7f13SDavid Howells TP_PROTO(struct afs_call *call), 1928e8d7f13SDavid Howells 1938e8d7f13SDavid Howells TP_ARGS(call), 1948e8d7f13SDavid Howells 1958e8d7f13SDavid Howells TP_STRUCT__entry( 1968e8d7f13SDavid Howells __field(struct rxrpc_call *, rxcall ) 1978e8d7f13SDavid Howells __field(struct afs_call *, call ) 1988e8d7f13SDavid Howells __field(const char *, name ) 1998e8d7f13SDavid Howells __field(u32, op ) 2008e8d7f13SDavid Howells ), 2018e8d7f13SDavid Howells 2028e8d7f13SDavid Howells TP_fast_assign( 2038e8d7f13SDavid Howells __entry->rxcall = call->rxcall; 2048e8d7f13SDavid Howells __entry->call = call; 2058e8d7f13SDavid Howells __entry->name = call->type->name; 2068e8d7f13SDavid Howells __entry->op = call->operation_ID; 2078e8d7f13SDavid Howells ), 2088e8d7f13SDavid Howells 2098e8d7f13SDavid Howells TP_printk("c=%p ac=%p %s o=%u", 2108e8d7f13SDavid Howells __entry->rxcall, 2118e8d7f13SDavid Howells __entry->call, 2128e8d7f13SDavid Howells __entry->name, 2138e8d7f13SDavid Howells __entry->op) 2148e8d7f13SDavid Howells ); 2158e8d7f13SDavid Howells 216341f741fSDavid Howells TRACE_EVENT(afs_call, 217341f741fSDavid Howells TP_PROTO(struct afs_call *call, enum afs_call_trace op, 218341f741fSDavid Howells int usage, int outstanding, const void *where), 219341f741fSDavid Howells 220341f741fSDavid Howells TP_ARGS(call, op, usage, outstanding, where), 221341f741fSDavid Howells 222341f741fSDavid Howells TP_STRUCT__entry( 223341f741fSDavid Howells __field(struct afs_call *, call ) 224341f741fSDavid Howells __field(int, op ) 225341f741fSDavid Howells __field(int, usage ) 226341f741fSDavid Howells __field(int, outstanding ) 227341f741fSDavid Howells __field(const void *, where ) 228341f741fSDavid Howells ), 229341f741fSDavid Howells 230341f741fSDavid Howells TP_fast_assign( 231341f741fSDavid Howells __entry->call = call; 232341f741fSDavid Howells __entry->op = op; 233341f741fSDavid Howells __entry->usage = usage; 234341f741fSDavid Howells __entry->outstanding = outstanding; 235341f741fSDavid Howells __entry->where = where; 236341f741fSDavid Howells ), 237341f741fSDavid Howells 238341f741fSDavid Howells TP_printk("c=%p %s u=%d o=%d sp=%pSR", 239341f741fSDavid Howells __entry->call, 240341f741fSDavid Howells __print_symbolic(__entry->op, afs_call_traces), 241341f741fSDavid Howells __entry->usage, 242341f741fSDavid Howells __entry->outstanding, 243341f741fSDavid Howells __entry->where) 244341f741fSDavid Howells ); 245341f741fSDavid Howells 246025db80cSDavid Howells TRACE_EVENT(afs_make_fs_call, 247025db80cSDavid Howells TP_PROTO(struct afs_call *call, const struct afs_fid *fid), 248025db80cSDavid Howells 249025db80cSDavid Howells TP_ARGS(call, fid), 250025db80cSDavid Howells 251025db80cSDavid Howells TP_STRUCT__entry( 252025db80cSDavid Howells __field(struct afs_call *, call ) 253025db80cSDavid Howells __field(enum afs_fs_operation, op ) 254025db80cSDavid Howells __field_struct(struct afs_fid, fid ) 255025db80cSDavid Howells ), 256025db80cSDavid Howells 257025db80cSDavid Howells TP_fast_assign( 258025db80cSDavid Howells __entry->call = call; 259025db80cSDavid Howells __entry->op = call->operation_ID; 260025db80cSDavid Howells if (fid) { 261025db80cSDavid Howells __entry->fid = *fid; 262025db80cSDavid Howells } else { 263025db80cSDavid Howells __entry->fid.vid = 0; 264025db80cSDavid Howells __entry->fid.vnode = 0; 265025db80cSDavid Howells __entry->fid.unique = 0; 266025db80cSDavid Howells } 267025db80cSDavid Howells ), 268025db80cSDavid Howells 269025db80cSDavid Howells TP_printk("c=%p %06x:%06x:%06x %s", 270025db80cSDavid Howells __entry->call, 271025db80cSDavid Howells __entry->fid.vid, 272025db80cSDavid Howells __entry->fid.vnode, 273025db80cSDavid Howells __entry->fid.unique, 274025db80cSDavid Howells __print_symbolic(__entry->op, afs_fs_operations)) 275025db80cSDavid Howells ); 276025db80cSDavid Howells 277025db80cSDavid Howells TRACE_EVENT(afs_make_vl_call, 278025db80cSDavid Howells TP_PROTO(struct afs_call *call), 279025db80cSDavid Howells 280025db80cSDavid Howells TP_ARGS(call), 281025db80cSDavid Howells 282025db80cSDavid Howells TP_STRUCT__entry( 283025db80cSDavid Howells __field(struct afs_call *, call ) 284025db80cSDavid Howells __field(enum afs_vl_operation, op ) 285025db80cSDavid Howells ), 286025db80cSDavid Howells 287025db80cSDavid Howells TP_fast_assign( 288025db80cSDavid Howells __entry->call = call; 289025db80cSDavid Howells __entry->op = call->operation_ID; 290025db80cSDavid Howells ), 291025db80cSDavid Howells 292025db80cSDavid Howells TP_printk("c=%p %s", 293025db80cSDavid Howells __entry->call, 294025db80cSDavid Howells __print_symbolic(__entry->op, afs_vl_operations)) 295025db80cSDavid Howells ); 296025db80cSDavid Howells 297025db80cSDavid Howells TRACE_EVENT(afs_call_done, 298025db80cSDavid Howells TP_PROTO(struct afs_call *call), 299025db80cSDavid Howells 300025db80cSDavid Howells TP_ARGS(call), 301025db80cSDavid Howells 302025db80cSDavid Howells TP_STRUCT__entry( 303025db80cSDavid Howells __field(struct afs_call *, call ) 304025db80cSDavid Howells __field(struct rxrpc_call *, rx_call ) 305025db80cSDavid Howells __field(int, ret ) 306025db80cSDavid Howells __field(u32, abort_code ) 307025db80cSDavid Howells ), 308025db80cSDavid Howells 309025db80cSDavid Howells TP_fast_assign( 310025db80cSDavid Howells __entry->call = call; 311025db80cSDavid Howells __entry->rx_call = call->rxcall; 312025db80cSDavid Howells __entry->ret = call->error; 313025db80cSDavid Howells __entry->abort_code = call->abort_code; 314025db80cSDavid Howells ), 315025db80cSDavid Howells 316025db80cSDavid Howells TP_printk(" c=%p ret=%d ab=%d [%p]", 317025db80cSDavid Howells __entry->call, 318025db80cSDavid Howells __entry->ret, 319025db80cSDavid Howells __entry->abort_code, 320025db80cSDavid Howells __entry->rx_call) 321025db80cSDavid Howells ); 322025db80cSDavid Howells 3232c099014SDavid Howells TRACE_EVENT(afs_send_pages, 3242c099014SDavid Howells TP_PROTO(struct afs_call *call, struct msghdr *msg, 3252c099014SDavid Howells pgoff_t first, pgoff_t last, unsigned int offset), 3262c099014SDavid Howells 3272c099014SDavid Howells TP_ARGS(call, msg, first, last, offset), 3282c099014SDavid Howells 3292c099014SDavid Howells TP_STRUCT__entry( 3302c099014SDavid Howells __field(struct afs_call *, call ) 3312c099014SDavid Howells __field(pgoff_t, first ) 3322c099014SDavid Howells __field(pgoff_t, last ) 3332c099014SDavid Howells __field(unsigned int, nr ) 3342c099014SDavid Howells __field(unsigned int, bytes ) 3352c099014SDavid Howells __field(unsigned int, offset ) 3362c099014SDavid Howells __field(unsigned int, flags ) 3372c099014SDavid Howells ), 3382c099014SDavid Howells 3392c099014SDavid Howells TP_fast_assign( 3402c099014SDavid Howells __entry->call = call; 3412c099014SDavid Howells __entry->first = first; 3422c099014SDavid Howells __entry->last = last; 3432c099014SDavid Howells __entry->nr = msg->msg_iter.nr_segs; 3442c099014SDavid Howells __entry->bytes = msg->msg_iter.count; 3452c099014SDavid Howells __entry->offset = offset; 3462c099014SDavid Howells __entry->flags = msg->msg_flags; 3472c099014SDavid Howells ), 3482c099014SDavid Howells 3492c099014SDavid Howells TP_printk(" c=%p %lx-%lx-%lx b=%x o=%x f=%x", 3502c099014SDavid Howells __entry->call, 3512c099014SDavid Howells __entry->first, __entry->first + __entry->nr - 1, __entry->last, 3522c099014SDavid Howells __entry->bytes, __entry->offset, 3532c099014SDavid Howells __entry->flags) 3542c099014SDavid Howells ); 3552c099014SDavid Howells 3562c099014SDavid Howells TRACE_EVENT(afs_sent_pages, 3572c099014SDavid Howells TP_PROTO(struct afs_call *call, pgoff_t first, pgoff_t last, 3582c099014SDavid Howells pgoff_t cursor, int ret), 3592c099014SDavid Howells 3602c099014SDavid Howells TP_ARGS(call, first, last, cursor, ret), 3612c099014SDavid Howells 3622c099014SDavid Howells TP_STRUCT__entry( 3632c099014SDavid Howells __field(struct afs_call *, call ) 3642c099014SDavid Howells __field(pgoff_t, first ) 3652c099014SDavid Howells __field(pgoff_t, last ) 3662c099014SDavid Howells __field(pgoff_t, cursor ) 3672c099014SDavid Howells __field(int, ret ) 3682c099014SDavid Howells ), 3692c099014SDavid Howells 3702c099014SDavid Howells TP_fast_assign( 3712c099014SDavid Howells __entry->call = call; 3722c099014SDavid Howells __entry->first = first; 3732c099014SDavid Howells __entry->last = last; 3742c099014SDavid Howells __entry->cursor = cursor; 3752c099014SDavid Howells __entry->ret = ret; 3762c099014SDavid Howells ), 3772c099014SDavid Howells 3782c099014SDavid Howells TP_printk(" c=%p %lx-%lx c=%lx r=%d", 3792c099014SDavid Howells __entry->call, 3802c099014SDavid Howells __entry->first, __entry->last, 3812c099014SDavid Howells __entry->cursor, __entry->ret) 3822c099014SDavid Howells ); 3832c099014SDavid Howells 384dab17c1aSDavid Howells TRACE_EVENT(afs_dir_check_failed, 385dab17c1aSDavid Howells TP_PROTO(struct afs_vnode *vnode, loff_t off, loff_t i_size), 386dab17c1aSDavid Howells 387dab17c1aSDavid Howells TP_ARGS(vnode, off, i_size), 388dab17c1aSDavid Howells 389dab17c1aSDavid Howells TP_STRUCT__entry( 390dab17c1aSDavid Howells __field(struct afs_vnode *, vnode ) 391dab17c1aSDavid Howells __field(loff_t, off ) 392dab17c1aSDavid Howells __field(loff_t, i_size ) 393dab17c1aSDavid Howells ), 394dab17c1aSDavid Howells 395dab17c1aSDavid Howells TP_fast_assign( 396dab17c1aSDavid Howells __entry->vnode = vnode; 397dab17c1aSDavid Howells __entry->off = off; 398dab17c1aSDavid Howells __entry->i_size = i_size; 399dab17c1aSDavid Howells ), 400dab17c1aSDavid Howells 401dab17c1aSDavid Howells TP_printk("vn=%p %llx/%llx", 402dab17c1aSDavid Howells __entry->vnode, __entry->off, __entry->i_size) 403dab17c1aSDavid Howells ); 404dab17c1aSDavid Howells 40513524ab3SDavid Howells /* 40613524ab3SDavid Howells * We use page->private to hold the amount of the page that we've written to, 40713524ab3SDavid Howells * splitting the field into two parts. However, we need to represent a range 40813524ab3SDavid Howells * 0...PAGE_SIZE inclusive, so we can't support 64K pages on a 32-bit system. 40913524ab3SDavid Howells */ 41013524ab3SDavid Howells #if PAGE_SIZE > 32768 41113524ab3SDavid Howells #define AFS_PRIV_MAX 0xffffffff 41213524ab3SDavid Howells #define AFS_PRIV_SHIFT 32 41313524ab3SDavid Howells #else 41413524ab3SDavid Howells #define AFS_PRIV_MAX 0xffff 41513524ab3SDavid Howells #define AFS_PRIV_SHIFT 16 41613524ab3SDavid Howells #endif 41713524ab3SDavid Howells 41813524ab3SDavid Howells TRACE_EVENT(afs_page_dirty, 41913524ab3SDavid Howells TP_PROTO(struct afs_vnode *vnode, const char *where, 42013524ab3SDavid Howells pgoff_t page, unsigned long priv), 42113524ab3SDavid Howells 42213524ab3SDavid Howells TP_ARGS(vnode, where, page, priv), 42313524ab3SDavid Howells 42413524ab3SDavid Howells TP_STRUCT__entry( 42513524ab3SDavid Howells __field(struct afs_vnode *, vnode ) 42613524ab3SDavid Howells __field(const char *, where ) 42713524ab3SDavid Howells __field(pgoff_t, page ) 42813524ab3SDavid Howells __field(unsigned long, priv ) 42913524ab3SDavid Howells ), 43013524ab3SDavid Howells 43113524ab3SDavid Howells TP_fast_assign( 43213524ab3SDavid Howells __entry->vnode = vnode; 43313524ab3SDavid Howells __entry->where = where; 43413524ab3SDavid Howells __entry->page = page; 43513524ab3SDavid Howells __entry->priv = priv; 43613524ab3SDavid Howells ), 43713524ab3SDavid Howells 43813524ab3SDavid Howells TP_printk("vn=%p %lx %s %lu-%lu", 43913524ab3SDavid Howells __entry->vnode, __entry->page, __entry->where, 44013524ab3SDavid Howells __entry->priv & AFS_PRIV_MAX, 44113524ab3SDavid Howells __entry->priv >> AFS_PRIV_SHIFT) 44213524ab3SDavid Howells ); 44313524ab3SDavid Howells 444*98bf40cdSDavid Howells TRACE_EVENT(afs_call_state, 445*98bf40cdSDavid Howells TP_PROTO(struct afs_call *call, 446*98bf40cdSDavid Howells enum afs_call_state from, 447*98bf40cdSDavid Howells enum afs_call_state to, 448*98bf40cdSDavid Howells int ret, u32 remote_abort), 449*98bf40cdSDavid Howells 450*98bf40cdSDavid Howells TP_ARGS(call, from, to, ret, remote_abort), 451*98bf40cdSDavid Howells 452*98bf40cdSDavid Howells TP_STRUCT__entry( 453*98bf40cdSDavid Howells __field(struct afs_call *, call ) 454*98bf40cdSDavid Howells __field(enum afs_call_state, from ) 455*98bf40cdSDavid Howells __field(enum afs_call_state, to ) 456*98bf40cdSDavid Howells __field(int, ret ) 457*98bf40cdSDavid Howells __field(u32, abort ) 458*98bf40cdSDavid Howells ), 459*98bf40cdSDavid Howells 460*98bf40cdSDavid Howells TP_fast_assign( 461*98bf40cdSDavid Howells __entry->call = call; 462*98bf40cdSDavid Howells __entry->from = from; 463*98bf40cdSDavid Howells __entry->to = to; 464*98bf40cdSDavid Howells __entry->ret = ret; 465*98bf40cdSDavid Howells __entry->abort = remote_abort; 466*98bf40cdSDavid Howells ), 467*98bf40cdSDavid Howells 468*98bf40cdSDavid Howells TP_printk("c=%p %u->%u r=%d ab=%d", 469*98bf40cdSDavid Howells __entry->call, 470*98bf40cdSDavid Howells __entry->from, __entry->to, 471*98bf40cdSDavid Howells __entry->ret, __entry->abort) 472*98bf40cdSDavid Howells ); 473*98bf40cdSDavid Howells 4748e8d7f13SDavid Howells #endif /* _TRACE_AFS_H */ 4758e8d7f13SDavid Howells 4768e8d7f13SDavid Howells /* This part must be outside protection */ 4778e8d7f13SDavid Howells #include <trace/define_trace.h> 478