162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#undef TRACE_SYSTEM
362306a36Sopenharmony_ci#define TRACE_SYSTEM writeback
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ)
662306a36Sopenharmony_ci#define _TRACE_WRITEBACK_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/tracepoint.h>
962306a36Sopenharmony_ci#include <linux/backing-dev.h>
1062306a36Sopenharmony_ci#include <linux/writeback.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define show_inode_state(state)					\
1362306a36Sopenharmony_ci	__print_flags(state, "|",				\
1462306a36Sopenharmony_ci		{I_DIRTY_SYNC,		"I_DIRTY_SYNC"},	\
1562306a36Sopenharmony_ci		{I_DIRTY_DATASYNC,	"I_DIRTY_DATASYNC"},	\
1662306a36Sopenharmony_ci		{I_DIRTY_PAGES,		"I_DIRTY_PAGES"},	\
1762306a36Sopenharmony_ci		{I_NEW,			"I_NEW"},		\
1862306a36Sopenharmony_ci		{I_WILL_FREE,		"I_WILL_FREE"},		\
1962306a36Sopenharmony_ci		{I_FREEING,		"I_FREEING"},		\
2062306a36Sopenharmony_ci		{I_CLEAR,		"I_CLEAR"},		\
2162306a36Sopenharmony_ci		{I_SYNC,		"I_SYNC"},		\
2262306a36Sopenharmony_ci		{I_DIRTY_TIME,		"I_DIRTY_TIME"},	\
2362306a36Sopenharmony_ci		{I_REFERENCED,		"I_REFERENCED"}		\
2462306a36Sopenharmony_ci	)
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/* enums need to be exported to user space */
2762306a36Sopenharmony_ci#undef EM
2862306a36Sopenharmony_ci#undef EMe
2962306a36Sopenharmony_ci#define EM(a,b) 	TRACE_DEFINE_ENUM(a);
3062306a36Sopenharmony_ci#define EMe(a,b)	TRACE_DEFINE_ENUM(a);
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define WB_WORK_REASON							\
3362306a36Sopenharmony_ci	EM( WB_REASON_BACKGROUND,		"background")		\
3462306a36Sopenharmony_ci	EM( WB_REASON_VMSCAN,			"vmscan")		\
3562306a36Sopenharmony_ci	EM( WB_REASON_SYNC,			"sync")			\
3662306a36Sopenharmony_ci	EM( WB_REASON_PERIODIC,			"periodic")		\
3762306a36Sopenharmony_ci	EM( WB_REASON_LAPTOP_TIMER,		"laptop_timer")		\
3862306a36Sopenharmony_ci	EM( WB_REASON_FS_FREE_SPACE,		"fs_free_space")	\
3962306a36Sopenharmony_ci	EM( WB_REASON_FORKER_THREAD,		"forker_thread")	\
4062306a36Sopenharmony_ci	EMe(WB_REASON_FOREIGN_FLUSH,		"foreign_flush")
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ciWB_WORK_REASON
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/*
4562306a36Sopenharmony_ci * Now redefine the EM() and EMe() macros to map the enums to the strings
4662306a36Sopenharmony_ci * that will be printed in the output.
4762306a36Sopenharmony_ci */
4862306a36Sopenharmony_ci#undef EM
4962306a36Sopenharmony_ci#undef EMe
5062306a36Sopenharmony_ci#define EM(a,b)		{ a, b },
5162306a36Sopenharmony_ci#define EMe(a,b)	{ a, b }
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistruct wb_writeback_work;
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ciDECLARE_EVENT_CLASS(writeback_folio_template,
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	TP_PROTO(struct folio *folio, struct address_space *mapping),
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	TP_ARGS(folio, mapping),
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	TP_STRUCT__entry (
6262306a36Sopenharmony_ci		__array(char, name, 32)
6362306a36Sopenharmony_ci		__field(ino_t, ino)
6462306a36Sopenharmony_ci		__field(pgoff_t, index)
6562306a36Sopenharmony_ci	),
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	TP_fast_assign(
6862306a36Sopenharmony_ci		strscpy_pad(__entry->name,
6962306a36Sopenharmony_ci			    bdi_dev_name(mapping ? inode_to_bdi(mapping->host) :
7062306a36Sopenharmony_ci					 NULL), 32);
7162306a36Sopenharmony_ci		__entry->ino = (mapping && mapping->host) ? mapping->host->i_ino : 0;
7262306a36Sopenharmony_ci		__entry->index = folio->index;
7362306a36Sopenharmony_ci	),
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	TP_printk("bdi %s: ino=%lu index=%lu",
7662306a36Sopenharmony_ci		__entry->name,
7762306a36Sopenharmony_ci		(unsigned long)__entry->ino,
7862306a36Sopenharmony_ci		__entry->index
7962306a36Sopenharmony_ci	)
8062306a36Sopenharmony_ci);
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ciDEFINE_EVENT(writeback_folio_template, writeback_dirty_folio,
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	TP_PROTO(struct folio *folio, struct address_space *mapping),
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	TP_ARGS(folio, mapping)
8762306a36Sopenharmony_ci);
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ciDEFINE_EVENT(writeback_folio_template, folio_wait_writeback,
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	TP_PROTO(struct folio *folio, struct address_space *mapping),
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	TP_ARGS(folio, mapping)
9462306a36Sopenharmony_ci);
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ciDECLARE_EVENT_CLASS(writeback_dirty_inode_template,
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	TP_PROTO(struct inode *inode, int flags),
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	TP_ARGS(inode, flags),
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	TP_STRUCT__entry (
10362306a36Sopenharmony_ci		__array(char, name, 32)
10462306a36Sopenharmony_ci		__field(ino_t, ino)
10562306a36Sopenharmony_ci		__field(unsigned long, state)
10662306a36Sopenharmony_ci		__field(unsigned long, flags)
10762306a36Sopenharmony_ci	),
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	TP_fast_assign(
11062306a36Sopenharmony_ci		struct backing_dev_info *bdi = inode_to_bdi(inode);
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci		/* may be called for files on pseudo FSes w/ unregistered bdi */
11362306a36Sopenharmony_ci		strscpy_pad(__entry->name, bdi_dev_name(bdi), 32);
11462306a36Sopenharmony_ci		__entry->ino		= inode->i_ino;
11562306a36Sopenharmony_ci		__entry->state		= inode->i_state;
11662306a36Sopenharmony_ci		__entry->flags		= flags;
11762306a36Sopenharmony_ci	),
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	TP_printk("bdi %s: ino=%lu state=%s flags=%s",
12062306a36Sopenharmony_ci		__entry->name,
12162306a36Sopenharmony_ci		(unsigned long)__entry->ino,
12262306a36Sopenharmony_ci		show_inode_state(__entry->state),
12362306a36Sopenharmony_ci		show_inode_state(__entry->flags)
12462306a36Sopenharmony_ci	)
12562306a36Sopenharmony_ci);
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ciDEFINE_EVENT(writeback_dirty_inode_template, writeback_mark_inode_dirty,
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	TP_PROTO(struct inode *inode, int flags),
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	TP_ARGS(inode, flags)
13262306a36Sopenharmony_ci);
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ciDEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode_start,
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci	TP_PROTO(struct inode *inode, int flags),
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	TP_ARGS(inode, flags)
13962306a36Sopenharmony_ci);
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ciDEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode,
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	TP_PROTO(struct inode *inode, int flags),
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci	TP_ARGS(inode, flags)
14662306a36Sopenharmony_ci);
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci#ifdef CREATE_TRACE_POINTS
14962306a36Sopenharmony_ci#ifdef CONFIG_CGROUP_WRITEBACK
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_cistatic inline ino_t __trace_wb_assign_cgroup(struct bdi_writeback *wb)
15262306a36Sopenharmony_ci{
15362306a36Sopenharmony_ci	return cgroup_ino(wb->memcg_css->cgroup);
15462306a36Sopenharmony_ci}
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_cistatic inline ino_t __trace_wbc_assign_cgroup(struct writeback_control *wbc)
15762306a36Sopenharmony_ci{
15862306a36Sopenharmony_ci	if (wbc->wb)
15962306a36Sopenharmony_ci		return __trace_wb_assign_cgroup(wbc->wb);
16062306a36Sopenharmony_ci	else
16162306a36Sopenharmony_ci		return 1;
16262306a36Sopenharmony_ci}
16362306a36Sopenharmony_ci#else	/* CONFIG_CGROUP_WRITEBACK */
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cistatic inline ino_t __trace_wb_assign_cgroup(struct bdi_writeback *wb)
16662306a36Sopenharmony_ci{
16762306a36Sopenharmony_ci	return 1;
16862306a36Sopenharmony_ci}
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_cistatic inline ino_t __trace_wbc_assign_cgroup(struct writeback_control *wbc)
17162306a36Sopenharmony_ci{
17262306a36Sopenharmony_ci	return 1;
17362306a36Sopenharmony_ci}
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci#endif	/* CONFIG_CGROUP_WRITEBACK */
17662306a36Sopenharmony_ci#endif	/* CREATE_TRACE_POINTS */
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci#ifdef CONFIG_CGROUP_WRITEBACK
17962306a36Sopenharmony_ciTRACE_EVENT(inode_foreign_history,
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	TP_PROTO(struct inode *inode, struct writeback_control *wbc,
18262306a36Sopenharmony_ci		 unsigned int history),
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci	TP_ARGS(inode, wbc, history),
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci	TP_STRUCT__entry(
18762306a36Sopenharmony_ci		__array(char,		name, 32)
18862306a36Sopenharmony_ci		__field(ino_t,		ino)
18962306a36Sopenharmony_ci		__field(ino_t,		cgroup_ino)
19062306a36Sopenharmony_ci		__field(unsigned int,	history)
19162306a36Sopenharmony_ci	),
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci	TP_fast_assign(
19462306a36Sopenharmony_ci		strscpy_pad(__entry->name, bdi_dev_name(inode_to_bdi(inode)), 32);
19562306a36Sopenharmony_ci		__entry->ino		= inode->i_ino;
19662306a36Sopenharmony_ci		__entry->cgroup_ino	= __trace_wbc_assign_cgroup(wbc);
19762306a36Sopenharmony_ci		__entry->history	= history;
19862306a36Sopenharmony_ci	),
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	TP_printk("bdi %s: ino=%lu cgroup_ino=%lu history=0x%x",
20162306a36Sopenharmony_ci		__entry->name,
20262306a36Sopenharmony_ci		(unsigned long)__entry->ino,
20362306a36Sopenharmony_ci		(unsigned long)__entry->cgroup_ino,
20462306a36Sopenharmony_ci		__entry->history
20562306a36Sopenharmony_ci	)
20662306a36Sopenharmony_ci);
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ciTRACE_EVENT(inode_switch_wbs,
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	TP_PROTO(struct inode *inode, struct bdi_writeback *old_wb,
21162306a36Sopenharmony_ci		 struct bdi_writeback *new_wb),
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	TP_ARGS(inode, old_wb, new_wb),
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	TP_STRUCT__entry(
21662306a36Sopenharmony_ci		__array(char,		name, 32)
21762306a36Sopenharmony_ci		__field(ino_t,		ino)
21862306a36Sopenharmony_ci		__field(ino_t,		old_cgroup_ino)
21962306a36Sopenharmony_ci		__field(ino_t,		new_cgroup_ino)
22062306a36Sopenharmony_ci	),
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci	TP_fast_assign(
22362306a36Sopenharmony_ci		strscpy_pad(__entry->name, bdi_dev_name(old_wb->bdi), 32);
22462306a36Sopenharmony_ci		__entry->ino		= inode->i_ino;
22562306a36Sopenharmony_ci		__entry->old_cgroup_ino	= __trace_wb_assign_cgroup(old_wb);
22662306a36Sopenharmony_ci		__entry->new_cgroup_ino	= __trace_wb_assign_cgroup(new_wb);
22762306a36Sopenharmony_ci	),
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci	TP_printk("bdi %s: ino=%lu old_cgroup_ino=%lu new_cgroup_ino=%lu",
23062306a36Sopenharmony_ci		__entry->name,
23162306a36Sopenharmony_ci		(unsigned long)__entry->ino,
23262306a36Sopenharmony_ci		(unsigned long)__entry->old_cgroup_ino,
23362306a36Sopenharmony_ci		(unsigned long)__entry->new_cgroup_ino
23462306a36Sopenharmony_ci	)
23562306a36Sopenharmony_ci);
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ciTRACE_EVENT(track_foreign_dirty,
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci	TP_PROTO(struct folio *folio, struct bdi_writeback *wb),
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci	TP_ARGS(folio, wb),
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci	TP_STRUCT__entry(
24462306a36Sopenharmony_ci		__array(char,		name, 32)
24562306a36Sopenharmony_ci		__field(u64,		bdi_id)
24662306a36Sopenharmony_ci		__field(ino_t,		ino)
24762306a36Sopenharmony_ci		__field(unsigned int,	memcg_id)
24862306a36Sopenharmony_ci		__field(ino_t,		cgroup_ino)
24962306a36Sopenharmony_ci		__field(ino_t,		page_cgroup_ino)
25062306a36Sopenharmony_ci	),
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci	TP_fast_assign(
25362306a36Sopenharmony_ci		struct address_space *mapping = folio_mapping(folio);
25462306a36Sopenharmony_ci		struct inode *inode = mapping ? mapping->host : NULL;
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci		strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32);
25762306a36Sopenharmony_ci		__entry->bdi_id		= wb->bdi->id;
25862306a36Sopenharmony_ci		__entry->ino		= inode ? inode->i_ino : 0;
25962306a36Sopenharmony_ci		__entry->memcg_id	= wb->memcg_css->id;
26062306a36Sopenharmony_ci		__entry->cgroup_ino	= __trace_wb_assign_cgroup(wb);
26162306a36Sopenharmony_ci		__entry->page_cgroup_ino = cgroup_ino(folio_memcg(folio)->css.cgroup);
26262306a36Sopenharmony_ci	),
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	TP_printk("bdi %s[%llu]: ino=%lu memcg_id=%u cgroup_ino=%lu page_cgroup_ino=%lu",
26562306a36Sopenharmony_ci		__entry->name,
26662306a36Sopenharmony_ci		__entry->bdi_id,
26762306a36Sopenharmony_ci		(unsigned long)__entry->ino,
26862306a36Sopenharmony_ci		__entry->memcg_id,
26962306a36Sopenharmony_ci		(unsigned long)__entry->cgroup_ino,
27062306a36Sopenharmony_ci		(unsigned long)__entry->page_cgroup_ino
27162306a36Sopenharmony_ci	)
27262306a36Sopenharmony_ci);
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ciTRACE_EVENT(flush_foreign,
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci	TP_PROTO(struct bdi_writeback *wb, unsigned int frn_bdi_id,
27762306a36Sopenharmony_ci		 unsigned int frn_memcg_id),
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	TP_ARGS(wb, frn_bdi_id, frn_memcg_id),
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci	TP_STRUCT__entry(
28262306a36Sopenharmony_ci		__array(char,		name, 32)
28362306a36Sopenharmony_ci		__field(ino_t,		cgroup_ino)
28462306a36Sopenharmony_ci		__field(unsigned int,	frn_bdi_id)
28562306a36Sopenharmony_ci		__field(unsigned int,	frn_memcg_id)
28662306a36Sopenharmony_ci	),
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	TP_fast_assign(
28962306a36Sopenharmony_ci		strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32);
29062306a36Sopenharmony_ci		__entry->cgroup_ino	= __trace_wb_assign_cgroup(wb);
29162306a36Sopenharmony_ci		__entry->frn_bdi_id	= frn_bdi_id;
29262306a36Sopenharmony_ci		__entry->frn_memcg_id	= frn_memcg_id;
29362306a36Sopenharmony_ci	),
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	TP_printk("bdi %s: cgroup_ino=%lu frn_bdi_id=%u frn_memcg_id=%u",
29662306a36Sopenharmony_ci		__entry->name,
29762306a36Sopenharmony_ci		(unsigned long)__entry->cgroup_ino,
29862306a36Sopenharmony_ci		__entry->frn_bdi_id,
29962306a36Sopenharmony_ci		__entry->frn_memcg_id
30062306a36Sopenharmony_ci	)
30162306a36Sopenharmony_ci);
30262306a36Sopenharmony_ci#endif
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ciDECLARE_EVENT_CLASS(writeback_write_inode_template,
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	TP_PROTO(struct inode *inode, struct writeback_control *wbc),
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	TP_ARGS(inode, wbc),
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci	TP_STRUCT__entry (
31162306a36Sopenharmony_ci		__array(char, name, 32)
31262306a36Sopenharmony_ci		__field(ino_t, ino)
31362306a36Sopenharmony_ci		__field(int, sync_mode)
31462306a36Sopenharmony_ci		__field(ino_t, cgroup_ino)
31562306a36Sopenharmony_ci	),
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci	TP_fast_assign(
31862306a36Sopenharmony_ci		strscpy_pad(__entry->name,
31962306a36Sopenharmony_ci			    bdi_dev_name(inode_to_bdi(inode)), 32);
32062306a36Sopenharmony_ci		__entry->ino		= inode->i_ino;
32162306a36Sopenharmony_ci		__entry->sync_mode	= wbc->sync_mode;
32262306a36Sopenharmony_ci		__entry->cgroup_ino	= __trace_wbc_assign_cgroup(wbc);
32362306a36Sopenharmony_ci	),
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci	TP_printk("bdi %s: ino=%lu sync_mode=%d cgroup_ino=%lu",
32662306a36Sopenharmony_ci		__entry->name,
32762306a36Sopenharmony_ci		(unsigned long)__entry->ino,
32862306a36Sopenharmony_ci		__entry->sync_mode,
32962306a36Sopenharmony_ci		(unsigned long)__entry->cgroup_ino
33062306a36Sopenharmony_ci	)
33162306a36Sopenharmony_ci);
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ciDEFINE_EVENT(writeback_write_inode_template, writeback_write_inode_start,
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	TP_PROTO(struct inode *inode, struct writeback_control *wbc),
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci	TP_ARGS(inode, wbc)
33862306a36Sopenharmony_ci);
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ciDEFINE_EVENT(writeback_write_inode_template, writeback_write_inode,
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	TP_PROTO(struct inode *inode, struct writeback_control *wbc),
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	TP_ARGS(inode, wbc)
34562306a36Sopenharmony_ci);
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ciDECLARE_EVENT_CLASS(writeback_work_class,
34862306a36Sopenharmony_ci	TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work),
34962306a36Sopenharmony_ci	TP_ARGS(wb, work),
35062306a36Sopenharmony_ci	TP_STRUCT__entry(
35162306a36Sopenharmony_ci		__array(char, name, 32)
35262306a36Sopenharmony_ci		__field(long, nr_pages)
35362306a36Sopenharmony_ci		__field(dev_t, sb_dev)
35462306a36Sopenharmony_ci		__field(int, sync_mode)
35562306a36Sopenharmony_ci		__field(int, for_kupdate)
35662306a36Sopenharmony_ci		__field(int, range_cyclic)
35762306a36Sopenharmony_ci		__field(int, for_background)
35862306a36Sopenharmony_ci		__field(int, reason)
35962306a36Sopenharmony_ci		__field(ino_t, cgroup_ino)
36062306a36Sopenharmony_ci	),
36162306a36Sopenharmony_ci	TP_fast_assign(
36262306a36Sopenharmony_ci		strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32);
36362306a36Sopenharmony_ci		__entry->nr_pages = work->nr_pages;
36462306a36Sopenharmony_ci		__entry->sb_dev = work->sb ? work->sb->s_dev : 0;
36562306a36Sopenharmony_ci		__entry->sync_mode = work->sync_mode;
36662306a36Sopenharmony_ci		__entry->for_kupdate = work->for_kupdate;
36762306a36Sopenharmony_ci		__entry->range_cyclic = work->range_cyclic;
36862306a36Sopenharmony_ci		__entry->for_background	= work->for_background;
36962306a36Sopenharmony_ci		__entry->reason = work->reason;
37062306a36Sopenharmony_ci		__entry->cgroup_ino = __trace_wb_assign_cgroup(wb);
37162306a36Sopenharmony_ci	),
37262306a36Sopenharmony_ci	TP_printk("bdi %s: sb_dev %d:%d nr_pages=%ld sync_mode=%d "
37362306a36Sopenharmony_ci		  "kupdate=%d range_cyclic=%d background=%d reason=%s cgroup_ino=%lu",
37462306a36Sopenharmony_ci		  __entry->name,
37562306a36Sopenharmony_ci		  MAJOR(__entry->sb_dev), MINOR(__entry->sb_dev),
37662306a36Sopenharmony_ci		  __entry->nr_pages,
37762306a36Sopenharmony_ci		  __entry->sync_mode,
37862306a36Sopenharmony_ci		  __entry->for_kupdate,
37962306a36Sopenharmony_ci		  __entry->range_cyclic,
38062306a36Sopenharmony_ci		  __entry->for_background,
38162306a36Sopenharmony_ci		  __print_symbolic(__entry->reason, WB_WORK_REASON),
38262306a36Sopenharmony_ci		  (unsigned long)__entry->cgroup_ino
38362306a36Sopenharmony_ci	)
38462306a36Sopenharmony_ci);
38562306a36Sopenharmony_ci#define DEFINE_WRITEBACK_WORK_EVENT(name) \
38662306a36Sopenharmony_ciDEFINE_EVENT(writeback_work_class, name, \
38762306a36Sopenharmony_ci	TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), \
38862306a36Sopenharmony_ci	TP_ARGS(wb, work))
38962306a36Sopenharmony_ciDEFINE_WRITEBACK_WORK_EVENT(writeback_queue);
39062306a36Sopenharmony_ciDEFINE_WRITEBACK_WORK_EVENT(writeback_exec);
39162306a36Sopenharmony_ciDEFINE_WRITEBACK_WORK_EVENT(writeback_start);
39262306a36Sopenharmony_ciDEFINE_WRITEBACK_WORK_EVENT(writeback_written);
39362306a36Sopenharmony_ciDEFINE_WRITEBACK_WORK_EVENT(writeback_wait);
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_ciTRACE_EVENT(writeback_pages_written,
39662306a36Sopenharmony_ci	TP_PROTO(long pages_written),
39762306a36Sopenharmony_ci	TP_ARGS(pages_written),
39862306a36Sopenharmony_ci	TP_STRUCT__entry(
39962306a36Sopenharmony_ci		__field(long,		pages)
40062306a36Sopenharmony_ci	),
40162306a36Sopenharmony_ci	TP_fast_assign(
40262306a36Sopenharmony_ci		__entry->pages		= pages_written;
40362306a36Sopenharmony_ci	),
40462306a36Sopenharmony_ci	TP_printk("%ld", __entry->pages)
40562306a36Sopenharmony_ci);
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ciDECLARE_EVENT_CLASS(writeback_class,
40862306a36Sopenharmony_ci	TP_PROTO(struct bdi_writeback *wb),
40962306a36Sopenharmony_ci	TP_ARGS(wb),
41062306a36Sopenharmony_ci	TP_STRUCT__entry(
41162306a36Sopenharmony_ci		__array(char, name, 32)
41262306a36Sopenharmony_ci		__field(ino_t, cgroup_ino)
41362306a36Sopenharmony_ci	),
41462306a36Sopenharmony_ci	TP_fast_assign(
41562306a36Sopenharmony_ci		strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32);
41662306a36Sopenharmony_ci		__entry->cgroup_ino = __trace_wb_assign_cgroup(wb);
41762306a36Sopenharmony_ci	),
41862306a36Sopenharmony_ci	TP_printk("bdi %s: cgroup_ino=%lu",
41962306a36Sopenharmony_ci		  __entry->name,
42062306a36Sopenharmony_ci		  (unsigned long)__entry->cgroup_ino
42162306a36Sopenharmony_ci	)
42262306a36Sopenharmony_ci);
42362306a36Sopenharmony_ci#define DEFINE_WRITEBACK_EVENT(name) \
42462306a36Sopenharmony_ciDEFINE_EVENT(writeback_class, name, \
42562306a36Sopenharmony_ci	TP_PROTO(struct bdi_writeback *wb), \
42662306a36Sopenharmony_ci	TP_ARGS(wb))
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ciDEFINE_WRITEBACK_EVENT(writeback_wake_background);
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ciTRACE_EVENT(writeback_bdi_register,
43162306a36Sopenharmony_ci	TP_PROTO(struct backing_dev_info *bdi),
43262306a36Sopenharmony_ci	TP_ARGS(bdi),
43362306a36Sopenharmony_ci	TP_STRUCT__entry(
43462306a36Sopenharmony_ci		__array(char, name, 32)
43562306a36Sopenharmony_ci	),
43662306a36Sopenharmony_ci	TP_fast_assign(
43762306a36Sopenharmony_ci		strscpy_pad(__entry->name, bdi_dev_name(bdi), 32);
43862306a36Sopenharmony_ci	),
43962306a36Sopenharmony_ci	TP_printk("bdi %s",
44062306a36Sopenharmony_ci		__entry->name
44162306a36Sopenharmony_ci	)
44262306a36Sopenharmony_ci);
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_ciDECLARE_EVENT_CLASS(wbc_class,
44562306a36Sopenharmony_ci	TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi),
44662306a36Sopenharmony_ci	TP_ARGS(wbc, bdi),
44762306a36Sopenharmony_ci	TP_STRUCT__entry(
44862306a36Sopenharmony_ci		__array(char, name, 32)
44962306a36Sopenharmony_ci		__field(long, nr_to_write)
45062306a36Sopenharmony_ci		__field(long, pages_skipped)
45162306a36Sopenharmony_ci		__field(int, sync_mode)
45262306a36Sopenharmony_ci		__field(int, for_kupdate)
45362306a36Sopenharmony_ci		__field(int, for_background)
45462306a36Sopenharmony_ci		__field(int, for_reclaim)
45562306a36Sopenharmony_ci		__field(int, range_cyclic)
45662306a36Sopenharmony_ci		__field(long, range_start)
45762306a36Sopenharmony_ci		__field(long, range_end)
45862306a36Sopenharmony_ci		__field(ino_t, cgroup_ino)
45962306a36Sopenharmony_ci	),
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_ci	TP_fast_assign(
46262306a36Sopenharmony_ci		strscpy_pad(__entry->name, bdi_dev_name(bdi), 32);
46362306a36Sopenharmony_ci		__entry->nr_to_write	= wbc->nr_to_write;
46462306a36Sopenharmony_ci		__entry->pages_skipped	= wbc->pages_skipped;
46562306a36Sopenharmony_ci		__entry->sync_mode	= wbc->sync_mode;
46662306a36Sopenharmony_ci		__entry->for_kupdate	= wbc->for_kupdate;
46762306a36Sopenharmony_ci		__entry->for_background	= wbc->for_background;
46862306a36Sopenharmony_ci		__entry->for_reclaim	= wbc->for_reclaim;
46962306a36Sopenharmony_ci		__entry->range_cyclic	= wbc->range_cyclic;
47062306a36Sopenharmony_ci		__entry->range_start	= (long)wbc->range_start;
47162306a36Sopenharmony_ci		__entry->range_end	= (long)wbc->range_end;
47262306a36Sopenharmony_ci		__entry->cgroup_ino	= __trace_wbc_assign_cgroup(wbc);
47362306a36Sopenharmony_ci	),
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ci	TP_printk("bdi %s: towrt=%ld skip=%ld mode=%d kupd=%d "
47662306a36Sopenharmony_ci		"bgrd=%d reclm=%d cyclic=%d "
47762306a36Sopenharmony_ci		"start=0x%lx end=0x%lx cgroup_ino=%lu",
47862306a36Sopenharmony_ci		__entry->name,
47962306a36Sopenharmony_ci		__entry->nr_to_write,
48062306a36Sopenharmony_ci		__entry->pages_skipped,
48162306a36Sopenharmony_ci		__entry->sync_mode,
48262306a36Sopenharmony_ci		__entry->for_kupdate,
48362306a36Sopenharmony_ci		__entry->for_background,
48462306a36Sopenharmony_ci		__entry->for_reclaim,
48562306a36Sopenharmony_ci		__entry->range_cyclic,
48662306a36Sopenharmony_ci		__entry->range_start,
48762306a36Sopenharmony_ci		__entry->range_end,
48862306a36Sopenharmony_ci		(unsigned long)__entry->cgroup_ino
48962306a36Sopenharmony_ci	)
49062306a36Sopenharmony_ci)
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci#define DEFINE_WBC_EVENT(name) \
49362306a36Sopenharmony_ciDEFINE_EVENT(wbc_class, name, \
49462306a36Sopenharmony_ci	TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), \
49562306a36Sopenharmony_ci	TP_ARGS(wbc, bdi))
49662306a36Sopenharmony_ciDEFINE_WBC_EVENT(wbc_writepage);
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ciTRACE_EVENT(writeback_queue_io,
49962306a36Sopenharmony_ci	TP_PROTO(struct bdi_writeback *wb,
50062306a36Sopenharmony_ci		 struct wb_writeback_work *work,
50162306a36Sopenharmony_ci		 unsigned long dirtied_before,
50262306a36Sopenharmony_ci		 int moved),
50362306a36Sopenharmony_ci	TP_ARGS(wb, work, dirtied_before, moved),
50462306a36Sopenharmony_ci	TP_STRUCT__entry(
50562306a36Sopenharmony_ci		__array(char,		name, 32)
50662306a36Sopenharmony_ci		__field(unsigned long,	older)
50762306a36Sopenharmony_ci		__field(long,		age)
50862306a36Sopenharmony_ci		__field(int,		moved)
50962306a36Sopenharmony_ci		__field(int,		reason)
51062306a36Sopenharmony_ci		__field(ino_t,		cgroup_ino)
51162306a36Sopenharmony_ci	),
51262306a36Sopenharmony_ci	TP_fast_assign(
51362306a36Sopenharmony_ci		strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32);
51462306a36Sopenharmony_ci		__entry->older	= dirtied_before;
51562306a36Sopenharmony_ci		__entry->age	= (jiffies - dirtied_before) * 1000 / HZ;
51662306a36Sopenharmony_ci		__entry->moved	= moved;
51762306a36Sopenharmony_ci		__entry->reason	= work->reason;
51862306a36Sopenharmony_ci		__entry->cgroup_ino	= __trace_wb_assign_cgroup(wb);
51962306a36Sopenharmony_ci	),
52062306a36Sopenharmony_ci	TP_printk("bdi %s: older=%lu age=%ld enqueue=%d reason=%s cgroup_ino=%lu",
52162306a36Sopenharmony_ci		__entry->name,
52262306a36Sopenharmony_ci		__entry->older,	/* dirtied_before in jiffies */
52362306a36Sopenharmony_ci		__entry->age,	/* dirtied_before in relative milliseconds */
52462306a36Sopenharmony_ci		__entry->moved,
52562306a36Sopenharmony_ci		__print_symbolic(__entry->reason, WB_WORK_REASON),
52662306a36Sopenharmony_ci		(unsigned long)__entry->cgroup_ino
52762306a36Sopenharmony_ci	)
52862306a36Sopenharmony_ci);
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_ciTRACE_EVENT(global_dirty_state,
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ci	TP_PROTO(unsigned long background_thresh,
53362306a36Sopenharmony_ci		 unsigned long dirty_thresh
53462306a36Sopenharmony_ci	),
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_ci	TP_ARGS(background_thresh,
53762306a36Sopenharmony_ci		dirty_thresh
53862306a36Sopenharmony_ci	),
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_ci	TP_STRUCT__entry(
54162306a36Sopenharmony_ci		__field(unsigned long,	nr_dirty)
54262306a36Sopenharmony_ci		__field(unsigned long,	nr_writeback)
54362306a36Sopenharmony_ci		__field(unsigned long,	background_thresh)
54462306a36Sopenharmony_ci		__field(unsigned long,	dirty_thresh)
54562306a36Sopenharmony_ci		__field(unsigned long,	dirty_limit)
54662306a36Sopenharmony_ci		__field(unsigned long,	nr_dirtied)
54762306a36Sopenharmony_ci		__field(unsigned long,	nr_written)
54862306a36Sopenharmony_ci	),
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_ci	TP_fast_assign(
55162306a36Sopenharmony_ci		__entry->nr_dirty	= global_node_page_state(NR_FILE_DIRTY);
55262306a36Sopenharmony_ci		__entry->nr_writeback	= global_node_page_state(NR_WRITEBACK);
55362306a36Sopenharmony_ci		__entry->nr_dirtied	= global_node_page_state(NR_DIRTIED);
55462306a36Sopenharmony_ci		__entry->nr_written	= global_node_page_state(NR_WRITTEN);
55562306a36Sopenharmony_ci		__entry->background_thresh = background_thresh;
55662306a36Sopenharmony_ci		__entry->dirty_thresh	= dirty_thresh;
55762306a36Sopenharmony_ci		__entry->dirty_limit	= global_wb_domain.dirty_limit;
55862306a36Sopenharmony_ci	),
55962306a36Sopenharmony_ci
56062306a36Sopenharmony_ci	TP_printk("dirty=%lu writeback=%lu "
56162306a36Sopenharmony_ci		  "bg_thresh=%lu thresh=%lu limit=%lu "
56262306a36Sopenharmony_ci		  "dirtied=%lu written=%lu",
56362306a36Sopenharmony_ci		  __entry->nr_dirty,
56462306a36Sopenharmony_ci		  __entry->nr_writeback,
56562306a36Sopenharmony_ci		  __entry->background_thresh,
56662306a36Sopenharmony_ci		  __entry->dirty_thresh,
56762306a36Sopenharmony_ci		  __entry->dirty_limit,
56862306a36Sopenharmony_ci		  __entry->nr_dirtied,
56962306a36Sopenharmony_ci		  __entry->nr_written
57062306a36Sopenharmony_ci	)
57162306a36Sopenharmony_ci);
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci#define KBps(x)			((x) << (PAGE_SHIFT - 10))
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ciTRACE_EVENT(bdi_dirty_ratelimit,
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci	TP_PROTO(struct bdi_writeback *wb,
57862306a36Sopenharmony_ci		 unsigned long dirty_rate,
57962306a36Sopenharmony_ci		 unsigned long task_ratelimit),
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_ci	TP_ARGS(wb, dirty_rate, task_ratelimit),
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci	TP_STRUCT__entry(
58462306a36Sopenharmony_ci		__array(char,		bdi, 32)
58562306a36Sopenharmony_ci		__field(unsigned long,	write_bw)
58662306a36Sopenharmony_ci		__field(unsigned long,	avg_write_bw)
58762306a36Sopenharmony_ci		__field(unsigned long,	dirty_rate)
58862306a36Sopenharmony_ci		__field(unsigned long,	dirty_ratelimit)
58962306a36Sopenharmony_ci		__field(unsigned long,	task_ratelimit)
59062306a36Sopenharmony_ci		__field(unsigned long,	balanced_dirty_ratelimit)
59162306a36Sopenharmony_ci		__field(ino_t,		cgroup_ino)
59262306a36Sopenharmony_ci	),
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci	TP_fast_assign(
59562306a36Sopenharmony_ci		strscpy_pad(__entry->bdi, bdi_dev_name(wb->bdi), 32);
59662306a36Sopenharmony_ci		__entry->write_bw	= KBps(wb->write_bandwidth);
59762306a36Sopenharmony_ci		__entry->avg_write_bw	= KBps(wb->avg_write_bandwidth);
59862306a36Sopenharmony_ci		__entry->dirty_rate	= KBps(dirty_rate);
59962306a36Sopenharmony_ci		__entry->dirty_ratelimit = KBps(wb->dirty_ratelimit);
60062306a36Sopenharmony_ci		__entry->task_ratelimit	= KBps(task_ratelimit);
60162306a36Sopenharmony_ci		__entry->balanced_dirty_ratelimit =
60262306a36Sopenharmony_ci					KBps(wb->balanced_dirty_ratelimit);
60362306a36Sopenharmony_ci		__entry->cgroup_ino	= __trace_wb_assign_cgroup(wb);
60462306a36Sopenharmony_ci	),
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ci	TP_printk("bdi %s: "
60762306a36Sopenharmony_ci		  "write_bw=%lu awrite_bw=%lu dirty_rate=%lu "
60862306a36Sopenharmony_ci		  "dirty_ratelimit=%lu task_ratelimit=%lu "
60962306a36Sopenharmony_ci		  "balanced_dirty_ratelimit=%lu cgroup_ino=%lu",
61062306a36Sopenharmony_ci		  __entry->bdi,
61162306a36Sopenharmony_ci		  __entry->write_bw,		/* write bandwidth */
61262306a36Sopenharmony_ci		  __entry->avg_write_bw,	/* avg write bandwidth */
61362306a36Sopenharmony_ci		  __entry->dirty_rate,		/* bdi dirty rate */
61462306a36Sopenharmony_ci		  __entry->dirty_ratelimit,	/* base ratelimit */
61562306a36Sopenharmony_ci		  __entry->task_ratelimit, /* ratelimit with position control */
61662306a36Sopenharmony_ci		  __entry->balanced_dirty_ratelimit, /* the balanced ratelimit */
61762306a36Sopenharmony_ci		  (unsigned long)__entry->cgroup_ino
61862306a36Sopenharmony_ci	)
61962306a36Sopenharmony_ci);
62062306a36Sopenharmony_ci
62162306a36Sopenharmony_ciTRACE_EVENT(balance_dirty_pages,
62262306a36Sopenharmony_ci
62362306a36Sopenharmony_ci	TP_PROTO(struct bdi_writeback *wb,
62462306a36Sopenharmony_ci		 unsigned long thresh,
62562306a36Sopenharmony_ci		 unsigned long bg_thresh,
62662306a36Sopenharmony_ci		 unsigned long dirty,
62762306a36Sopenharmony_ci		 unsigned long bdi_thresh,
62862306a36Sopenharmony_ci		 unsigned long bdi_dirty,
62962306a36Sopenharmony_ci		 unsigned long dirty_ratelimit,
63062306a36Sopenharmony_ci		 unsigned long task_ratelimit,
63162306a36Sopenharmony_ci		 unsigned long dirtied,
63262306a36Sopenharmony_ci		 unsigned long period,
63362306a36Sopenharmony_ci		 long pause,
63462306a36Sopenharmony_ci		 unsigned long start_time),
63562306a36Sopenharmony_ci
63662306a36Sopenharmony_ci	TP_ARGS(wb, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty,
63762306a36Sopenharmony_ci		dirty_ratelimit, task_ratelimit,
63862306a36Sopenharmony_ci		dirtied, period, pause, start_time),
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_ci	TP_STRUCT__entry(
64162306a36Sopenharmony_ci		__array(	 char,	bdi, 32)
64262306a36Sopenharmony_ci		__field(unsigned long,	limit)
64362306a36Sopenharmony_ci		__field(unsigned long,	setpoint)
64462306a36Sopenharmony_ci		__field(unsigned long,	dirty)
64562306a36Sopenharmony_ci		__field(unsigned long,	bdi_setpoint)
64662306a36Sopenharmony_ci		__field(unsigned long,	bdi_dirty)
64762306a36Sopenharmony_ci		__field(unsigned long,	dirty_ratelimit)
64862306a36Sopenharmony_ci		__field(unsigned long,	task_ratelimit)
64962306a36Sopenharmony_ci		__field(unsigned int,	dirtied)
65062306a36Sopenharmony_ci		__field(unsigned int,	dirtied_pause)
65162306a36Sopenharmony_ci		__field(unsigned long,	paused)
65262306a36Sopenharmony_ci		__field(	 long,	pause)
65362306a36Sopenharmony_ci		__field(unsigned long,	period)
65462306a36Sopenharmony_ci		__field(	 long,	think)
65562306a36Sopenharmony_ci		__field(ino_t,		cgroup_ino)
65662306a36Sopenharmony_ci	),
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci	TP_fast_assign(
65962306a36Sopenharmony_ci		unsigned long freerun = (thresh + bg_thresh) / 2;
66062306a36Sopenharmony_ci		strscpy_pad(__entry->bdi, bdi_dev_name(wb->bdi), 32);
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_ci		__entry->limit		= global_wb_domain.dirty_limit;
66362306a36Sopenharmony_ci		__entry->setpoint	= (global_wb_domain.dirty_limit +
66462306a36Sopenharmony_ci						freerun) / 2;
66562306a36Sopenharmony_ci		__entry->dirty		= dirty;
66662306a36Sopenharmony_ci		__entry->bdi_setpoint	= __entry->setpoint *
66762306a36Sopenharmony_ci						bdi_thresh / (thresh + 1);
66862306a36Sopenharmony_ci		__entry->bdi_dirty	= bdi_dirty;
66962306a36Sopenharmony_ci		__entry->dirty_ratelimit = KBps(dirty_ratelimit);
67062306a36Sopenharmony_ci		__entry->task_ratelimit	= KBps(task_ratelimit);
67162306a36Sopenharmony_ci		__entry->dirtied	= dirtied;
67262306a36Sopenharmony_ci		__entry->dirtied_pause	= current->nr_dirtied_pause;
67362306a36Sopenharmony_ci		__entry->think		= current->dirty_paused_when == 0 ? 0 :
67462306a36Sopenharmony_ci			 (long)(jiffies - current->dirty_paused_when) * 1000/HZ;
67562306a36Sopenharmony_ci		__entry->period		= period * 1000 / HZ;
67662306a36Sopenharmony_ci		__entry->pause		= pause * 1000 / HZ;
67762306a36Sopenharmony_ci		__entry->paused		= (jiffies - start_time) * 1000 / HZ;
67862306a36Sopenharmony_ci		__entry->cgroup_ino	= __trace_wb_assign_cgroup(wb);
67962306a36Sopenharmony_ci	),
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_ci	TP_printk("bdi %s: "
68362306a36Sopenharmony_ci		  "limit=%lu setpoint=%lu dirty=%lu "
68462306a36Sopenharmony_ci		  "bdi_setpoint=%lu bdi_dirty=%lu "
68562306a36Sopenharmony_ci		  "dirty_ratelimit=%lu task_ratelimit=%lu "
68662306a36Sopenharmony_ci		  "dirtied=%u dirtied_pause=%u "
68762306a36Sopenharmony_ci		  "paused=%lu pause=%ld period=%lu think=%ld cgroup_ino=%lu",
68862306a36Sopenharmony_ci		  __entry->bdi,
68962306a36Sopenharmony_ci		  __entry->limit,
69062306a36Sopenharmony_ci		  __entry->setpoint,
69162306a36Sopenharmony_ci		  __entry->dirty,
69262306a36Sopenharmony_ci		  __entry->bdi_setpoint,
69362306a36Sopenharmony_ci		  __entry->bdi_dirty,
69462306a36Sopenharmony_ci		  __entry->dirty_ratelimit,
69562306a36Sopenharmony_ci		  __entry->task_ratelimit,
69662306a36Sopenharmony_ci		  __entry->dirtied,
69762306a36Sopenharmony_ci		  __entry->dirtied_pause,
69862306a36Sopenharmony_ci		  __entry->paused,	/* ms */
69962306a36Sopenharmony_ci		  __entry->pause,	/* ms */
70062306a36Sopenharmony_ci		  __entry->period,	/* ms */
70162306a36Sopenharmony_ci		  __entry->think,	/* ms */
70262306a36Sopenharmony_ci		  (unsigned long)__entry->cgroup_ino
70362306a36Sopenharmony_ci	  )
70462306a36Sopenharmony_ci);
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ciTRACE_EVENT(writeback_sb_inodes_requeue,
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_ci	TP_PROTO(struct inode *inode),
70962306a36Sopenharmony_ci	TP_ARGS(inode),
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_ci	TP_STRUCT__entry(
71262306a36Sopenharmony_ci		__array(char, name, 32)
71362306a36Sopenharmony_ci		__field(ino_t, ino)
71462306a36Sopenharmony_ci		__field(unsigned long, state)
71562306a36Sopenharmony_ci		__field(unsigned long, dirtied_when)
71662306a36Sopenharmony_ci		__field(ino_t, cgroup_ino)
71762306a36Sopenharmony_ci	),
71862306a36Sopenharmony_ci
71962306a36Sopenharmony_ci	TP_fast_assign(
72062306a36Sopenharmony_ci		strscpy_pad(__entry->name,
72162306a36Sopenharmony_ci			    bdi_dev_name(inode_to_bdi(inode)), 32);
72262306a36Sopenharmony_ci		__entry->ino		= inode->i_ino;
72362306a36Sopenharmony_ci		__entry->state		= inode->i_state;
72462306a36Sopenharmony_ci		__entry->dirtied_when	= inode->dirtied_when;
72562306a36Sopenharmony_ci		__entry->cgroup_ino	= __trace_wb_assign_cgroup(inode_to_wb(inode));
72662306a36Sopenharmony_ci	),
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ci	TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu cgroup_ino=%lu",
72962306a36Sopenharmony_ci		  __entry->name,
73062306a36Sopenharmony_ci		  (unsigned long)__entry->ino,
73162306a36Sopenharmony_ci		  show_inode_state(__entry->state),
73262306a36Sopenharmony_ci		  __entry->dirtied_when,
73362306a36Sopenharmony_ci		  (jiffies - __entry->dirtied_when) / HZ,
73462306a36Sopenharmony_ci		  (unsigned long)__entry->cgroup_ino
73562306a36Sopenharmony_ci	)
73662306a36Sopenharmony_ci);
73762306a36Sopenharmony_ci
73862306a36Sopenharmony_ciDECLARE_EVENT_CLASS(writeback_single_inode_template,
73962306a36Sopenharmony_ci
74062306a36Sopenharmony_ci	TP_PROTO(struct inode *inode,
74162306a36Sopenharmony_ci		 struct writeback_control *wbc,
74262306a36Sopenharmony_ci		 unsigned long nr_to_write
74362306a36Sopenharmony_ci	),
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_ci	TP_ARGS(inode, wbc, nr_to_write),
74662306a36Sopenharmony_ci
74762306a36Sopenharmony_ci	TP_STRUCT__entry(
74862306a36Sopenharmony_ci		__array(char, name, 32)
74962306a36Sopenharmony_ci		__field(ino_t, ino)
75062306a36Sopenharmony_ci		__field(unsigned long, state)
75162306a36Sopenharmony_ci		__field(unsigned long, dirtied_when)
75262306a36Sopenharmony_ci		__field(unsigned long, writeback_index)
75362306a36Sopenharmony_ci		__field(long, nr_to_write)
75462306a36Sopenharmony_ci		__field(unsigned long, wrote)
75562306a36Sopenharmony_ci		__field(ino_t, cgroup_ino)
75662306a36Sopenharmony_ci	),
75762306a36Sopenharmony_ci
75862306a36Sopenharmony_ci	TP_fast_assign(
75962306a36Sopenharmony_ci		strscpy_pad(__entry->name,
76062306a36Sopenharmony_ci			    bdi_dev_name(inode_to_bdi(inode)), 32);
76162306a36Sopenharmony_ci		__entry->ino		= inode->i_ino;
76262306a36Sopenharmony_ci		__entry->state		= inode->i_state;
76362306a36Sopenharmony_ci		__entry->dirtied_when	= inode->dirtied_when;
76462306a36Sopenharmony_ci		__entry->writeback_index = inode->i_mapping->writeback_index;
76562306a36Sopenharmony_ci		__entry->nr_to_write	= nr_to_write;
76662306a36Sopenharmony_ci		__entry->wrote		= nr_to_write - wbc->nr_to_write;
76762306a36Sopenharmony_ci		__entry->cgroup_ino	= __trace_wbc_assign_cgroup(wbc);
76862306a36Sopenharmony_ci	),
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_ci	TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu "
77162306a36Sopenharmony_ci		  "index=%lu to_write=%ld wrote=%lu cgroup_ino=%lu",
77262306a36Sopenharmony_ci		  __entry->name,
77362306a36Sopenharmony_ci		  (unsigned long)__entry->ino,
77462306a36Sopenharmony_ci		  show_inode_state(__entry->state),
77562306a36Sopenharmony_ci		  __entry->dirtied_when,
77662306a36Sopenharmony_ci		  (jiffies - __entry->dirtied_when) / HZ,
77762306a36Sopenharmony_ci		  __entry->writeback_index,
77862306a36Sopenharmony_ci		  __entry->nr_to_write,
77962306a36Sopenharmony_ci		  __entry->wrote,
78062306a36Sopenharmony_ci		  (unsigned long)__entry->cgroup_ino
78162306a36Sopenharmony_ci	)
78262306a36Sopenharmony_ci);
78362306a36Sopenharmony_ci
78462306a36Sopenharmony_ciDEFINE_EVENT(writeback_single_inode_template, writeback_single_inode_start,
78562306a36Sopenharmony_ci	TP_PROTO(struct inode *inode,
78662306a36Sopenharmony_ci		 struct writeback_control *wbc,
78762306a36Sopenharmony_ci		 unsigned long nr_to_write),
78862306a36Sopenharmony_ci	TP_ARGS(inode, wbc, nr_to_write)
78962306a36Sopenharmony_ci);
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_ciDEFINE_EVENT(writeback_single_inode_template, writeback_single_inode,
79262306a36Sopenharmony_ci	TP_PROTO(struct inode *inode,
79362306a36Sopenharmony_ci		 struct writeback_control *wbc,
79462306a36Sopenharmony_ci		 unsigned long nr_to_write),
79562306a36Sopenharmony_ci	TP_ARGS(inode, wbc, nr_to_write)
79662306a36Sopenharmony_ci);
79762306a36Sopenharmony_ci
79862306a36Sopenharmony_ciDECLARE_EVENT_CLASS(writeback_inode_template,
79962306a36Sopenharmony_ci	TP_PROTO(struct inode *inode),
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_ci	TP_ARGS(inode),
80262306a36Sopenharmony_ci
80362306a36Sopenharmony_ci	TP_STRUCT__entry(
80462306a36Sopenharmony_ci		__field(	dev_t,	dev			)
80562306a36Sopenharmony_ci		__field(	ino_t,	ino			)
80662306a36Sopenharmony_ci		__field(unsigned long,	state			)
80762306a36Sopenharmony_ci		__field(	__u16, mode			)
80862306a36Sopenharmony_ci		__field(unsigned long, dirtied_when		)
80962306a36Sopenharmony_ci	),
81062306a36Sopenharmony_ci
81162306a36Sopenharmony_ci	TP_fast_assign(
81262306a36Sopenharmony_ci		__entry->dev	= inode->i_sb->s_dev;
81362306a36Sopenharmony_ci		__entry->ino	= inode->i_ino;
81462306a36Sopenharmony_ci		__entry->state	= inode->i_state;
81562306a36Sopenharmony_ci		__entry->mode	= inode->i_mode;
81662306a36Sopenharmony_ci		__entry->dirtied_when = inode->dirtied_when;
81762306a36Sopenharmony_ci	),
81862306a36Sopenharmony_ci
81962306a36Sopenharmony_ci	TP_printk("dev %d,%d ino %lu dirtied %lu state %s mode 0%o",
82062306a36Sopenharmony_ci		  MAJOR(__entry->dev), MINOR(__entry->dev),
82162306a36Sopenharmony_ci		  (unsigned long)__entry->ino, __entry->dirtied_when,
82262306a36Sopenharmony_ci		  show_inode_state(__entry->state), __entry->mode)
82362306a36Sopenharmony_ci);
82462306a36Sopenharmony_ci
82562306a36Sopenharmony_ciDEFINE_EVENT(writeback_inode_template, writeback_lazytime,
82662306a36Sopenharmony_ci	TP_PROTO(struct inode *inode),
82762306a36Sopenharmony_ci
82862306a36Sopenharmony_ci	TP_ARGS(inode)
82962306a36Sopenharmony_ci);
83062306a36Sopenharmony_ci
83162306a36Sopenharmony_ciDEFINE_EVENT(writeback_inode_template, writeback_lazytime_iput,
83262306a36Sopenharmony_ci	TP_PROTO(struct inode *inode),
83362306a36Sopenharmony_ci
83462306a36Sopenharmony_ci	TP_ARGS(inode)
83562306a36Sopenharmony_ci);
83662306a36Sopenharmony_ci
83762306a36Sopenharmony_ciDEFINE_EVENT(writeback_inode_template, writeback_dirty_inode_enqueue,
83862306a36Sopenharmony_ci
83962306a36Sopenharmony_ci	TP_PROTO(struct inode *inode),
84062306a36Sopenharmony_ci
84162306a36Sopenharmony_ci	TP_ARGS(inode)
84262306a36Sopenharmony_ci);
84362306a36Sopenharmony_ci
84462306a36Sopenharmony_ci/*
84562306a36Sopenharmony_ci * Inode writeback list tracking.
84662306a36Sopenharmony_ci */
84762306a36Sopenharmony_ci
84862306a36Sopenharmony_ciDEFINE_EVENT(writeback_inode_template, sb_mark_inode_writeback,
84962306a36Sopenharmony_ci	TP_PROTO(struct inode *inode),
85062306a36Sopenharmony_ci	TP_ARGS(inode)
85162306a36Sopenharmony_ci);
85262306a36Sopenharmony_ci
85362306a36Sopenharmony_ciDEFINE_EVENT(writeback_inode_template, sb_clear_inode_writeback,
85462306a36Sopenharmony_ci	TP_PROTO(struct inode *inode),
85562306a36Sopenharmony_ci	TP_ARGS(inode)
85662306a36Sopenharmony_ci);
85762306a36Sopenharmony_ci
85862306a36Sopenharmony_ci#endif /* _TRACE_WRITEBACK_H */
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci/* This part must be outside protection */
86162306a36Sopenharmony_ci#include <trace/define_trace.h>
862