1296177Sjhibbits/* SPDX-License-Identifier: GPL-2.0 */ 2296177Sjhibbits#undef TRACE_SYSTEM 3296177Sjhibbits#define TRACE_SYSTEM gfs2 4296177Sjhibbits 5296177Sjhibbits#if !defined(_TRACE_GFS2_H) || defined(TRACE_HEADER_MULTI_READ) 6296177Sjhibbits#define _TRACE_GFS2_H 7296177Sjhibbits 8296177Sjhibbits#include <linux/tracepoint.h> 9296177Sjhibbits 10296177Sjhibbits#include <linux/fs.h> 11296177Sjhibbits#include <linux/buffer_head.h> 12296177Sjhibbits#include <linux/dlmconstants.h> 13296177Sjhibbits#include <linux/gfs2_ondisk.h> 14296177Sjhibbits#include <linux/writeback.h> 15296177Sjhibbits#include <linux/ktime.h> 16296177Sjhibbits#include <linux/iomap.h> 17296177Sjhibbits#include "incore.h" 18296177Sjhibbits#include "glock.h" 19296177Sjhibbits#include "rgrp.h" 20296177Sjhibbits 21296177Sjhibbits#define dlm_state_name(nn) { DLM_LOCK_##nn, #nn } 22296177Sjhibbits#define glock_trace_name(x) __print_symbolic(x, \ 23296177Sjhibbits dlm_state_name(IV), \ 24296177Sjhibbits dlm_state_name(NL), \ 25296177Sjhibbits dlm_state_name(CR), \ 26296177Sjhibbits dlm_state_name(CW), \ 27296177Sjhibbits dlm_state_name(PR), \ 28296177Sjhibbits dlm_state_name(PW), \ 29296177Sjhibbits dlm_state_name(EX)) 30296177Sjhibbits 31296177Sjhibbits#define block_state_name(x) __print_symbolic(x, \ 32296177Sjhibbits { GFS2_BLKST_FREE, "free" }, \ 33296177Sjhibbits { GFS2_BLKST_USED, "used" }, \ 34296177Sjhibbits { GFS2_BLKST_DINODE, "dinode" }, \ 35296177Sjhibbits { GFS2_BLKST_UNLINKED, "unlinked" }) 36296177Sjhibbits 37296177Sjhibbits#define TRACE_RS_DELETE 0 38296177Sjhibbits#define TRACE_RS_TREEDEL 1 39296177Sjhibbits#define TRACE_RS_INSERT 2 40296177Sjhibbits#define TRACE_RS_CLAIM 3 41296177Sjhibbits 42296177Sjhibbits#define rs_func_name(x) __print_symbolic(x, \ 43296177Sjhibbits { 0, "del " }, \ 44296177Sjhibbits { 1, "tdel" }, \ 45296177Sjhibbits { 2, "ins " }, \ 46296177Sjhibbits { 3, "clm " }) 47296177Sjhibbits 48296177Sjhibbits#define show_glock_flags(flags) __print_flags(flags, "", \ 49296177Sjhibbits {(1UL << GLF_LOCK), "l" }, \ 50296177Sjhibbits {(1UL << GLF_DEMOTE), "D" }, \ 51296177Sjhibbits {(1UL << GLF_PENDING_DEMOTE), "d" }, \ 52296177Sjhibbits {(1UL << GLF_DEMOTE_IN_PROGRESS), "p" }, \ 53296177Sjhibbits {(1UL << GLF_DIRTY), "y" }, \ 54296177Sjhibbits {(1UL << GLF_LFLUSH), "f" }, \ 55296177Sjhibbits {(1UL << GLF_INVALIDATE_IN_PROGRESS), "i" }, \ 56296177Sjhibbits {(1UL << GLF_REPLY_PENDING), "r" }, \ 57296177Sjhibbits {(1UL << GLF_INITIAL), "I" }, \ 58296177Sjhibbits {(1UL << GLF_FROZEN), "F" }, \ 59296177Sjhibbits {(1UL << GLF_LRU), "L" }, \ 60296177Sjhibbits {(1UL << GLF_OBJECT), "o" }, \ 61296177Sjhibbits {(1UL << GLF_BLOCKING), "b" }) 62296177Sjhibbits 63296177Sjhibbits#ifndef NUMPTY 64296177Sjhibbits#define NUMPTY 65296177Sjhibbitsstatic inline u8 glock_trace_state(unsigned int state) 66296177Sjhibbits{ 67296177Sjhibbits switch(state) { 68296177Sjhibbits case LM_ST_SHARED: 69296177Sjhibbits return DLM_LOCK_PR; 70296177Sjhibbits case LM_ST_DEFERRED: 71296177Sjhibbits return DLM_LOCK_CW; 72296177Sjhibbits case LM_ST_EXCLUSIVE: 73296177Sjhibbits return DLM_LOCK_EX; 74296177Sjhibbits } 75296177Sjhibbits return DLM_LOCK_NL; 76296177Sjhibbits} 77296177Sjhibbits#endif 78296177Sjhibbits 79296177Sjhibbits/* Section 1 - Locking 80296177Sjhibbits * 81296177Sjhibbits * Objectives: 82296177Sjhibbits * Latency: Remote demote request to state change 83296177Sjhibbits * Latency: Local lock request to state change 84296177Sjhibbits * Latency: State change to lock grant 85296177Sjhibbits * Correctness: Ordering of local lock state vs. I/O requests 86296177Sjhibbits * Correctness: Responses to remote demote requests 87296177Sjhibbits */ 88296177Sjhibbits 89296177Sjhibbits/* General glock state change (DLM lock request completes) */ 90296177SjhibbitsTRACE_EVENT(gfs2_glock_state_change, 91296177Sjhibbits 92296177Sjhibbits TP_PROTO(const struct gfs2_glock *gl, unsigned int new_state), 93296177Sjhibbits 94296177Sjhibbits TP_ARGS(gl, new_state), 95296177Sjhibbits 96296177Sjhibbits TP_STRUCT__entry( 97296177Sjhibbits __field( dev_t, dev ) 98296177Sjhibbits __field( u64, glnum ) 99296177Sjhibbits __field( u32, gltype ) 100296177Sjhibbits __field( u8, cur_state ) 101296177Sjhibbits __field( u8, new_state ) 102296177Sjhibbits __field( u8, dmt_state ) 103296177Sjhibbits __field( u8, tgt_state ) 104296177Sjhibbits __field( unsigned long, flags ) 105296177Sjhibbits ), 106296177Sjhibbits 107296177Sjhibbits TP_fast_assign( 108296177Sjhibbits __entry->dev = gl->gl_name.ln_sbd->sd_vfs->s_dev; 109296177Sjhibbits __entry->glnum = gl->gl_name.ln_number; 110296177Sjhibbits __entry->gltype = gl->gl_name.ln_type; 111296177Sjhibbits __entry->cur_state = glock_trace_state(gl->gl_state); 112296177Sjhibbits __entry->new_state = glock_trace_state(new_state); 113296177Sjhibbits __entry->tgt_state = glock_trace_state(gl->gl_target); 114296177Sjhibbits __entry->dmt_state = glock_trace_state(gl->gl_demote_state); 115296177Sjhibbits __entry->flags = gl->gl_flags | (gl->gl_object ? (1UL<<GLF_OBJECT) : 0); 116296177Sjhibbits ), 117296177Sjhibbits 118296177Sjhibbits TP_printk("%u,%u glock %d:%lld state %s to %s tgt:%s dmt:%s flags:%s", 119296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), __entry->gltype, 120296177Sjhibbits (unsigned long long)__entry->glnum, 121296177Sjhibbits glock_trace_name(__entry->cur_state), 122296177Sjhibbits glock_trace_name(__entry->new_state), 123296177Sjhibbits glock_trace_name(__entry->tgt_state), 124296177Sjhibbits glock_trace_name(__entry->dmt_state), 125296177Sjhibbits show_glock_flags(__entry->flags)) 126296177Sjhibbits); 127296177Sjhibbits 128296177Sjhibbits/* State change -> unlocked, glock is being deallocated */ 129296177SjhibbitsTRACE_EVENT(gfs2_glock_put, 130296177Sjhibbits 131296177Sjhibbits TP_PROTO(const struct gfs2_glock *gl), 132296177Sjhibbits 133296177Sjhibbits TP_ARGS(gl), 134296177Sjhibbits 135296177Sjhibbits TP_STRUCT__entry( 136296177Sjhibbits __field( dev_t, dev ) 137296177Sjhibbits __field( u64, glnum ) 138296177Sjhibbits __field( u32, gltype ) 139296177Sjhibbits __field( u8, cur_state ) 140296177Sjhibbits __field( unsigned long, flags ) 141296177Sjhibbits ), 142296177Sjhibbits 143296177Sjhibbits TP_fast_assign( 144296177Sjhibbits __entry->dev = gl->gl_name.ln_sbd->sd_vfs->s_dev; 145296177Sjhibbits __entry->gltype = gl->gl_name.ln_type; 146296177Sjhibbits __entry->glnum = gl->gl_name.ln_number; 147296177Sjhibbits __entry->cur_state = glock_trace_state(gl->gl_state); 148296177Sjhibbits __entry->flags = gl->gl_flags | (gl->gl_object ? (1UL<<GLF_OBJECT) : 0); 149296177Sjhibbits ), 150296177Sjhibbits 151296177Sjhibbits TP_printk("%u,%u glock %d:%lld state %s => %s flags:%s", 152296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), 153296177Sjhibbits __entry->gltype, (unsigned long long)__entry->glnum, 154296177Sjhibbits glock_trace_name(__entry->cur_state), 155296177Sjhibbits glock_trace_name(DLM_LOCK_IV), 156296177Sjhibbits show_glock_flags(__entry->flags)) 157296177Sjhibbits 158296177Sjhibbits); 159296177Sjhibbits 160296177Sjhibbits/* Callback (local or remote) requesting lock demotion */ 161296177SjhibbitsTRACE_EVENT(gfs2_demote_rq, 162296177Sjhibbits 163296177Sjhibbits TP_PROTO(const struct gfs2_glock *gl, bool remote), 164296177Sjhibbits 165296177Sjhibbits TP_ARGS(gl, remote), 166296177Sjhibbits 167296177Sjhibbits TP_STRUCT__entry( 168296177Sjhibbits __field( dev_t, dev ) 169296177Sjhibbits __field( u64, glnum ) 170296177Sjhibbits __field( u32, gltype ) 171296177Sjhibbits __field( u8, cur_state ) 172296177Sjhibbits __field( u8, dmt_state ) 173296177Sjhibbits __field( unsigned long, flags ) 174296177Sjhibbits __field( bool, remote ) 175296177Sjhibbits ), 176296177Sjhibbits 177296177Sjhibbits TP_fast_assign( 178296177Sjhibbits __entry->dev = gl->gl_name.ln_sbd->sd_vfs->s_dev; 179296177Sjhibbits __entry->gltype = gl->gl_name.ln_type; 180296177Sjhibbits __entry->glnum = gl->gl_name.ln_number; 181296177Sjhibbits __entry->cur_state = glock_trace_state(gl->gl_state); 182296177Sjhibbits __entry->dmt_state = glock_trace_state(gl->gl_demote_state); 183296177Sjhibbits __entry->flags = gl->gl_flags | (gl->gl_object ? (1UL<<GLF_OBJECT) : 0); 184296177Sjhibbits __entry->remote = remote; 185296177Sjhibbits ), 186296177Sjhibbits 187296177Sjhibbits TP_printk("%u,%u glock %d:%lld demote %s to %s flags:%s %s", 188296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), __entry->gltype, 189296177Sjhibbits (unsigned long long)__entry->glnum, 190296177Sjhibbits glock_trace_name(__entry->cur_state), 191296177Sjhibbits glock_trace_name(__entry->dmt_state), 192296177Sjhibbits show_glock_flags(__entry->flags), 193296177Sjhibbits __entry->remote ? "remote" : "local") 194296177Sjhibbits 195296177Sjhibbits); 196296177Sjhibbits 197296177Sjhibbits/* Promotion/grant of a glock */ 198296177SjhibbitsTRACE_EVENT(gfs2_promote, 199296177Sjhibbits 200296177Sjhibbits TP_PROTO(const struct gfs2_holder *gh), 201296177Sjhibbits 202296177Sjhibbits TP_ARGS(gh), 203296177Sjhibbits 204296177Sjhibbits TP_STRUCT__entry( 205296177Sjhibbits __field( dev_t, dev ) 206296177Sjhibbits __field( u64, glnum ) 207296177Sjhibbits __field( u32, gltype ) 208296177Sjhibbits __field( u8, state ) 209296177Sjhibbits ), 210296177Sjhibbits 211296177Sjhibbits TP_fast_assign( 212296177Sjhibbits __entry->dev = gh->gh_gl->gl_name.ln_sbd->sd_vfs->s_dev; 213296177Sjhibbits __entry->glnum = gh->gh_gl->gl_name.ln_number; 214296177Sjhibbits __entry->gltype = gh->gh_gl->gl_name.ln_type; 215296177Sjhibbits __entry->state = glock_trace_state(gh->gh_state); 216296177Sjhibbits ), 217296177Sjhibbits 218296177Sjhibbits TP_printk("%u,%u glock %u:%llu promote %s", 219296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), __entry->gltype, 220296177Sjhibbits (unsigned long long)__entry->glnum, 221296177Sjhibbits glock_trace_name(__entry->state)) 222296177Sjhibbits); 223296177Sjhibbits 224296177Sjhibbits/* Queue/dequeue a lock request */ 225296177SjhibbitsTRACE_EVENT(gfs2_glock_queue, 226296177Sjhibbits 227296177Sjhibbits TP_PROTO(const struct gfs2_holder *gh, int queue), 228296177Sjhibbits 229296177Sjhibbits TP_ARGS(gh, queue), 230296177Sjhibbits 231296177Sjhibbits TP_STRUCT__entry( 232296177Sjhibbits __field( dev_t, dev ) 233296177Sjhibbits __field( u64, glnum ) 234296177Sjhibbits __field( u32, gltype ) 235296177Sjhibbits __field( int, queue ) 236296177Sjhibbits __field( u8, state ) 237296177Sjhibbits ), 238296177Sjhibbits 239296177Sjhibbits TP_fast_assign( 240296177Sjhibbits __entry->dev = gh->gh_gl->gl_name.ln_sbd->sd_vfs->s_dev; 241296177Sjhibbits __entry->glnum = gh->gh_gl->gl_name.ln_number; 242296177Sjhibbits __entry->gltype = gh->gh_gl->gl_name.ln_type; 243296177Sjhibbits __entry->queue = queue; 244296177Sjhibbits __entry->state = glock_trace_state(gh->gh_state); 245296177Sjhibbits ), 246296177Sjhibbits 247296177Sjhibbits TP_printk("%u,%u glock %u:%llu %squeue %s", 248296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), __entry->gltype, 249296177Sjhibbits (unsigned long long)__entry->glnum, 250296177Sjhibbits __entry->queue ? "" : "de", 251296177Sjhibbits glock_trace_name(__entry->state)) 252296177Sjhibbits); 253296177Sjhibbits 254296177Sjhibbits/* DLM sends a reply to GFS2 */ 255296177SjhibbitsTRACE_EVENT(gfs2_glock_lock_time, 256296177Sjhibbits 257296177Sjhibbits TP_PROTO(const struct gfs2_glock *gl, s64 tdiff), 258296177Sjhibbits 259296177Sjhibbits TP_ARGS(gl, tdiff), 260296177Sjhibbits 261296177Sjhibbits TP_STRUCT__entry( 262296177Sjhibbits __field( dev_t, dev ) 263296177Sjhibbits __field( u64, glnum ) 264296177Sjhibbits __field( u32, gltype ) 265296177Sjhibbits __field( int, status ) 266296177Sjhibbits __field( char, flags ) 267296177Sjhibbits __field( s64, tdiff ) 268296177Sjhibbits __field( u64, srtt ) 269296177Sjhibbits __field( u64, srttvar ) 270296177Sjhibbits __field( u64, srttb ) 271296177Sjhibbits __field( u64, srttvarb ) 272296177Sjhibbits __field( u64, sirt ) 273296177Sjhibbits __field( u64, sirtvar ) 274296177Sjhibbits __field( u64, dcount ) 275296177Sjhibbits __field( u64, qcount ) 276296177Sjhibbits ), 277296177Sjhibbits 278296177Sjhibbits TP_fast_assign( 279296177Sjhibbits __entry->dev = gl->gl_name.ln_sbd->sd_vfs->s_dev; 280296177Sjhibbits __entry->glnum = gl->gl_name.ln_number; 281296177Sjhibbits __entry->gltype = gl->gl_name.ln_type; 282296177Sjhibbits __entry->status = gl->gl_lksb.sb_status; 283296177Sjhibbits __entry->flags = gl->gl_lksb.sb_flags; 284296177Sjhibbits __entry->tdiff = tdiff; 285296177Sjhibbits __entry->srtt = gl->gl_stats.stats[GFS2_LKS_SRTT]; 286296177Sjhibbits __entry->srttvar = gl->gl_stats.stats[GFS2_LKS_SRTTVAR]; 287296177Sjhibbits __entry->srttb = gl->gl_stats.stats[GFS2_LKS_SRTTB]; 288296177Sjhibbits __entry->srttvarb = gl->gl_stats.stats[GFS2_LKS_SRTTVARB]; 289296177Sjhibbits __entry->sirt = gl->gl_stats.stats[GFS2_LKS_SIRT]; 290296177Sjhibbits __entry->sirtvar = gl->gl_stats.stats[GFS2_LKS_SIRTVAR]; 291296177Sjhibbits __entry->dcount = gl->gl_stats.stats[GFS2_LKS_DCOUNT]; 292296177Sjhibbits __entry->qcount = gl->gl_stats.stats[GFS2_LKS_QCOUNT]; 293296177Sjhibbits ), 294296177Sjhibbits 295296177Sjhibbits TP_printk("%u,%u glock %d:%lld status:%d flags:%02x tdiff:%lld srtt:%lld/%lld srttb:%lld/%lld sirt:%lld/%lld dcnt:%lld qcnt:%lld", 296296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), __entry->gltype, 297296177Sjhibbits (unsigned long long)__entry->glnum, 298296177Sjhibbits __entry->status, __entry->flags, 299296177Sjhibbits (long long)__entry->tdiff, 300296177Sjhibbits (long long)__entry->srtt, 301296177Sjhibbits (long long)__entry->srttvar, 302296177Sjhibbits (long long)__entry->srttb, 303296177Sjhibbits (long long)__entry->srttvarb, 304296177Sjhibbits (long long)__entry->sirt, 305296177Sjhibbits (long long)__entry->sirtvar, 306296177Sjhibbits (long long)__entry->dcount, 307296177Sjhibbits (long long)__entry->qcount) 308296177Sjhibbits); 309296177Sjhibbits 310296177Sjhibbits/* Section 2 - Log/journal 311296177Sjhibbits * 312296177Sjhibbits * Objectives: 313296177Sjhibbits * Latency: Log flush time 314296177Sjhibbits * Correctness: pin/unpin vs. disk I/O ordering 315296177Sjhibbits * Performance: Log usage stats 316296177Sjhibbits */ 317296177Sjhibbits 318296177Sjhibbits/* Pin/unpin a block in the log */ 319296177SjhibbitsTRACE_EVENT(gfs2_pin, 320296177Sjhibbits 321296177Sjhibbits TP_PROTO(const struct gfs2_bufdata *bd, int pin), 322296177Sjhibbits 323296177Sjhibbits TP_ARGS(bd, pin), 324296177Sjhibbits 325296177Sjhibbits TP_STRUCT__entry( 326296177Sjhibbits __field( dev_t, dev ) 327296177Sjhibbits __field( int, pin ) 328296177Sjhibbits __field( u32, len ) 329296177Sjhibbits __field( sector_t, block ) 330296177Sjhibbits __field( u64, ino ) 331296177Sjhibbits ), 332296177Sjhibbits 333296177Sjhibbits TP_fast_assign( 334296177Sjhibbits __entry->dev = bd->bd_gl->gl_name.ln_sbd->sd_vfs->s_dev; 335296177Sjhibbits __entry->pin = pin; 336296177Sjhibbits __entry->len = bd->bd_bh->b_size; 337296177Sjhibbits __entry->block = bd->bd_bh->b_blocknr; 338296177Sjhibbits __entry->ino = bd->bd_gl->gl_name.ln_number; 339296177Sjhibbits ), 340296177Sjhibbits 341296177Sjhibbits TP_printk("%u,%u log %s %llu/%lu inode %llu", 342296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), 343296177Sjhibbits __entry->pin ? "pin" : "unpin", 344296177Sjhibbits (unsigned long long)__entry->block, 345296177Sjhibbits (unsigned long)__entry->len, 346296177Sjhibbits (unsigned long long)__entry->ino) 347296177Sjhibbits); 348296177Sjhibbits 349296177Sjhibbits/* Flushing the log */ 350296177SjhibbitsTRACE_EVENT(gfs2_log_flush, 351296177Sjhibbits 352296177Sjhibbits TP_PROTO(const struct gfs2_sbd *sdp, int start, u32 flags), 353296177Sjhibbits 354296177Sjhibbits TP_ARGS(sdp, start, flags), 355296177Sjhibbits 356296177Sjhibbits TP_STRUCT__entry( 357296177Sjhibbits __field( dev_t, dev ) 358296177Sjhibbits __field( int, start ) 359296177Sjhibbits __field( u64, log_seq ) 360296177Sjhibbits __field( u32, flags ) 361296177Sjhibbits ), 362296177Sjhibbits 363296177Sjhibbits TP_fast_assign( 364296177Sjhibbits __entry->dev = sdp->sd_vfs->s_dev; 365296177Sjhibbits __entry->start = start; 366296177Sjhibbits __entry->log_seq = sdp->sd_log_sequence; 367296177Sjhibbits __entry->flags = flags; 368296177Sjhibbits ), 369296177Sjhibbits 370296177Sjhibbits TP_printk("%u,%u log flush %s %llu %llx", 371296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), 372296177Sjhibbits __entry->start ? "start" : "end", 373296177Sjhibbits (unsigned long long)__entry->log_seq, 374296177Sjhibbits (unsigned long long)__entry->flags) 375296177Sjhibbits); 376296177Sjhibbits 377296177Sjhibbits/* Reserving/releasing blocks in the log */ 378296177SjhibbitsTRACE_EVENT(gfs2_log_blocks, 379296177Sjhibbits 380296177Sjhibbits TP_PROTO(const struct gfs2_sbd *sdp, int blocks), 381296177Sjhibbits 382296177Sjhibbits TP_ARGS(sdp, blocks), 383296177Sjhibbits 384296177Sjhibbits TP_STRUCT__entry( 385296177Sjhibbits __field( dev_t, dev ) 386296177Sjhibbits __field( int, blocks ) 387296177Sjhibbits __field( int, blks_free ) 388296177Sjhibbits ), 389296177Sjhibbits 390296177Sjhibbits TP_fast_assign( 391296177Sjhibbits __entry->dev = sdp->sd_vfs->s_dev; 392296177Sjhibbits __entry->blocks = blocks; 393296177Sjhibbits __entry->blks_free = atomic_read(&sdp->sd_log_blks_free); 394296177Sjhibbits ), 395296177Sjhibbits 396296177Sjhibbits TP_printk("%u,%u log reserve %d %d", MAJOR(__entry->dev), 397296177Sjhibbits MINOR(__entry->dev), __entry->blocks, __entry->blks_free) 398296177Sjhibbits); 399296177Sjhibbits 400296177Sjhibbits/* Writing back the AIL */ 401296177SjhibbitsTRACE_EVENT(gfs2_ail_flush, 402296177Sjhibbits 403296177Sjhibbits TP_PROTO(const struct gfs2_sbd *sdp, const struct writeback_control *wbc, int start), 404296177Sjhibbits 405296177Sjhibbits TP_ARGS(sdp, wbc, start), 406296177Sjhibbits 407296177Sjhibbits TP_STRUCT__entry( 408296177Sjhibbits __field( dev_t, dev ) 409296177Sjhibbits __field( int, start ) 410296177Sjhibbits __field( int, sync_mode ) 411296177Sjhibbits __field( long, nr_to_write ) 412296177Sjhibbits ), 413296177Sjhibbits 414296177Sjhibbits TP_fast_assign( 415296177Sjhibbits __entry->dev = sdp->sd_vfs->s_dev; 416296177Sjhibbits __entry->start = start; 417296177Sjhibbits __entry->sync_mode = wbc->sync_mode; 418296177Sjhibbits __entry->nr_to_write = wbc->nr_to_write; 419296177Sjhibbits ), 420296177Sjhibbits 421296177Sjhibbits TP_printk("%u,%u ail flush %s %s %ld", MAJOR(__entry->dev), 422296177Sjhibbits MINOR(__entry->dev), __entry->start ? "start" : "end", 423296177Sjhibbits __entry->sync_mode == WB_SYNC_ALL ? "all" : "none", 424296177Sjhibbits __entry->nr_to_write) 425296177Sjhibbits); 426296177Sjhibbits 427296177Sjhibbits/* Section 3 - bmap 428296177Sjhibbits * 429296177Sjhibbits * Objectives: 430296177Sjhibbits * Latency: Bmap request time 431296177Sjhibbits * Performance: Block allocator tracing 432296177Sjhibbits * Correctness: Test of disard generation vs. blocks allocated 433296177Sjhibbits */ 434296177Sjhibbits 435296177Sjhibbits/* Map an extent of blocks, possibly a new allocation */ 436296177SjhibbitsTRACE_EVENT(gfs2_bmap, 437296177Sjhibbits 438296177Sjhibbits TP_PROTO(const struct gfs2_inode *ip, const struct buffer_head *bh, 439296177Sjhibbits sector_t lblock, int create, int errno), 440296177Sjhibbits 441296177Sjhibbits TP_ARGS(ip, bh, lblock, create, errno), 442296177Sjhibbits 443296177Sjhibbits TP_STRUCT__entry( 444296177Sjhibbits __field( dev_t, dev ) 445296177Sjhibbits __field( sector_t, lblock ) 446296177Sjhibbits __field( sector_t, pblock ) 447296177Sjhibbits __field( u64, inum ) 448296177Sjhibbits __field( unsigned long, state ) 449296177Sjhibbits __field( u32, len ) 450296177Sjhibbits __field( int, create ) 451296177Sjhibbits __field( int, errno ) 452296177Sjhibbits ), 453296177Sjhibbits 454296177Sjhibbits TP_fast_assign( 455296177Sjhibbits __entry->dev = ip->i_gl->gl_name.ln_sbd->sd_vfs->s_dev; 456296177Sjhibbits __entry->lblock = lblock; 457296177Sjhibbits __entry->pblock = buffer_mapped(bh) ? bh->b_blocknr : 0; 458296177Sjhibbits __entry->inum = ip->i_no_addr; 459296177Sjhibbits __entry->state = bh->b_state; 460296177Sjhibbits __entry->len = bh->b_size; 461296177Sjhibbits __entry->create = create; 462296177Sjhibbits __entry->errno = errno; 463296177Sjhibbits ), 464296177Sjhibbits 465296177Sjhibbits TP_printk("%u,%u bmap %llu map %llu/%lu to %llu flags:%08lx %s %d", 466296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), 467296177Sjhibbits (unsigned long long)__entry->inum, 468296177Sjhibbits (unsigned long long)__entry->lblock, 469296177Sjhibbits (unsigned long)__entry->len, 470296177Sjhibbits (unsigned long long)__entry->pblock, 471296177Sjhibbits __entry->state, __entry->create ? "create " : "nocreate", 472296177Sjhibbits __entry->errno) 473296177Sjhibbits); 474296177Sjhibbits 475296177SjhibbitsTRACE_EVENT(gfs2_iomap_start, 476296177Sjhibbits 477296177Sjhibbits TP_PROTO(const struct gfs2_inode *ip, loff_t pos, ssize_t length, 478296177Sjhibbits u16 flags), 479296177Sjhibbits 480296177Sjhibbits TP_ARGS(ip, pos, length, flags), 481296177Sjhibbits 482296177Sjhibbits TP_STRUCT__entry( 483296177Sjhibbits __field( dev_t, dev ) 484296177Sjhibbits __field( u64, inum ) 485296177Sjhibbits __field( loff_t, pos ) 486296177Sjhibbits __field( ssize_t, length ) 487296177Sjhibbits __field( u16, flags ) 488296177Sjhibbits ), 489296177Sjhibbits 490296177Sjhibbits TP_fast_assign( 491296177Sjhibbits __entry->dev = ip->i_gl->gl_name.ln_sbd->sd_vfs->s_dev; 492296177Sjhibbits __entry->inum = ip->i_no_addr; 493296177Sjhibbits __entry->pos = pos; 494296177Sjhibbits __entry->length = length; 495296177Sjhibbits __entry->flags = flags; 496296177Sjhibbits ), 497296177Sjhibbits 498296177Sjhibbits TP_printk("%u,%u bmap %llu iomap start %llu/%lu flags:%08x", 499296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), 500296177Sjhibbits (unsigned long long)__entry->inum, 501296177Sjhibbits (unsigned long long)__entry->pos, 502296177Sjhibbits (unsigned long)__entry->length, (u16)__entry->flags) 503296177Sjhibbits); 504296177Sjhibbits 505296177SjhibbitsTRACE_EVENT(gfs2_iomap_end, 506296177Sjhibbits 507296177Sjhibbits TP_PROTO(const struct gfs2_inode *ip, struct iomap *iomap, int ret), 508296177Sjhibbits 509296177Sjhibbits TP_ARGS(ip, iomap, ret), 510296177Sjhibbits 511296177Sjhibbits TP_STRUCT__entry( 512296177Sjhibbits __field( dev_t, dev ) 513296177Sjhibbits __field( u64, inum ) 514296177Sjhibbits __field( loff_t, offset ) 515296177Sjhibbits __field( ssize_t, length ) 516296177Sjhibbits __field( sector_t, pblock ) 517296177Sjhibbits __field( u16, flags ) 518296177Sjhibbits __field( u16, type ) 519296177Sjhibbits __field( int, ret ) 520296177Sjhibbits ), 521296177Sjhibbits 522296177Sjhibbits TP_fast_assign( 523296177Sjhibbits __entry->dev = ip->i_gl->gl_name.ln_sbd->sd_vfs->s_dev; 524296177Sjhibbits __entry->inum = ip->i_no_addr; 525296177Sjhibbits __entry->offset = iomap->offset; 526296177Sjhibbits __entry->length = iomap->length; 527296177Sjhibbits __entry->pblock = iomap->addr == IOMAP_NULL_ADDR ? 0 : 528296177Sjhibbits (iomap->addr >> ip->i_inode.i_blkbits); 529296177Sjhibbits __entry->flags = iomap->flags; 530296177Sjhibbits __entry->type = iomap->type; 531296177Sjhibbits __entry->ret = ret; 532296177Sjhibbits ), 533296177Sjhibbits 534296177Sjhibbits TP_printk("%u,%u bmap %llu iomap end %llu/%lu to %llu ty:%d flags:%08x rc:%d", 535296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), 536296177Sjhibbits (unsigned long long)__entry->inum, 537296177Sjhibbits (unsigned long long)__entry->offset, 538296177Sjhibbits (unsigned long)__entry->length, 539296177Sjhibbits (long long)__entry->pblock, 540296177Sjhibbits (u16)__entry->type, 541296177Sjhibbits (u16)__entry->flags, __entry->ret) 542296177Sjhibbits); 543296177Sjhibbits 544296177Sjhibbits/* Keep track of blocks as they are allocated/freed */ 545296177SjhibbitsTRACE_EVENT(gfs2_block_alloc, 546296177Sjhibbits 547296177Sjhibbits TP_PROTO(const struct gfs2_inode *ip, struct gfs2_rgrpd *rgd, 548296177Sjhibbits u64 block, unsigned len, u8 block_state), 549296177Sjhibbits 550296177Sjhibbits TP_ARGS(ip, rgd, block, len, block_state), 551296177Sjhibbits 552296177Sjhibbits TP_STRUCT__entry( 553296177Sjhibbits __field( dev_t, dev ) 554296177Sjhibbits __field( u64, start ) 555296177Sjhibbits __field( u64, inum ) 556296177Sjhibbits __field( u32, len ) 557296177Sjhibbits __field( u8, block_state ) 558296177Sjhibbits __field( u64, rd_addr ) 559296177Sjhibbits __field( u32, rd_free_clone ) 560296177Sjhibbits __field( u32, rd_requested ) 561296177Sjhibbits __field( u32, rd_reserved ) 562296177Sjhibbits ), 563296177Sjhibbits 564296177Sjhibbits TP_fast_assign( 565296177Sjhibbits __entry->dev = rgd->rd_gl->gl_name.ln_sbd->sd_vfs->s_dev; 566296177Sjhibbits __entry->start = block; 567296177Sjhibbits __entry->inum = ip->i_no_addr; 568296177Sjhibbits __entry->len = len; 569296177Sjhibbits __entry->block_state = block_state; 570296177Sjhibbits __entry->rd_addr = rgd->rd_addr; 571296177Sjhibbits __entry->rd_free_clone = rgd->rd_free_clone; 572296177Sjhibbits __entry->rd_requested = rgd->rd_requested; 573296177Sjhibbits __entry->rd_reserved = rgd->rd_reserved; 574296177Sjhibbits ), 575296177Sjhibbits 576296177Sjhibbits TP_printk("%u,%u bmap %llu alloc %llu/%lu %s rg:%llu rf:%u rq:%u rr:%u", 577296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), 578296177Sjhibbits (unsigned long long)__entry->inum, 579296177Sjhibbits (unsigned long long)__entry->start, 580296177Sjhibbits (unsigned long)__entry->len, 581296177Sjhibbits block_state_name(__entry->block_state), 582296177Sjhibbits (unsigned long long)__entry->rd_addr, 583296177Sjhibbits __entry->rd_free_clone, 584296177Sjhibbits __entry->rd_requested, 585296177Sjhibbits __entry->rd_reserved) 586296177Sjhibbits); 587296177Sjhibbits 588296177Sjhibbits/* Keep track of multi-block reservations as they are allocated/freed */ 589296177SjhibbitsTRACE_EVENT(gfs2_rs, 590296177Sjhibbits 591296177Sjhibbits TP_PROTO(const struct gfs2_blkreserv *rs, u8 func), 592296177Sjhibbits 593296177Sjhibbits TP_ARGS(rs, func), 594296177Sjhibbits 595296177Sjhibbits TP_STRUCT__entry( 596296177Sjhibbits __field( dev_t, dev ) 597296177Sjhibbits __field( u64, rd_addr ) 598296177Sjhibbits __field( u32, rd_free_clone ) 599296177Sjhibbits __field( u32, rd_requested ) 600296177Sjhibbits __field( u32, rd_reserved ) 601296177Sjhibbits __field( u64, inum ) 602296177Sjhibbits __field( u64, start ) 603296177Sjhibbits __field( u32, requested ) 604296177Sjhibbits __field( u32, reserved ) 605296177Sjhibbits __field( u8, func ) 606296177Sjhibbits ), 607296177Sjhibbits 608296177Sjhibbits TP_fast_assign( 609296177Sjhibbits __entry->dev = rs->rs_rgd->rd_sbd->sd_vfs->s_dev; 610296177Sjhibbits __entry->rd_addr = rs->rs_rgd->rd_addr; 611296177Sjhibbits __entry->rd_free_clone = rs->rs_rgd->rd_free_clone; 612296177Sjhibbits __entry->rd_requested = rs->rs_rgd->rd_requested; 613296177Sjhibbits __entry->rd_reserved = rs->rs_rgd->rd_reserved; 614296177Sjhibbits __entry->inum = container_of(rs, struct gfs2_inode, 615296177Sjhibbits i_res)->i_no_addr; 616296177Sjhibbits __entry->start = rs->rs_start; 617296177Sjhibbits __entry->requested = rs->rs_requested; 618296177Sjhibbits __entry->reserved = rs->rs_reserved; 619296177Sjhibbits __entry->func = func; 620296177Sjhibbits ), 621296177Sjhibbits 622296177Sjhibbits TP_printk("%u,%u bmap %llu resrv %llu rg:%llu rf:%u rq:%u rr:%u %s q:%u r:%u", 623296177Sjhibbits MAJOR(__entry->dev), MINOR(__entry->dev), 624296177Sjhibbits (unsigned long long)__entry->inum, 625296177Sjhibbits (unsigned long long)__entry->start, 626296177Sjhibbits (unsigned long long)__entry->rd_addr, 627296177Sjhibbits __entry->rd_free_clone, 628296177Sjhibbits __entry->rd_requested, 629296177Sjhibbits __entry->rd_reserved, 630296177Sjhibbits rs_func_name(__entry->func), 631296177Sjhibbits __entry->requested, 632296177Sjhibbits __entry->reserved) 633296177Sjhibbits); 634296177Sjhibbits 635296177Sjhibbits#endif /* _TRACE_GFS2_H */ 636296177Sjhibbits 637296177Sjhibbits/* This part must be outside protection */ 638296177Sjhibbits#undef TRACE_INCLUDE_PATH 639296177Sjhibbits#define TRACE_INCLUDE_PATH . 640296177Sjhibbits#define TRACE_INCLUDE_FILE trace_gfs2 641296177Sjhibbits#include <trace/define_trace.h> 642296177Sjhibbits 643296177Sjhibbits