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