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