1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2455b2864SDave Chinner #undef TRACE_SYSTEM 3455b2864SDave Chinner #define TRACE_SYSTEM writeback 4455b2864SDave Chinner 5455b2864SDave Chinner #if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) 6455b2864SDave Chinner #define _TRACE_WRITEBACK_H 7455b2864SDave Chinner 8f479447aSSteven Rostedt (Red Hat) #include <linux/tracepoint.h> 9455b2864SDave Chinner #include <linux/backing-dev.h> 10455b2864SDave Chinner #include <linux/writeback.h> 11455b2864SDave Chinner 12251d6a47SWu Fengguang #define show_inode_state(state) \ 13251d6a47SWu Fengguang __print_flags(state, "|", \ 14251d6a47SWu Fengguang {I_DIRTY_SYNC, "I_DIRTY_SYNC"}, \ 15251d6a47SWu Fengguang {I_DIRTY_DATASYNC, "I_DIRTY_DATASYNC"}, \ 16251d6a47SWu Fengguang {I_DIRTY_PAGES, "I_DIRTY_PAGES"}, \ 17251d6a47SWu Fengguang {I_NEW, "I_NEW"}, \ 18251d6a47SWu Fengguang {I_WILL_FREE, "I_WILL_FREE"}, \ 19251d6a47SWu Fengguang {I_FREEING, "I_FREEING"}, \ 20251d6a47SWu Fengguang {I_CLEAR, "I_CLEAR"}, \ 21251d6a47SWu Fengguang {I_SYNC, "I_SYNC"}, \ 220ae45f63STheodore Ts'o {I_DIRTY_TIME, "I_DIRTY_TIME"}, \ 230ae45f63STheodore Ts'o {I_DIRTY_TIME_EXPIRED, "I_DIRTY_TIME_EXPIRED"}, \ 24251d6a47SWu Fengguang {I_REFERENCED, "I_REFERENCED"} \ 25251d6a47SWu Fengguang ) 26251d6a47SWu Fengguang 2791df6089SSteven Rostedt (Red Hat) /* enums need to be exported to user space */ 2891df6089SSteven Rostedt (Red Hat) #undef EM 2991df6089SSteven Rostedt (Red Hat) #undef EMe 3091df6089SSteven Rostedt (Red Hat) #define EM(a,b) TRACE_DEFINE_ENUM(a); 3191df6089SSteven Rostedt (Red Hat) #define EMe(a,b) TRACE_DEFINE_ENUM(a); 3291df6089SSteven Rostedt (Red Hat) 33b3bba872SWu Fengguang #define WB_WORK_REASON \ 3491df6089SSteven Rostedt (Red Hat) EM( WB_REASON_BACKGROUND, "background") \ 35726d061fSJohannes Weiner EM( WB_REASON_VMSCAN, "vmscan") \ 3691df6089SSteven Rostedt (Red Hat) EM( WB_REASON_SYNC, "sync") \ 3791df6089SSteven Rostedt (Red Hat) EM( WB_REASON_PERIODIC, "periodic") \ 3891df6089SSteven Rostedt (Red Hat) EM( WB_REASON_LAPTOP_TIMER, "laptop_timer") \ 3991df6089SSteven Rostedt (Red Hat) EM( WB_REASON_FREE_MORE_MEM, "free_more_memory") \ 4091df6089SSteven Rostedt (Red Hat) EM( WB_REASON_FS_FREE_SPACE, "fs_free_space") \ 4191df6089SSteven Rostedt (Red Hat) EMe(WB_REASON_FORKER_THREAD, "forker_thread") 4291df6089SSteven Rostedt (Red Hat) 4391df6089SSteven Rostedt (Red Hat) WB_WORK_REASON 4491df6089SSteven Rostedt (Red Hat) 4591df6089SSteven Rostedt (Red Hat) /* 4691df6089SSteven Rostedt (Red Hat) * Now redefine the EM() and EMe() macros to map the enums to the strings 4791df6089SSteven Rostedt (Red Hat) * that will be printed in the output. 4891df6089SSteven Rostedt (Red Hat) */ 4991df6089SSteven Rostedt (Red Hat) #undef EM 5091df6089SSteven Rostedt (Red Hat) #undef EMe 5191df6089SSteven Rostedt (Red Hat) #define EM(a,b) { a, b }, 5291df6089SSteven Rostedt (Red Hat) #define EMe(a,b) { a, b } 53b3bba872SWu Fengguang 54455b2864SDave Chinner struct wb_writeback_work; 55455b2864SDave Chinner 56*19343b5bSYafang Shao DECLARE_EVENT_CLASS(writeback_page_template, 579fb0a7daSTejun Heo 589fb0a7daSTejun Heo TP_PROTO(struct page *page, struct address_space *mapping), 599fb0a7daSTejun Heo 609fb0a7daSTejun Heo TP_ARGS(page, mapping), 619fb0a7daSTejun Heo 629fb0a7daSTejun Heo TP_STRUCT__entry ( 639fb0a7daSTejun Heo __array(char, name, 32) 649fb0a7daSTejun Heo __field(unsigned long, ino) 659fb0a7daSTejun Heo __field(pgoff_t, index) 669fb0a7daSTejun Heo ), 679fb0a7daSTejun Heo 689fb0a7daSTejun Heo TP_fast_assign( 699fb0a7daSTejun Heo strncpy(__entry->name, 70de1414a6SChristoph Hellwig mapping ? dev_name(inode_to_bdi(mapping->host)->dev) : "(unknown)", 32); 719fb0a7daSTejun Heo __entry->ino = mapping ? mapping->host->i_ino : 0; 729fb0a7daSTejun Heo __entry->index = page->index; 739fb0a7daSTejun Heo ), 749fb0a7daSTejun Heo 759fb0a7daSTejun Heo TP_printk("bdi %s: ino=%lu index=%lu", 769fb0a7daSTejun Heo __entry->name, 779fb0a7daSTejun Heo __entry->ino, 789fb0a7daSTejun Heo __entry->index 799fb0a7daSTejun Heo ) 809fb0a7daSTejun Heo ); 819fb0a7daSTejun Heo 82*19343b5bSYafang Shao DEFINE_EVENT(writeback_page_template, writeback_dirty_page, 83*19343b5bSYafang Shao 84*19343b5bSYafang Shao TP_PROTO(struct page *page, struct address_space *mapping), 85*19343b5bSYafang Shao 86*19343b5bSYafang Shao TP_ARGS(page, mapping) 87*19343b5bSYafang Shao ); 88*19343b5bSYafang Shao 89*19343b5bSYafang Shao DEFINE_EVENT(writeback_page_template, wait_on_page_writeback, 90*19343b5bSYafang Shao 91*19343b5bSYafang Shao TP_PROTO(struct page *page, struct address_space *mapping), 92*19343b5bSYafang Shao 93*19343b5bSYafang Shao TP_ARGS(page, mapping) 94*19343b5bSYafang Shao ); 95*19343b5bSYafang Shao 969fb0a7daSTejun Heo DECLARE_EVENT_CLASS(writeback_dirty_inode_template, 979fb0a7daSTejun Heo 989fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 999fb0a7daSTejun Heo 1009fb0a7daSTejun Heo TP_ARGS(inode, flags), 1019fb0a7daSTejun Heo 1029fb0a7daSTejun Heo TP_STRUCT__entry ( 1039fb0a7daSTejun Heo __array(char, name, 32) 1049fb0a7daSTejun Heo __field(unsigned long, ino) 1050ae45f63STheodore Ts'o __field(unsigned long, state) 1069fb0a7daSTejun Heo __field(unsigned long, flags) 1079fb0a7daSTejun Heo ), 1089fb0a7daSTejun Heo 1099fb0a7daSTejun Heo TP_fast_assign( 110de1414a6SChristoph Hellwig struct backing_dev_info *bdi = inode_to_bdi(inode); 1119fb0a7daSTejun Heo 1129fb0a7daSTejun Heo /* may be called for files on pseudo FSes w/ unregistered bdi */ 1139fb0a7daSTejun Heo strncpy(__entry->name, 1149fb0a7daSTejun Heo bdi->dev ? dev_name(bdi->dev) : "(unknown)", 32); 1159fb0a7daSTejun Heo __entry->ino = inode->i_ino; 1160ae45f63STheodore Ts'o __entry->state = inode->i_state; 1179fb0a7daSTejun Heo __entry->flags = flags; 1189fb0a7daSTejun Heo ), 1199fb0a7daSTejun Heo 1200ae45f63STheodore Ts'o TP_printk("bdi %s: ino=%lu state=%s flags=%s", 1219fb0a7daSTejun Heo __entry->name, 1229fb0a7daSTejun Heo __entry->ino, 1230ae45f63STheodore Ts'o show_inode_state(__entry->state), 1249fb0a7daSTejun Heo show_inode_state(__entry->flags) 1259fb0a7daSTejun Heo ) 1269fb0a7daSTejun Heo ); 1279fb0a7daSTejun Heo 1280ae45f63STheodore Ts'o DEFINE_EVENT(writeback_dirty_inode_template, writeback_mark_inode_dirty, 1290ae45f63STheodore Ts'o 1300ae45f63STheodore Ts'o TP_PROTO(struct inode *inode, int flags), 1310ae45f63STheodore Ts'o 1320ae45f63STheodore Ts'o TP_ARGS(inode, flags) 1330ae45f63STheodore Ts'o ); 1340ae45f63STheodore Ts'o 1359fb0a7daSTejun Heo DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode_start, 1369fb0a7daSTejun Heo 1379fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 1389fb0a7daSTejun Heo 1399fb0a7daSTejun Heo TP_ARGS(inode, flags) 1409fb0a7daSTejun Heo ); 1419fb0a7daSTejun Heo 1429fb0a7daSTejun Heo DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode, 1439fb0a7daSTejun Heo 1449fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 1459fb0a7daSTejun Heo 1469fb0a7daSTejun Heo TP_ARGS(inode, flags) 1479fb0a7daSTejun Heo ); 1489fb0a7daSTejun Heo 1495634cc2aSTejun Heo #ifdef CREATE_TRACE_POINTS 1505634cc2aSTejun Heo #ifdef CONFIG_CGROUP_WRITEBACK 1515634cc2aSTejun Heo 152a664edb3SYang Shi static inline unsigned int __trace_wb_assign_cgroup(struct bdi_writeback *wb) 1535634cc2aSTejun Heo { 154c53cd490SShaohua Li return wb->memcg_css->cgroup->kn->id.ino; 1555634cc2aSTejun Heo } 1565634cc2aSTejun Heo 157a664edb3SYang Shi static inline unsigned int __trace_wbc_assign_cgroup(struct writeback_control *wbc) 1585634cc2aSTejun Heo { 1595634cc2aSTejun Heo if (wbc->wb) 160a664edb3SYang Shi return __trace_wb_assign_cgroup(wbc->wb); 1615634cc2aSTejun Heo else 162a664edb3SYang Shi return -1U; 1635634cc2aSTejun Heo } 1645634cc2aSTejun Heo #else /* CONFIG_CGROUP_WRITEBACK */ 1655634cc2aSTejun Heo 166a664edb3SYang Shi static inline unsigned int __trace_wb_assign_cgroup(struct bdi_writeback *wb) 1675634cc2aSTejun Heo { 168a664edb3SYang Shi return -1U; 1695634cc2aSTejun Heo } 1705634cc2aSTejun Heo 171a664edb3SYang Shi static inline unsigned int __trace_wbc_assign_cgroup(struct writeback_control *wbc) 1725634cc2aSTejun Heo { 173a664edb3SYang Shi return -1U; 1745634cc2aSTejun Heo } 1755634cc2aSTejun Heo 1765634cc2aSTejun Heo #endif /* CONFIG_CGROUP_WRITEBACK */ 1775634cc2aSTejun Heo #endif /* CREATE_TRACE_POINTS */ 1785634cc2aSTejun Heo 1799fb0a7daSTejun Heo DECLARE_EVENT_CLASS(writeback_write_inode_template, 1809fb0a7daSTejun Heo 1819fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 1829fb0a7daSTejun Heo 1839fb0a7daSTejun Heo TP_ARGS(inode, wbc), 1849fb0a7daSTejun Heo 1859fb0a7daSTejun Heo TP_STRUCT__entry ( 1869fb0a7daSTejun Heo __array(char, name, 32) 1879fb0a7daSTejun Heo __field(unsigned long, ino) 1889fb0a7daSTejun Heo __field(int, sync_mode) 189a664edb3SYang Shi __field(unsigned int, cgroup_ino) 1909fb0a7daSTejun Heo ), 1919fb0a7daSTejun Heo 1929fb0a7daSTejun Heo TP_fast_assign( 1939fb0a7daSTejun Heo strncpy(__entry->name, 194de1414a6SChristoph Hellwig dev_name(inode_to_bdi(inode)->dev), 32); 1959fb0a7daSTejun Heo __entry->ino = inode->i_ino; 1969fb0a7daSTejun Heo __entry->sync_mode = wbc->sync_mode; 197a664edb3SYang Shi __entry->cgroup_ino = __trace_wbc_assign_cgroup(wbc); 1989fb0a7daSTejun Heo ), 1999fb0a7daSTejun Heo 200a664edb3SYang Shi TP_printk("bdi %s: ino=%lu sync_mode=%d cgroup_ino=%u", 2019fb0a7daSTejun Heo __entry->name, 2029fb0a7daSTejun Heo __entry->ino, 2035634cc2aSTejun Heo __entry->sync_mode, 204a664edb3SYang Shi __entry->cgroup_ino 2059fb0a7daSTejun Heo ) 2069fb0a7daSTejun Heo ); 2079fb0a7daSTejun Heo 2089fb0a7daSTejun Heo DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode_start, 2099fb0a7daSTejun Heo 2109fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 2119fb0a7daSTejun Heo 2129fb0a7daSTejun Heo TP_ARGS(inode, wbc) 2139fb0a7daSTejun Heo ); 2149fb0a7daSTejun Heo 2159fb0a7daSTejun Heo DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode, 2169fb0a7daSTejun Heo 2179fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 2189fb0a7daSTejun Heo 2199fb0a7daSTejun Heo TP_ARGS(inode, wbc) 2209fb0a7daSTejun Heo ); 2219fb0a7daSTejun Heo 222455b2864SDave Chinner DECLARE_EVENT_CLASS(writeback_work_class, 2235634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), 2245634cc2aSTejun Heo TP_ARGS(wb, work), 225455b2864SDave Chinner TP_STRUCT__entry( 226455b2864SDave Chinner __array(char, name, 32) 227455b2864SDave Chinner __field(long, nr_pages) 228455b2864SDave Chinner __field(dev_t, sb_dev) 229455b2864SDave Chinner __field(int, sync_mode) 230455b2864SDave Chinner __field(int, for_kupdate) 231455b2864SDave Chinner __field(int, range_cyclic) 232455b2864SDave Chinner __field(int, for_background) 2330e175a18SCurt Wohlgemuth __field(int, reason) 234a664edb3SYang Shi __field(unsigned int, cgroup_ino) 235455b2864SDave Chinner ), 236455b2864SDave Chinner TP_fast_assign( 237df0ce26cSChristoph Hellwig strncpy(__entry->name, 2385634cc2aSTejun Heo wb->bdi->dev ? dev_name(wb->bdi->dev) : "(unknown)", 32); 239455b2864SDave Chinner __entry->nr_pages = work->nr_pages; 240455b2864SDave Chinner __entry->sb_dev = work->sb ? work->sb->s_dev : 0; 241455b2864SDave Chinner __entry->sync_mode = work->sync_mode; 242455b2864SDave Chinner __entry->for_kupdate = work->for_kupdate; 243455b2864SDave Chinner __entry->range_cyclic = work->range_cyclic; 244455b2864SDave Chinner __entry->for_background = work->for_background; 2450e175a18SCurt Wohlgemuth __entry->reason = work->reason; 246a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 247455b2864SDave Chinner ), 248455b2864SDave Chinner TP_printk("bdi %s: sb_dev %d:%d nr_pages=%ld sync_mode=%d " 249a664edb3SYang Shi "kupdate=%d range_cyclic=%d background=%d reason=%s cgroup_ino=%u", 250455b2864SDave Chinner __entry->name, 251455b2864SDave Chinner MAJOR(__entry->sb_dev), MINOR(__entry->sb_dev), 252455b2864SDave Chinner __entry->nr_pages, 253455b2864SDave Chinner __entry->sync_mode, 254455b2864SDave Chinner __entry->for_kupdate, 255455b2864SDave Chinner __entry->range_cyclic, 2560e175a18SCurt Wohlgemuth __entry->for_background, 2575634cc2aSTejun Heo __print_symbolic(__entry->reason, WB_WORK_REASON), 258a664edb3SYang Shi __entry->cgroup_ino 259455b2864SDave Chinner ) 260455b2864SDave Chinner ); 261455b2864SDave Chinner #define DEFINE_WRITEBACK_WORK_EVENT(name) \ 262455b2864SDave Chinner DEFINE_EVENT(writeback_work_class, name, \ 2635634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), \ 2645634cc2aSTejun Heo TP_ARGS(wb, work)) 265455b2864SDave Chinner DEFINE_WRITEBACK_WORK_EVENT(writeback_queue); 266455b2864SDave Chinner DEFINE_WRITEBACK_WORK_EVENT(writeback_exec); 267d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_start); 268d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_written); 269d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_wait); 270455b2864SDave Chinner 271455b2864SDave Chinner TRACE_EVENT(writeback_pages_written, 272455b2864SDave Chinner TP_PROTO(long pages_written), 273455b2864SDave Chinner TP_ARGS(pages_written), 274455b2864SDave Chinner TP_STRUCT__entry( 275455b2864SDave Chinner __field(long, pages) 276455b2864SDave Chinner ), 277455b2864SDave Chinner TP_fast_assign( 278455b2864SDave Chinner __entry->pages = pages_written; 279455b2864SDave Chinner ), 280455b2864SDave Chinner TP_printk("%ld", __entry->pages) 281455b2864SDave Chinner ); 282455b2864SDave Chinner 283455b2864SDave Chinner DECLARE_EVENT_CLASS(writeback_class, 2845634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb), 2855634cc2aSTejun Heo TP_ARGS(wb), 2865634cc2aSTejun Heo TP_STRUCT__entry( 2875634cc2aSTejun Heo __array(char, name, 32) 288a664edb3SYang Shi __field(unsigned int, cgroup_ino) 2895634cc2aSTejun Heo ), 2905634cc2aSTejun Heo TP_fast_assign( 2915634cc2aSTejun Heo strncpy(__entry->name, dev_name(wb->bdi->dev), 32); 292a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 2935634cc2aSTejun Heo ), 294a664edb3SYang Shi TP_printk("bdi %s: cgroup_ino=%u", 2955634cc2aSTejun Heo __entry->name, 296a664edb3SYang Shi __entry->cgroup_ino 2975634cc2aSTejun Heo ) 2985634cc2aSTejun Heo ); 2995634cc2aSTejun Heo #define DEFINE_WRITEBACK_EVENT(name) \ 3005634cc2aSTejun Heo DEFINE_EVENT(writeback_class, name, \ 3015634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb), \ 3025634cc2aSTejun Heo TP_ARGS(wb)) 3035634cc2aSTejun Heo 3045634cc2aSTejun Heo DEFINE_WRITEBACK_EVENT(writeback_wake_background); 3055634cc2aSTejun Heo 3065634cc2aSTejun Heo TRACE_EVENT(writeback_bdi_register, 307455b2864SDave Chinner TP_PROTO(struct backing_dev_info *bdi), 308455b2864SDave Chinner TP_ARGS(bdi), 309455b2864SDave Chinner TP_STRUCT__entry( 310455b2864SDave Chinner __array(char, name, 32) 311455b2864SDave Chinner ), 312455b2864SDave Chinner TP_fast_assign( 313455b2864SDave Chinner strncpy(__entry->name, dev_name(bdi->dev), 32); 314455b2864SDave Chinner ), 315455b2864SDave Chinner TP_printk("bdi %s", 316455b2864SDave Chinner __entry->name 317455b2864SDave Chinner ) 318455b2864SDave Chinner ); 319455b2864SDave Chinner 320028c2dd1SDave Chinner DECLARE_EVENT_CLASS(wbc_class, 321028c2dd1SDave Chinner TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), 322028c2dd1SDave Chinner TP_ARGS(wbc, bdi), 323028c2dd1SDave Chinner TP_STRUCT__entry( 324028c2dd1SDave Chinner __array(char, name, 32) 325028c2dd1SDave Chinner __field(long, nr_to_write) 326028c2dd1SDave Chinner __field(long, pages_skipped) 327028c2dd1SDave Chinner __field(int, sync_mode) 328028c2dd1SDave Chinner __field(int, for_kupdate) 329028c2dd1SDave Chinner __field(int, for_background) 330028c2dd1SDave Chinner __field(int, for_reclaim) 331028c2dd1SDave Chinner __field(int, range_cyclic) 332028c2dd1SDave Chinner __field(long, range_start) 333028c2dd1SDave Chinner __field(long, range_end) 334a664edb3SYang Shi __field(unsigned int, cgroup_ino) 335028c2dd1SDave Chinner ), 336028c2dd1SDave Chinner 337028c2dd1SDave Chinner TP_fast_assign( 338028c2dd1SDave Chinner strncpy(__entry->name, dev_name(bdi->dev), 32); 339028c2dd1SDave Chinner __entry->nr_to_write = wbc->nr_to_write; 340028c2dd1SDave Chinner __entry->pages_skipped = wbc->pages_skipped; 341028c2dd1SDave Chinner __entry->sync_mode = wbc->sync_mode; 342028c2dd1SDave Chinner __entry->for_kupdate = wbc->for_kupdate; 343028c2dd1SDave Chinner __entry->for_background = wbc->for_background; 344028c2dd1SDave Chinner __entry->for_reclaim = wbc->for_reclaim; 345028c2dd1SDave Chinner __entry->range_cyclic = wbc->range_cyclic; 346028c2dd1SDave Chinner __entry->range_start = (long)wbc->range_start; 347028c2dd1SDave Chinner __entry->range_end = (long)wbc->range_end; 348a664edb3SYang Shi __entry->cgroup_ino = __trace_wbc_assign_cgroup(wbc); 349028c2dd1SDave Chinner ), 350028c2dd1SDave Chinner 351028c2dd1SDave Chinner TP_printk("bdi %s: towrt=%ld skip=%ld mode=%d kupd=%d " 352d46db3d5SWu Fengguang "bgrd=%d reclm=%d cyclic=%d " 353a664edb3SYang Shi "start=0x%lx end=0x%lx cgroup_ino=%u", 354028c2dd1SDave Chinner __entry->name, 355028c2dd1SDave Chinner __entry->nr_to_write, 356028c2dd1SDave Chinner __entry->pages_skipped, 357028c2dd1SDave Chinner __entry->sync_mode, 358028c2dd1SDave Chinner __entry->for_kupdate, 359028c2dd1SDave Chinner __entry->for_background, 360028c2dd1SDave Chinner __entry->for_reclaim, 361028c2dd1SDave Chinner __entry->range_cyclic, 362028c2dd1SDave Chinner __entry->range_start, 3635634cc2aSTejun Heo __entry->range_end, 364a664edb3SYang Shi __entry->cgroup_ino 3655634cc2aSTejun Heo ) 366028c2dd1SDave Chinner ) 367028c2dd1SDave Chinner 368028c2dd1SDave Chinner #define DEFINE_WBC_EVENT(name) \ 369028c2dd1SDave Chinner DEFINE_EVENT(wbc_class, name, \ 370028c2dd1SDave Chinner TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), \ 371028c2dd1SDave Chinner TP_ARGS(wbc, bdi)) 3729e094383SDave Chinner DEFINE_WBC_EVENT(wbc_writepage); 373028c2dd1SDave Chinner 374e84d0a4fSWu Fengguang TRACE_EVENT(writeback_queue_io, 375e84d0a4fSWu Fengguang TP_PROTO(struct bdi_writeback *wb, 376ad4e38ddSCurt Wohlgemuth struct wb_writeback_work *work, 377e84d0a4fSWu Fengguang int moved), 378ad4e38ddSCurt Wohlgemuth TP_ARGS(wb, work, moved), 379e84d0a4fSWu Fengguang TP_STRUCT__entry( 380e84d0a4fSWu Fengguang __array(char, name, 32) 381e84d0a4fSWu Fengguang __field(unsigned long, older) 382e84d0a4fSWu Fengguang __field(long, age) 383e84d0a4fSWu Fengguang __field(int, moved) 3840e175a18SCurt Wohlgemuth __field(int, reason) 385a664edb3SYang Shi __field(unsigned int, cgroup_ino) 386e84d0a4fSWu Fengguang ), 387e84d0a4fSWu Fengguang TP_fast_assign( 3880dc83bd3SJan Kara unsigned long *older_than_this = work->older_than_this; 389e84d0a4fSWu Fengguang strncpy(__entry->name, dev_name(wb->bdi->dev), 32); 3900dc83bd3SJan Kara __entry->older = older_than_this ? *older_than_this : 0; 391e84d0a4fSWu Fengguang __entry->age = older_than_this ? 3920dc83bd3SJan Kara (jiffies - *older_than_this) * 1000 / HZ : -1; 393e84d0a4fSWu Fengguang __entry->moved = moved; 3940e175a18SCurt Wohlgemuth __entry->reason = work->reason; 395a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 396e84d0a4fSWu Fengguang ), 397a664edb3SYang Shi TP_printk("bdi %s: older=%lu age=%ld enqueue=%d reason=%s cgroup_ino=%u", 398e84d0a4fSWu Fengguang __entry->name, 399e84d0a4fSWu Fengguang __entry->older, /* older_than_this in jiffies */ 400e84d0a4fSWu Fengguang __entry->age, /* older_than_this in relative milliseconds */ 4010e175a18SCurt Wohlgemuth __entry->moved, 4025634cc2aSTejun Heo __print_symbolic(__entry->reason, WB_WORK_REASON), 403a664edb3SYang Shi __entry->cgroup_ino 404b3bba872SWu Fengguang ) 405e84d0a4fSWu Fengguang ); 406e84d0a4fSWu Fengguang 407e1cbe236SWu Fengguang TRACE_EVENT(global_dirty_state, 408e1cbe236SWu Fengguang 409e1cbe236SWu Fengguang TP_PROTO(unsigned long background_thresh, 410e1cbe236SWu Fengguang unsigned long dirty_thresh 411e1cbe236SWu Fengguang ), 412e1cbe236SWu Fengguang 413e1cbe236SWu Fengguang TP_ARGS(background_thresh, 414e1cbe236SWu Fengguang dirty_thresh 415e1cbe236SWu Fengguang ), 416e1cbe236SWu Fengguang 417e1cbe236SWu Fengguang TP_STRUCT__entry( 418e1cbe236SWu Fengguang __field(unsigned long, nr_dirty) 419e1cbe236SWu Fengguang __field(unsigned long, nr_writeback) 420e1cbe236SWu Fengguang __field(unsigned long, nr_unstable) 421e1cbe236SWu Fengguang __field(unsigned long, background_thresh) 422e1cbe236SWu Fengguang __field(unsigned long, dirty_thresh) 423e1cbe236SWu Fengguang __field(unsigned long, dirty_limit) 424e1cbe236SWu Fengguang __field(unsigned long, nr_dirtied) 425e1cbe236SWu Fengguang __field(unsigned long, nr_written) 426e1cbe236SWu Fengguang ), 427e1cbe236SWu Fengguang 428e1cbe236SWu Fengguang TP_fast_assign( 42911fb9989SMel Gorman __entry->nr_dirty = global_node_page_state(NR_FILE_DIRTY); 43011fb9989SMel Gorman __entry->nr_writeback = global_node_page_state(NR_WRITEBACK); 43111fb9989SMel Gorman __entry->nr_unstable = global_node_page_state(NR_UNSTABLE_NFS); 432c4a25635SMel Gorman __entry->nr_dirtied = global_node_page_state(NR_DIRTIED); 433c4a25635SMel Gorman __entry->nr_written = global_node_page_state(NR_WRITTEN); 434e1cbe236SWu Fengguang __entry->background_thresh = background_thresh; 435e1cbe236SWu Fengguang __entry->dirty_thresh = dirty_thresh; 436dcc25ae7STejun Heo __entry->dirty_limit = global_wb_domain.dirty_limit; 437e1cbe236SWu Fengguang ), 438e1cbe236SWu Fengguang 439e1cbe236SWu Fengguang TP_printk("dirty=%lu writeback=%lu unstable=%lu " 440e1cbe236SWu Fengguang "bg_thresh=%lu thresh=%lu limit=%lu " 441e1cbe236SWu Fengguang "dirtied=%lu written=%lu", 442e1cbe236SWu Fengguang __entry->nr_dirty, 443e1cbe236SWu Fengguang __entry->nr_writeback, 444e1cbe236SWu Fengguang __entry->nr_unstable, 445e1cbe236SWu Fengguang __entry->background_thresh, 446e1cbe236SWu Fengguang __entry->dirty_thresh, 447e1cbe236SWu Fengguang __entry->dirty_limit, 448e1cbe236SWu Fengguang __entry->nr_dirtied, 449e1cbe236SWu Fengguang __entry->nr_written 450e1cbe236SWu Fengguang ) 451e1cbe236SWu Fengguang ); 452e1cbe236SWu Fengguang 453b48c104dSWu Fengguang #define KBps(x) ((x) << (PAGE_SHIFT - 10)) 454b48c104dSWu Fengguang 455b48c104dSWu Fengguang TRACE_EVENT(bdi_dirty_ratelimit, 456b48c104dSWu Fengguang 4575634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, 458b48c104dSWu Fengguang unsigned long dirty_rate, 459b48c104dSWu Fengguang unsigned long task_ratelimit), 460b48c104dSWu Fengguang 4615634cc2aSTejun Heo TP_ARGS(wb, dirty_rate, task_ratelimit), 462b48c104dSWu Fengguang 463b48c104dSWu Fengguang TP_STRUCT__entry( 464b48c104dSWu Fengguang __array(char, bdi, 32) 465b48c104dSWu Fengguang __field(unsigned long, write_bw) 466b48c104dSWu Fengguang __field(unsigned long, avg_write_bw) 467b48c104dSWu Fengguang __field(unsigned long, dirty_rate) 468b48c104dSWu Fengguang __field(unsigned long, dirty_ratelimit) 469b48c104dSWu Fengguang __field(unsigned long, task_ratelimit) 470b48c104dSWu Fengguang __field(unsigned long, balanced_dirty_ratelimit) 471a664edb3SYang Shi __field(unsigned int, cgroup_ino) 472b48c104dSWu Fengguang ), 473b48c104dSWu Fengguang 474b48c104dSWu Fengguang TP_fast_assign( 4755634cc2aSTejun Heo strlcpy(__entry->bdi, dev_name(wb->bdi->dev), 32); 4765634cc2aSTejun Heo __entry->write_bw = KBps(wb->write_bandwidth); 4775634cc2aSTejun Heo __entry->avg_write_bw = KBps(wb->avg_write_bandwidth); 478b48c104dSWu Fengguang __entry->dirty_rate = KBps(dirty_rate); 4795634cc2aSTejun Heo __entry->dirty_ratelimit = KBps(wb->dirty_ratelimit); 480b48c104dSWu Fengguang __entry->task_ratelimit = KBps(task_ratelimit); 481b48c104dSWu Fengguang __entry->balanced_dirty_ratelimit = 4825634cc2aSTejun Heo KBps(wb->balanced_dirty_ratelimit); 483a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 484b48c104dSWu Fengguang ), 485b48c104dSWu Fengguang 486b48c104dSWu Fengguang TP_printk("bdi %s: " 487b48c104dSWu Fengguang "write_bw=%lu awrite_bw=%lu dirty_rate=%lu " 488b48c104dSWu Fengguang "dirty_ratelimit=%lu task_ratelimit=%lu " 489a664edb3SYang Shi "balanced_dirty_ratelimit=%lu cgroup_ino=%u", 490b48c104dSWu Fengguang __entry->bdi, 491b48c104dSWu Fengguang __entry->write_bw, /* write bandwidth */ 492b48c104dSWu Fengguang __entry->avg_write_bw, /* avg write bandwidth */ 493b48c104dSWu Fengguang __entry->dirty_rate, /* bdi dirty rate */ 494b48c104dSWu Fengguang __entry->dirty_ratelimit, /* base ratelimit */ 495b48c104dSWu Fengguang __entry->task_ratelimit, /* ratelimit with position control */ 4965634cc2aSTejun Heo __entry->balanced_dirty_ratelimit, /* the balanced ratelimit */ 497a664edb3SYang Shi __entry->cgroup_ino 498b48c104dSWu Fengguang ) 499b48c104dSWu Fengguang ); 500b48c104dSWu Fengguang 501ece13ac3SWu Fengguang TRACE_EVENT(balance_dirty_pages, 502ece13ac3SWu Fengguang 5035634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, 504ece13ac3SWu Fengguang unsigned long thresh, 505ece13ac3SWu Fengguang unsigned long bg_thresh, 506ece13ac3SWu Fengguang unsigned long dirty, 507ece13ac3SWu Fengguang unsigned long bdi_thresh, 508ece13ac3SWu Fengguang unsigned long bdi_dirty, 509ece13ac3SWu Fengguang unsigned long dirty_ratelimit, 510ece13ac3SWu Fengguang unsigned long task_ratelimit, 511ece13ac3SWu Fengguang unsigned long dirtied, 51283712358SWu Fengguang unsigned long period, 513ece13ac3SWu Fengguang long pause, 514ece13ac3SWu Fengguang unsigned long start_time), 515ece13ac3SWu Fengguang 5165634cc2aSTejun Heo TP_ARGS(wb, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty, 517ece13ac3SWu Fengguang dirty_ratelimit, task_ratelimit, 51883712358SWu Fengguang dirtied, period, pause, start_time), 519ece13ac3SWu Fengguang 520ece13ac3SWu Fengguang TP_STRUCT__entry( 521ece13ac3SWu Fengguang __array( char, bdi, 32) 522ece13ac3SWu Fengguang __field(unsigned long, limit) 523ece13ac3SWu Fengguang __field(unsigned long, setpoint) 524ece13ac3SWu Fengguang __field(unsigned long, dirty) 525ece13ac3SWu Fengguang __field(unsigned long, bdi_setpoint) 526ece13ac3SWu Fengguang __field(unsigned long, bdi_dirty) 527ece13ac3SWu Fengguang __field(unsigned long, dirty_ratelimit) 528ece13ac3SWu Fengguang __field(unsigned long, task_ratelimit) 529ece13ac3SWu Fengguang __field(unsigned int, dirtied) 530ece13ac3SWu Fengguang __field(unsigned int, dirtied_pause) 531ece13ac3SWu Fengguang __field(unsigned long, paused) 532ece13ac3SWu Fengguang __field( long, pause) 53383712358SWu Fengguang __field(unsigned long, period) 53483712358SWu Fengguang __field( long, think) 535a664edb3SYang Shi __field(unsigned int, cgroup_ino) 536ece13ac3SWu Fengguang ), 537ece13ac3SWu Fengguang 538ece13ac3SWu Fengguang TP_fast_assign( 539ece13ac3SWu Fengguang unsigned long freerun = (thresh + bg_thresh) / 2; 5405634cc2aSTejun Heo strlcpy(__entry->bdi, dev_name(wb->bdi->dev), 32); 541ece13ac3SWu Fengguang 542dcc25ae7STejun Heo __entry->limit = global_wb_domain.dirty_limit; 543dcc25ae7STejun Heo __entry->setpoint = (global_wb_domain.dirty_limit + 544dcc25ae7STejun Heo freerun) / 2; 545ece13ac3SWu Fengguang __entry->dirty = dirty; 546ece13ac3SWu Fengguang __entry->bdi_setpoint = __entry->setpoint * 547ece13ac3SWu Fengguang bdi_thresh / (thresh + 1); 548ece13ac3SWu Fengguang __entry->bdi_dirty = bdi_dirty; 549ece13ac3SWu Fengguang __entry->dirty_ratelimit = KBps(dirty_ratelimit); 550ece13ac3SWu Fengguang __entry->task_ratelimit = KBps(task_ratelimit); 551ece13ac3SWu Fengguang __entry->dirtied = dirtied; 552ece13ac3SWu Fengguang __entry->dirtied_pause = current->nr_dirtied_pause; 55383712358SWu Fengguang __entry->think = current->dirty_paused_when == 0 ? 0 : 55483712358SWu Fengguang (long)(jiffies - current->dirty_paused_when) * 1000/HZ; 55583712358SWu Fengguang __entry->period = period * 1000 / HZ; 556ece13ac3SWu Fengguang __entry->pause = pause * 1000 / HZ; 557ece13ac3SWu Fengguang __entry->paused = (jiffies - start_time) * 1000 / HZ; 558a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 559ece13ac3SWu Fengguang ), 560ece13ac3SWu Fengguang 561ece13ac3SWu Fengguang 562ece13ac3SWu Fengguang TP_printk("bdi %s: " 563ece13ac3SWu Fengguang "limit=%lu setpoint=%lu dirty=%lu " 564ece13ac3SWu Fengguang "bdi_setpoint=%lu bdi_dirty=%lu " 565ece13ac3SWu Fengguang "dirty_ratelimit=%lu task_ratelimit=%lu " 566ece13ac3SWu Fengguang "dirtied=%u dirtied_pause=%u " 567a664edb3SYang Shi "paused=%lu pause=%ld period=%lu think=%ld cgroup_ino=%u", 568ece13ac3SWu Fengguang __entry->bdi, 569ece13ac3SWu Fengguang __entry->limit, 570ece13ac3SWu Fengguang __entry->setpoint, 571ece13ac3SWu Fengguang __entry->dirty, 572ece13ac3SWu Fengguang __entry->bdi_setpoint, 573ece13ac3SWu Fengguang __entry->bdi_dirty, 574ece13ac3SWu Fengguang __entry->dirty_ratelimit, 575ece13ac3SWu Fengguang __entry->task_ratelimit, 576ece13ac3SWu Fengguang __entry->dirtied, 577ece13ac3SWu Fengguang __entry->dirtied_pause, 578ece13ac3SWu Fengguang __entry->paused, /* ms */ 57983712358SWu Fengguang __entry->pause, /* ms */ 58083712358SWu Fengguang __entry->period, /* ms */ 5815634cc2aSTejun Heo __entry->think, /* ms */ 582a664edb3SYang Shi __entry->cgroup_ino 583ece13ac3SWu Fengguang ) 584ece13ac3SWu Fengguang ); 585ece13ac3SWu Fengguang 586cc1676d9SJan Kara TRACE_EVENT(writeback_sb_inodes_requeue, 587cc1676d9SJan Kara 588cc1676d9SJan Kara TP_PROTO(struct inode *inode), 589cc1676d9SJan Kara TP_ARGS(inode), 590cc1676d9SJan Kara 591cc1676d9SJan Kara TP_STRUCT__entry( 592cc1676d9SJan Kara __array(char, name, 32) 593cc1676d9SJan Kara __field(unsigned long, ino) 594cc1676d9SJan Kara __field(unsigned long, state) 595cc1676d9SJan Kara __field(unsigned long, dirtied_when) 596a664edb3SYang Shi __field(unsigned int, cgroup_ino) 597cc1676d9SJan Kara ), 598cc1676d9SJan Kara 599cc1676d9SJan Kara TP_fast_assign( 600cc1676d9SJan Kara strncpy(__entry->name, 601cc1676d9SJan Kara dev_name(inode_to_bdi(inode)->dev), 32); 602cc1676d9SJan Kara __entry->ino = inode->i_ino; 603cc1676d9SJan Kara __entry->state = inode->i_state; 604cc1676d9SJan Kara __entry->dirtied_when = inode->dirtied_when; 605a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(inode_to_wb(inode)); 606cc1676d9SJan Kara ), 607cc1676d9SJan Kara 608a664edb3SYang Shi TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu cgroup_ino=%u", 609cc1676d9SJan Kara __entry->name, 610cc1676d9SJan Kara __entry->ino, 611cc1676d9SJan Kara show_inode_state(__entry->state), 612cc1676d9SJan Kara __entry->dirtied_when, 6135634cc2aSTejun Heo (jiffies - __entry->dirtied_when) / HZ, 614a664edb3SYang Shi __entry->cgroup_ino 615cc1676d9SJan Kara ) 616cc1676d9SJan Kara ); 617cc1676d9SJan Kara 61852bb9198SMel Gorman DECLARE_EVENT_CLASS(writeback_congest_waited_template, 61952bb9198SMel Gorman 62052bb9198SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 62152bb9198SMel Gorman 62252bb9198SMel Gorman TP_ARGS(usec_timeout, usec_delayed), 62352bb9198SMel Gorman 62452bb9198SMel Gorman TP_STRUCT__entry( 62552bb9198SMel Gorman __field( unsigned int, usec_timeout ) 62652bb9198SMel Gorman __field( unsigned int, usec_delayed ) 62752bb9198SMel Gorman ), 62852bb9198SMel Gorman 62952bb9198SMel Gorman TP_fast_assign( 63052bb9198SMel Gorman __entry->usec_timeout = usec_timeout; 63152bb9198SMel Gorman __entry->usec_delayed = usec_delayed; 63252bb9198SMel Gorman ), 63352bb9198SMel Gorman 63452bb9198SMel Gorman TP_printk("usec_timeout=%u usec_delayed=%u", 63552bb9198SMel Gorman __entry->usec_timeout, 63652bb9198SMel Gorman __entry->usec_delayed) 63752bb9198SMel Gorman ); 63852bb9198SMel Gorman 63952bb9198SMel Gorman DEFINE_EVENT(writeback_congest_waited_template, writeback_congestion_wait, 64052bb9198SMel Gorman 64152bb9198SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 64252bb9198SMel Gorman 64352bb9198SMel Gorman TP_ARGS(usec_timeout, usec_delayed) 64452bb9198SMel Gorman ); 64552bb9198SMel Gorman 6460e093d99SMel Gorman DEFINE_EVENT(writeback_congest_waited_template, writeback_wait_iff_congested, 6470e093d99SMel Gorman 6480e093d99SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 6490e093d99SMel Gorman 6500e093d99SMel Gorman TP_ARGS(usec_timeout, usec_delayed) 6510e093d99SMel Gorman ); 6520e093d99SMel Gorman 653251d6a47SWu Fengguang DECLARE_EVENT_CLASS(writeback_single_inode_template, 654251d6a47SWu Fengguang 655251d6a47SWu Fengguang TP_PROTO(struct inode *inode, 656251d6a47SWu Fengguang struct writeback_control *wbc, 657251d6a47SWu Fengguang unsigned long nr_to_write 658251d6a47SWu Fengguang ), 659251d6a47SWu Fengguang 660251d6a47SWu Fengguang TP_ARGS(inode, wbc, nr_to_write), 661251d6a47SWu Fengguang 662251d6a47SWu Fengguang TP_STRUCT__entry( 663251d6a47SWu Fengguang __array(char, name, 32) 664251d6a47SWu Fengguang __field(unsigned long, ino) 665251d6a47SWu Fengguang __field(unsigned long, state) 666c8ad6206SWu Fengguang __field(unsigned long, dirtied_when) 667251d6a47SWu Fengguang __field(unsigned long, writeback_index) 668251d6a47SWu Fengguang __field(long, nr_to_write) 669251d6a47SWu Fengguang __field(unsigned long, wrote) 670a664edb3SYang Shi __field(unsigned int, cgroup_ino) 671251d6a47SWu Fengguang ), 672251d6a47SWu Fengguang 673251d6a47SWu Fengguang TP_fast_assign( 674251d6a47SWu Fengguang strncpy(__entry->name, 67515eb77a0SWu Fengguang dev_name(inode_to_bdi(inode)->dev), 32); 676251d6a47SWu Fengguang __entry->ino = inode->i_ino; 677251d6a47SWu Fengguang __entry->state = inode->i_state; 678c8ad6206SWu Fengguang __entry->dirtied_when = inode->dirtied_when; 679251d6a47SWu Fengguang __entry->writeback_index = inode->i_mapping->writeback_index; 680251d6a47SWu Fengguang __entry->nr_to_write = nr_to_write; 681251d6a47SWu Fengguang __entry->wrote = nr_to_write - wbc->nr_to_write; 682a664edb3SYang Shi __entry->cgroup_ino = __trace_wbc_assign_cgroup(wbc); 683251d6a47SWu Fengguang ), 684251d6a47SWu Fengguang 685c8ad6206SWu Fengguang TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu " 686a664edb3SYang Shi "index=%lu to_write=%ld wrote=%lu cgroup_ino=%u", 687251d6a47SWu Fengguang __entry->name, 688251d6a47SWu Fengguang __entry->ino, 689251d6a47SWu Fengguang show_inode_state(__entry->state), 690c8ad6206SWu Fengguang __entry->dirtied_when, 691c8ad6206SWu Fengguang (jiffies - __entry->dirtied_when) / HZ, 692251d6a47SWu Fengguang __entry->writeback_index, 693251d6a47SWu Fengguang __entry->nr_to_write, 6945634cc2aSTejun Heo __entry->wrote, 695a664edb3SYang Shi __entry->cgroup_ino 696251d6a47SWu Fengguang ) 697251d6a47SWu Fengguang ); 698251d6a47SWu Fengguang 6999fb0a7daSTejun Heo DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode_start, 7009fb0a7daSTejun Heo TP_PROTO(struct inode *inode, 7019fb0a7daSTejun Heo struct writeback_control *wbc, 7029fb0a7daSTejun Heo unsigned long nr_to_write), 7039fb0a7daSTejun Heo TP_ARGS(inode, wbc, nr_to_write) 7049fb0a7daSTejun Heo ); 7059fb0a7daSTejun Heo 706251d6a47SWu Fengguang DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode, 707251d6a47SWu Fengguang TP_PROTO(struct inode *inode, 708251d6a47SWu Fengguang struct writeback_control *wbc, 709251d6a47SWu Fengguang unsigned long nr_to_write), 710251d6a47SWu Fengguang TP_ARGS(inode, wbc, nr_to_write) 711251d6a47SWu Fengguang ); 712251d6a47SWu Fengguang 7139a46b04fSBrian Foster DECLARE_EVENT_CLASS(writeback_inode_template, 7140ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 7150ae45f63STheodore Ts'o 7160ae45f63STheodore Ts'o TP_ARGS(inode), 7170ae45f63STheodore Ts'o 7180ae45f63STheodore Ts'o TP_STRUCT__entry( 7190ae45f63STheodore Ts'o __field( dev_t, dev ) 7200ae45f63STheodore Ts'o __field(unsigned long, ino ) 7210ae45f63STheodore Ts'o __field(unsigned long, state ) 7220ae45f63STheodore Ts'o __field( __u16, mode ) 7230ae45f63STheodore Ts'o __field(unsigned long, dirtied_when ) 7240ae45f63STheodore Ts'o ), 7250ae45f63STheodore Ts'o 7260ae45f63STheodore Ts'o TP_fast_assign( 7270ae45f63STheodore Ts'o __entry->dev = inode->i_sb->s_dev; 7280ae45f63STheodore Ts'o __entry->ino = inode->i_ino; 7290ae45f63STheodore Ts'o __entry->state = inode->i_state; 7300ae45f63STheodore Ts'o __entry->mode = inode->i_mode; 7310ae45f63STheodore Ts'o __entry->dirtied_when = inode->dirtied_when; 7320ae45f63STheodore Ts'o ), 7330ae45f63STheodore Ts'o 7340ae45f63STheodore Ts'o TP_printk("dev %d,%d ino %lu dirtied %lu state %s mode 0%o", 7350ae45f63STheodore Ts'o MAJOR(__entry->dev), MINOR(__entry->dev), 7360ae45f63STheodore Ts'o __entry->ino, __entry->dirtied_when, 7370ae45f63STheodore Ts'o show_inode_state(__entry->state), __entry->mode) 7380ae45f63STheodore Ts'o ); 7390ae45f63STheodore Ts'o 7409a46b04fSBrian Foster DEFINE_EVENT(writeback_inode_template, writeback_lazytime, 7410ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 7420ae45f63STheodore Ts'o 7430ae45f63STheodore Ts'o TP_ARGS(inode) 7440ae45f63STheodore Ts'o ); 7450ae45f63STheodore Ts'o 7469a46b04fSBrian Foster DEFINE_EVENT(writeback_inode_template, writeback_lazytime_iput, 7470ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 7480ae45f63STheodore Ts'o 7490ae45f63STheodore Ts'o TP_ARGS(inode) 7500ae45f63STheodore Ts'o ); 7510ae45f63STheodore Ts'o 7529a46b04fSBrian Foster DEFINE_EVENT(writeback_inode_template, writeback_dirty_inode_enqueue, 7530ae45f63STheodore Ts'o 7540ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 7550ae45f63STheodore Ts'o 7560ae45f63STheodore Ts'o TP_ARGS(inode) 7570ae45f63STheodore Ts'o ); 7580ae45f63STheodore Ts'o 7599a46b04fSBrian Foster /* 7609a46b04fSBrian Foster * Inode writeback list tracking. 7619a46b04fSBrian Foster */ 7629a46b04fSBrian Foster 7639a46b04fSBrian Foster DEFINE_EVENT(writeback_inode_template, sb_mark_inode_writeback, 7649a46b04fSBrian Foster TP_PROTO(struct inode *inode), 7659a46b04fSBrian Foster TP_ARGS(inode) 7669a46b04fSBrian Foster ); 7679a46b04fSBrian Foster 7689a46b04fSBrian Foster DEFINE_EVENT(writeback_inode_template, sb_clear_inode_writeback, 7699a46b04fSBrian Foster TP_PROTO(struct inode *inode), 7709a46b04fSBrian Foster TP_ARGS(inode) 7719a46b04fSBrian Foster ); 7729a46b04fSBrian Foster 773455b2864SDave Chinner #endif /* _TRACE_WRITEBACK_H */ 774455b2864SDave Chinner 775455b2864SDave Chinner /* This part must be outside protection */ 776455b2864SDave Chinner #include <trace/define_trace.h> 777