1455b2864SDave Chinner #undef TRACE_SYSTEM 2455b2864SDave Chinner #define TRACE_SYSTEM writeback 3455b2864SDave Chinner 4455b2864SDave Chinner #if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) 5455b2864SDave Chinner #define _TRACE_WRITEBACK_H 6455b2864SDave Chinner 7f479447aSSteven Rostedt (Red Hat) #include <linux/tracepoint.h> 8455b2864SDave Chinner #include <linux/backing-dev.h> 9455b2864SDave Chinner #include <linux/writeback.h> 10455b2864SDave Chinner 11251d6a47SWu Fengguang #define show_inode_state(state) \ 12251d6a47SWu Fengguang __print_flags(state, "|", \ 13251d6a47SWu Fengguang {I_DIRTY_SYNC, "I_DIRTY_SYNC"}, \ 14251d6a47SWu Fengguang {I_DIRTY_DATASYNC, "I_DIRTY_DATASYNC"}, \ 15251d6a47SWu Fengguang {I_DIRTY_PAGES, "I_DIRTY_PAGES"}, \ 16251d6a47SWu Fengguang {I_NEW, "I_NEW"}, \ 17251d6a47SWu Fengguang {I_WILL_FREE, "I_WILL_FREE"}, \ 18251d6a47SWu Fengguang {I_FREEING, "I_FREEING"}, \ 19251d6a47SWu Fengguang {I_CLEAR, "I_CLEAR"}, \ 20251d6a47SWu Fengguang {I_SYNC, "I_SYNC"}, \ 210ae45f63STheodore Ts'o {I_DIRTY_TIME, "I_DIRTY_TIME"}, \ 220ae45f63STheodore Ts'o {I_DIRTY_TIME_EXPIRED, "I_DIRTY_TIME_EXPIRED"}, \ 23251d6a47SWu Fengguang {I_REFERENCED, "I_REFERENCED"} \ 24251d6a47SWu Fengguang ) 25251d6a47SWu Fengguang 2691df6089SSteven Rostedt (Red Hat) /* enums need to be exported to user space */ 2791df6089SSteven Rostedt (Red Hat) #undef EM 2891df6089SSteven Rostedt (Red Hat) #undef EMe 2991df6089SSteven Rostedt (Red Hat) #define EM(a,b) TRACE_DEFINE_ENUM(a); 3091df6089SSteven Rostedt (Red Hat) #define EMe(a,b) TRACE_DEFINE_ENUM(a); 3191df6089SSteven Rostedt (Red Hat) 32b3bba872SWu Fengguang #define WB_WORK_REASON \ 3391df6089SSteven Rostedt (Red Hat) EM( WB_REASON_BACKGROUND, "background") \ 3491df6089SSteven Rostedt (Red Hat) EM( WB_REASON_TRY_TO_FREE_PAGES, "try_to_free_pages") \ 3591df6089SSteven Rostedt (Red Hat) EM( WB_REASON_SYNC, "sync") \ 3691df6089SSteven Rostedt (Red Hat) EM( WB_REASON_PERIODIC, "periodic") \ 3791df6089SSteven Rostedt (Red Hat) EM( WB_REASON_LAPTOP_TIMER, "laptop_timer") \ 3891df6089SSteven Rostedt (Red Hat) EM( WB_REASON_FREE_MORE_MEM, "free_more_memory") \ 3991df6089SSteven Rostedt (Red Hat) EM( WB_REASON_FS_FREE_SPACE, "fs_free_space") \ 4091df6089SSteven Rostedt (Red Hat) EMe(WB_REASON_FORKER_THREAD, "forker_thread") 4191df6089SSteven Rostedt (Red Hat) 4291df6089SSteven Rostedt (Red Hat) WB_WORK_REASON 4391df6089SSteven Rostedt (Red Hat) 4491df6089SSteven Rostedt (Red Hat) /* 4591df6089SSteven Rostedt (Red Hat) * Now redefine the EM() and EMe() macros to map the enums to the strings 4691df6089SSteven Rostedt (Red Hat) * that will be printed in the output. 4791df6089SSteven Rostedt (Red Hat) */ 4891df6089SSteven Rostedt (Red Hat) #undef EM 4991df6089SSteven Rostedt (Red Hat) #undef EMe 5091df6089SSteven Rostedt (Red Hat) #define EM(a,b) { a, b }, 5191df6089SSteven Rostedt (Red Hat) #define EMe(a,b) { a, b } 52b3bba872SWu Fengguang 53455b2864SDave Chinner struct wb_writeback_work; 54455b2864SDave Chinner 559fb0a7daSTejun Heo TRACE_EVENT(writeback_dirty_page, 569fb0a7daSTejun Heo 579fb0a7daSTejun Heo TP_PROTO(struct page *page, struct address_space *mapping), 589fb0a7daSTejun Heo 599fb0a7daSTejun Heo TP_ARGS(page, mapping), 609fb0a7daSTejun Heo 619fb0a7daSTejun Heo TP_STRUCT__entry ( 629fb0a7daSTejun Heo __array(char, name, 32) 639fb0a7daSTejun Heo __field(unsigned long, ino) 649fb0a7daSTejun Heo __field(pgoff_t, index) 659fb0a7daSTejun Heo ), 669fb0a7daSTejun Heo 679fb0a7daSTejun Heo TP_fast_assign( 689fb0a7daSTejun Heo strncpy(__entry->name, 69de1414a6SChristoph Hellwig mapping ? dev_name(inode_to_bdi(mapping->host)->dev) : "(unknown)", 32); 709fb0a7daSTejun Heo __entry->ino = mapping ? mapping->host->i_ino : 0; 719fb0a7daSTejun Heo __entry->index = page->index; 729fb0a7daSTejun Heo ), 739fb0a7daSTejun Heo 749fb0a7daSTejun Heo TP_printk("bdi %s: ino=%lu index=%lu", 759fb0a7daSTejun Heo __entry->name, 769fb0a7daSTejun Heo __entry->ino, 779fb0a7daSTejun Heo __entry->index 789fb0a7daSTejun Heo ) 799fb0a7daSTejun Heo ); 809fb0a7daSTejun Heo 819fb0a7daSTejun Heo DECLARE_EVENT_CLASS(writeback_dirty_inode_template, 829fb0a7daSTejun Heo 839fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 849fb0a7daSTejun Heo 859fb0a7daSTejun Heo TP_ARGS(inode, flags), 869fb0a7daSTejun Heo 879fb0a7daSTejun Heo TP_STRUCT__entry ( 889fb0a7daSTejun Heo __array(char, name, 32) 899fb0a7daSTejun Heo __field(unsigned long, ino) 900ae45f63STheodore Ts'o __field(unsigned long, state) 919fb0a7daSTejun Heo __field(unsigned long, flags) 929fb0a7daSTejun Heo ), 939fb0a7daSTejun Heo 949fb0a7daSTejun Heo TP_fast_assign( 95de1414a6SChristoph Hellwig struct backing_dev_info *bdi = inode_to_bdi(inode); 969fb0a7daSTejun Heo 979fb0a7daSTejun Heo /* may be called for files on pseudo FSes w/ unregistered bdi */ 989fb0a7daSTejun Heo strncpy(__entry->name, 999fb0a7daSTejun Heo bdi->dev ? dev_name(bdi->dev) : "(unknown)", 32); 1009fb0a7daSTejun Heo __entry->ino = inode->i_ino; 1010ae45f63STheodore Ts'o __entry->state = inode->i_state; 1029fb0a7daSTejun Heo __entry->flags = flags; 1039fb0a7daSTejun Heo ), 1049fb0a7daSTejun Heo 1050ae45f63STheodore Ts'o TP_printk("bdi %s: ino=%lu state=%s flags=%s", 1069fb0a7daSTejun Heo __entry->name, 1079fb0a7daSTejun Heo __entry->ino, 1080ae45f63STheodore Ts'o show_inode_state(__entry->state), 1099fb0a7daSTejun Heo show_inode_state(__entry->flags) 1109fb0a7daSTejun Heo ) 1119fb0a7daSTejun Heo ); 1129fb0a7daSTejun Heo 1130ae45f63STheodore Ts'o DEFINE_EVENT(writeback_dirty_inode_template, writeback_mark_inode_dirty, 1140ae45f63STheodore Ts'o 1150ae45f63STheodore Ts'o TP_PROTO(struct inode *inode, int flags), 1160ae45f63STheodore Ts'o 1170ae45f63STheodore Ts'o TP_ARGS(inode, flags) 1180ae45f63STheodore Ts'o ); 1190ae45f63STheodore Ts'o 1209fb0a7daSTejun Heo DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode_start, 1219fb0a7daSTejun Heo 1229fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 1239fb0a7daSTejun Heo 1249fb0a7daSTejun Heo TP_ARGS(inode, flags) 1259fb0a7daSTejun Heo ); 1269fb0a7daSTejun Heo 1279fb0a7daSTejun Heo DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode, 1289fb0a7daSTejun Heo 1299fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 1309fb0a7daSTejun Heo 1319fb0a7daSTejun Heo TP_ARGS(inode, flags) 1329fb0a7daSTejun Heo ); 1339fb0a7daSTejun Heo 134*5634cc2aSTejun Heo #ifdef CREATE_TRACE_POINTS 135*5634cc2aSTejun Heo #ifdef CONFIG_CGROUP_WRITEBACK 136*5634cc2aSTejun Heo 137*5634cc2aSTejun Heo static inline size_t __trace_wb_cgroup_size(struct bdi_writeback *wb) 138*5634cc2aSTejun Heo { 139*5634cc2aSTejun Heo return kernfs_path_len(wb->memcg_css->cgroup->kn) + 1; 140*5634cc2aSTejun Heo } 141*5634cc2aSTejun Heo 142*5634cc2aSTejun Heo static inline void __trace_wb_assign_cgroup(char *buf, struct bdi_writeback *wb) 143*5634cc2aSTejun Heo { 144*5634cc2aSTejun Heo struct cgroup *cgrp = wb->memcg_css->cgroup; 145*5634cc2aSTejun Heo char *path; 146*5634cc2aSTejun Heo 147*5634cc2aSTejun Heo path = cgroup_path(cgrp, buf, kernfs_path_len(cgrp->kn) + 1); 148*5634cc2aSTejun Heo WARN_ON_ONCE(path != buf); 149*5634cc2aSTejun Heo } 150*5634cc2aSTejun Heo 151*5634cc2aSTejun Heo static inline size_t __trace_wbc_cgroup_size(struct writeback_control *wbc) 152*5634cc2aSTejun Heo { 153*5634cc2aSTejun Heo if (wbc->wb) 154*5634cc2aSTejun Heo return __trace_wb_cgroup_size(wbc->wb); 155*5634cc2aSTejun Heo else 156*5634cc2aSTejun Heo return 2; 157*5634cc2aSTejun Heo } 158*5634cc2aSTejun Heo 159*5634cc2aSTejun Heo static inline void __trace_wbc_assign_cgroup(char *buf, 160*5634cc2aSTejun Heo struct writeback_control *wbc) 161*5634cc2aSTejun Heo { 162*5634cc2aSTejun Heo if (wbc->wb) 163*5634cc2aSTejun Heo __trace_wb_assign_cgroup(buf, wbc->wb); 164*5634cc2aSTejun Heo else 165*5634cc2aSTejun Heo strcpy(buf, "/"); 166*5634cc2aSTejun Heo } 167*5634cc2aSTejun Heo 168*5634cc2aSTejun Heo #else /* CONFIG_CGROUP_WRITEBACK */ 169*5634cc2aSTejun Heo 170*5634cc2aSTejun Heo static inline size_t __trace_wb_cgroup_size(struct bdi_writeback *wb) 171*5634cc2aSTejun Heo { 172*5634cc2aSTejun Heo return 2; 173*5634cc2aSTejun Heo } 174*5634cc2aSTejun Heo 175*5634cc2aSTejun Heo static inline void __trace_wb_assign_cgroup(char *buf, struct bdi_writeback *wb) 176*5634cc2aSTejun Heo { 177*5634cc2aSTejun Heo strcpy(buf, "/"); 178*5634cc2aSTejun Heo } 179*5634cc2aSTejun Heo 180*5634cc2aSTejun Heo static inline size_t __trace_wbc_cgroup_size(struct writeback_control *wbc) 181*5634cc2aSTejun Heo { 182*5634cc2aSTejun Heo return 2; 183*5634cc2aSTejun Heo } 184*5634cc2aSTejun Heo 185*5634cc2aSTejun Heo static inline void __trace_wbc_assign_cgroup(char *buf, 186*5634cc2aSTejun Heo struct writeback_control *wbc) 187*5634cc2aSTejun Heo { 188*5634cc2aSTejun Heo strcpy(buf, "/"); 189*5634cc2aSTejun Heo } 190*5634cc2aSTejun Heo 191*5634cc2aSTejun Heo #endif /* CONFIG_CGROUP_WRITEBACK */ 192*5634cc2aSTejun Heo #endif /* CREATE_TRACE_POINTS */ 193*5634cc2aSTejun Heo 1949fb0a7daSTejun Heo DECLARE_EVENT_CLASS(writeback_write_inode_template, 1959fb0a7daSTejun Heo 1969fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 1979fb0a7daSTejun Heo 1989fb0a7daSTejun Heo TP_ARGS(inode, wbc), 1999fb0a7daSTejun Heo 2009fb0a7daSTejun Heo TP_STRUCT__entry ( 2019fb0a7daSTejun Heo __array(char, name, 32) 2029fb0a7daSTejun Heo __field(unsigned long, ino) 2039fb0a7daSTejun Heo __field(int, sync_mode) 204*5634cc2aSTejun Heo __dynamic_array(char, cgroup, __trace_wbc_cgroup_size(wbc)) 2059fb0a7daSTejun Heo ), 2069fb0a7daSTejun Heo 2079fb0a7daSTejun Heo TP_fast_assign( 2089fb0a7daSTejun Heo strncpy(__entry->name, 209de1414a6SChristoph Hellwig dev_name(inode_to_bdi(inode)->dev), 32); 2109fb0a7daSTejun Heo __entry->ino = inode->i_ino; 2119fb0a7daSTejun Heo __entry->sync_mode = wbc->sync_mode; 212*5634cc2aSTejun Heo __trace_wbc_assign_cgroup(__get_str(cgroup), wbc); 2139fb0a7daSTejun Heo ), 2149fb0a7daSTejun Heo 215*5634cc2aSTejun Heo TP_printk("bdi %s: ino=%lu sync_mode=%d cgroup=%s", 2169fb0a7daSTejun Heo __entry->name, 2179fb0a7daSTejun Heo __entry->ino, 218*5634cc2aSTejun Heo __entry->sync_mode, 219*5634cc2aSTejun Heo __get_str(cgroup) 2209fb0a7daSTejun Heo ) 2219fb0a7daSTejun Heo ); 2229fb0a7daSTejun Heo 2239fb0a7daSTejun Heo DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode_start, 2249fb0a7daSTejun Heo 2259fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 2269fb0a7daSTejun Heo 2279fb0a7daSTejun Heo TP_ARGS(inode, wbc) 2289fb0a7daSTejun Heo ); 2299fb0a7daSTejun Heo 2309fb0a7daSTejun Heo DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode, 2319fb0a7daSTejun Heo 2329fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 2339fb0a7daSTejun Heo 2349fb0a7daSTejun Heo TP_ARGS(inode, wbc) 2359fb0a7daSTejun Heo ); 2369fb0a7daSTejun Heo 237455b2864SDave Chinner DECLARE_EVENT_CLASS(writeback_work_class, 238*5634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), 239*5634cc2aSTejun Heo TP_ARGS(wb, work), 240455b2864SDave Chinner TP_STRUCT__entry( 241455b2864SDave Chinner __array(char, name, 32) 242455b2864SDave Chinner __field(long, nr_pages) 243455b2864SDave Chinner __field(dev_t, sb_dev) 244455b2864SDave Chinner __field(int, sync_mode) 245455b2864SDave Chinner __field(int, for_kupdate) 246455b2864SDave Chinner __field(int, range_cyclic) 247455b2864SDave Chinner __field(int, for_background) 2480e175a18SCurt Wohlgemuth __field(int, reason) 249*5634cc2aSTejun Heo __dynamic_array(char, cgroup, __trace_wb_cgroup_size(wb)) 250455b2864SDave Chinner ), 251455b2864SDave Chinner TP_fast_assign( 252df0ce26cSChristoph Hellwig strncpy(__entry->name, 253*5634cc2aSTejun Heo wb->bdi->dev ? dev_name(wb->bdi->dev) : "(unknown)", 32); 254455b2864SDave Chinner __entry->nr_pages = work->nr_pages; 255455b2864SDave Chinner __entry->sb_dev = work->sb ? work->sb->s_dev : 0; 256455b2864SDave Chinner __entry->sync_mode = work->sync_mode; 257455b2864SDave Chinner __entry->for_kupdate = work->for_kupdate; 258455b2864SDave Chinner __entry->range_cyclic = work->range_cyclic; 259455b2864SDave Chinner __entry->for_background = work->for_background; 2600e175a18SCurt Wohlgemuth __entry->reason = work->reason; 261*5634cc2aSTejun Heo __trace_wb_assign_cgroup(__get_str(cgroup), wb); 262455b2864SDave Chinner ), 263455b2864SDave Chinner TP_printk("bdi %s: sb_dev %d:%d nr_pages=%ld sync_mode=%d " 264*5634cc2aSTejun Heo "kupdate=%d range_cyclic=%d background=%d reason=%s cgroup=%s", 265455b2864SDave Chinner __entry->name, 266455b2864SDave Chinner MAJOR(__entry->sb_dev), MINOR(__entry->sb_dev), 267455b2864SDave Chinner __entry->nr_pages, 268455b2864SDave Chinner __entry->sync_mode, 269455b2864SDave Chinner __entry->for_kupdate, 270455b2864SDave Chinner __entry->range_cyclic, 2710e175a18SCurt Wohlgemuth __entry->for_background, 272*5634cc2aSTejun Heo __print_symbolic(__entry->reason, WB_WORK_REASON), 273*5634cc2aSTejun Heo __get_str(cgroup) 274455b2864SDave Chinner ) 275455b2864SDave Chinner ); 276455b2864SDave Chinner #define DEFINE_WRITEBACK_WORK_EVENT(name) \ 277455b2864SDave Chinner DEFINE_EVENT(writeback_work_class, name, \ 278*5634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), \ 279*5634cc2aSTejun Heo TP_ARGS(wb, work)) 280455b2864SDave Chinner DEFINE_WRITEBACK_WORK_EVENT(writeback_queue); 281455b2864SDave Chinner DEFINE_WRITEBACK_WORK_EVENT(writeback_exec); 282d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_start); 283d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_written); 284d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_wait); 285455b2864SDave Chinner 286455b2864SDave Chinner TRACE_EVENT(writeback_pages_written, 287455b2864SDave Chinner TP_PROTO(long pages_written), 288455b2864SDave Chinner TP_ARGS(pages_written), 289455b2864SDave Chinner TP_STRUCT__entry( 290455b2864SDave Chinner __field(long, pages) 291455b2864SDave Chinner ), 292455b2864SDave Chinner TP_fast_assign( 293455b2864SDave Chinner __entry->pages = pages_written; 294455b2864SDave Chinner ), 295455b2864SDave Chinner TP_printk("%ld", __entry->pages) 296455b2864SDave Chinner ); 297455b2864SDave Chinner 298455b2864SDave Chinner DECLARE_EVENT_CLASS(writeback_class, 299*5634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb), 300*5634cc2aSTejun Heo TP_ARGS(wb), 301*5634cc2aSTejun Heo TP_STRUCT__entry( 302*5634cc2aSTejun Heo __array(char, name, 32) 303*5634cc2aSTejun Heo __dynamic_array(char, cgroup, __trace_wb_cgroup_size(wb)) 304*5634cc2aSTejun Heo ), 305*5634cc2aSTejun Heo TP_fast_assign( 306*5634cc2aSTejun Heo strncpy(__entry->name, dev_name(wb->bdi->dev), 32); 307*5634cc2aSTejun Heo __trace_wb_assign_cgroup(__get_str(cgroup), wb); 308*5634cc2aSTejun Heo ), 309*5634cc2aSTejun Heo TP_printk("bdi %s: cgroup=%s", 310*5634cc2aSTejun Heo __entry->name, 311*5634cc2aSTejun Heo __get_str(cgroup) 312*5634cc2aSTejun Heo ) 313*5634cc2aSTejun Heo ); 314*5634cc2aSTejun Heo #define DEFINE_WRITEBACK_EVENT(name) \ 315*5634cc2aSTejun Heo DEFINE_EVENT(writeback_class, name, \ 316*5634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb), \ 317*5634cc2aSTejun Heo TP_ARGS(wb)) 318*5634cc2aSTejun Heo 319*5634cc2aSTejun Heo DEFINE_WRITEBACK_EVENT(writeback_nowork); 320*5634cc2aSTejun Heo DEFINE_WRITEBACK_EVENT(writeback_wake_background); 321*5634cc2aSTejun Heo 322*5634cc2aSTejun Heo TRACE_EVENT(writeback_bdi_register, 323455b2864SDave Chinner TP_PROTO(struct backing_dev_info *bdi), 324455b2864SDave Chinner TP_ARGS(bdi), 325455b2864SDave Chinner TP_STRUCT__entry( 326455b2864SDave Chinner __array(char, name, 32) 327455b2864SDave Chinner ), 328455b2864SDave Chinner TP_fast_assign( 329455b2864SDave Chinner strncpy(__entry->name, dev_name(bdi->dev), 32); 330455b2864SDave Chinner ), 331455b2864SDave Chinner TP_printk("bdi %s", 332455b2864SDave Chinner __entry->name 333455b2864SDave Chinner ) 334455b2864SDave Chinner ); 335455b2864SDave Chinner 336028c2dd1SDave Chinner DECLARE_EVENT_CLASS(wbc_class, 337028c2dd1SDave Chinner TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), 338028c2dd1SDave Chinner TP_ARGS(wbc, bdi), 339028c2dd1SDave Chinner TP_STRUCT__entry( 340028c2dd1SDave Chinner __array(char, name, 32) 341028c2dd1SDave Chinner __field(long, nr_to_write) 342028c2dd1SDave Chinner __field(long, pages_skipped) 343028c2dd1SDave Chinner __field(int, sync_mode) 344028c2dd1SDave Chinner __field(int, for_kupdate) 345028c2dd1SDave Chinner __field(int, for_background) 346028c2dd1SDave Chinner __field(int, for_reclaim) 347028c2dd1SDave Chinner __field(int, range_cyclic) 348028c2dd1SDave Chinner __field(long, range_start) 349028c2dd1SDave Chinner __field(long, range_end) 350*5634cc2aSTejun Heo __dynamic_array(char, cgroup, __trace_wbc_cgroup_size(wbc)) 351028c2dd1SDave Chinner ), 352028c2dd1SDave Chinner 353028c2dd1SDave Chinner TP_fast_assign( 354028c2dd1SDave Chinner strncpy(__entry->name, dev_name(bdi->dev), 32); 355028c2dd1SDave Chinner __entry->nr_to_write = wbc->nr_to_write; 356028c2dd1SDave Chinner __entry->pages_skipped = wbc->pages_skipped; 357028c2dd1SDave Chinner __entry->sync_mode = wbc->sync_mode; 358028c2dd1SDave Chinner __entry->for_kupdate = wbc->for_kupdate; 359028c2dd1SDave Chinner __entry->for_background = wbc->for_background; 360028c2dd1SDave Chinner __entry->for_reclaim = wbc->for_reclaim; 361028c2dd1SDave Chinner __entry->range_cyclic = wbc->range_cyclic; 362028c2dd1SDave Chinner __entry->range_start = (long)wbc->range_start; 363028c2dd1SDave Chinner __entry->range_end = (long)wbc->range_end; 364*5634cc2aSTejun Heo __trace_wbc_assign_cgroup(__get_str(cgroup), wbc); 365028c2dd1SDave Chinner ), 366028c2dd1SDave Chinner 367028c2dd1SDave Chinner TP_printk("bdi %s: towrt=%ld skip=%ld mode=%d kupd=%d " 368d46db3d5SWu Fengguang "bgrd=%d reclm=%d cyclic=%d " 369*5634cc2aSTejun Heo "start=0x%lx end=0x%lx cgroup=%s", 370028c2dd1SDave Chinner __entry->name, 371028c2dd1SDave Chinner __entry->nr_to_write, 372028c2dd1SDave Chinner __entry->pages_skipped, 373028c2dd1SDave Chinner __entry->sync_mode, 374028c2dd1SDave Chinner __entry->for_kupdate, 375028c2dd1SDave Chinner __entry->for_background, 376028c2dd1SDave Chinner __entry->for_reclaim, 377028c2dd1SDave Chinner __entry->range_cyclic, 378028c2dd1SDave Chinner __entry->range_start, 379*5634cc2aSTejun Heo __entry->range_end, 380*5634cc2aSTejun Heo __get_str(cgroup) 381*5634cc2aSTejun Heo ) 382028c2dd1SDave Chinner ) 383028c2dd1SDave Chinner 384028c2dd1SDave Chinner #define DEFINE_WBC_EVENT(name) \ 385028c2dd1SDave Chinner DEFINE_EVENT(wbc_class, name, \ 386028c2dd1SDave Chinner TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), \ 387028c2dd1SDave Chinner TP_ARGS(wbc, bdi)) 3889e094383SDave Chinner DEFINE_WBC_EVENT(wbc_writepage); 389028c2dd1SDave Chinner 390e84d0a4fSWu Fengguang TRACE_EVENT(writeback_queue_io, 391e84d0a4fSWu Fengguang TP_PROTO(struct bdi_writeback *wb, 392ad4e38ddSCurt Wohlgemuth struct wb_writeback_work *work, 393e84d0a4fSWu Fengguang int moved), 394ad4e38ddSCurt Wohlgemuth TP_ARGS(wb, work, moved), 395e84d0a4fSWu Fengguang TP_STRUCT__entry( 396e84d0a4fSWu Fengguang __array(char, name, 32) 397e84d0a4fSWu Fengguang __field(unsigned long, older) 398e84d0a4fSWu Fengguang __field(long, age) 399e84d0a4fSWu Fengguang __field(int, moved) 4000e175a18SCurt Wohlgemuth __field(int, reason) 401*5634cc2aSTejun Heo __dynamic_array(char, cgroup, __trace_wb_cgroup_size(wb)) 402e84d0a4fSWu Fengguang ), 403e84d0a4fSWu Fengguang TP_fast_assign( 4040dc83bd3SJan Kara unsigned long *older_than_this = work->older_than_this; 405e84d0a4fSWu Fengguang strncpy(__entry->name, dev_name(wb->bdi->dev), 32); 4060dc83bd3SJan Kara __entry->older = older_than_this ? *older_than_this : 0; 407e84d0a4fSWu Fengguang __entry->age = older_than_this ? 4080dc83bd3SJan Kara (jiffies - *older_than_this) * 1000 / HZ : -1; 409e84d0a4fSWu Fengguang __entry->moved = moved; 4100e175a18SCurt Wohlgemuth __entry->reason = work->reason; 411*5634cc2aSTejun Heo __trace_wb_assign_cgroup(__get_str(cgroup), wb); 412e84d0a4fSWu Fengguang ), 413*5634cc2aSTejun Heo TP_printk("bdi %s: older=%lu age=%ld enqueue=%d reason=%s cgroup=%s", 414e84d0a4fSWu Fengguang __entry->name, 415e84d0a4fSWu Fengguang __entry->older, /* older_than_this in jiffies */ 416e84d0a4fSWu Fengguang __entry->age, /* older_than_this in relative milliseconds */ 4170e175a18SCurt Wohlgemuth __entry->moved, 418*5634cc2aSTejun Heo __print_symbolic(__entry->reason, WB_WORK_REASON), 419*5634cc2aSTejun Heo __get_str(cgroup) 420b3bba872SWu Fengguang ) 421e84d0a4fSWu Fengguang ); 422e84d0a4fSWu Fengguang 423e1cbe236SWu Fengguang TRACE_EVENT(global_dirty_state, 424e1cbe236SWu Fengguang 425e1cbe236SWu Fengguang TP_PROTO(unsigned long background_thresh, 426e1cbe236SWu Fengguang unsigned long dirty_thresh 427e1cbe236SWu Fengguang ), 428e1cbe236SWu Fengguang 429e1cbe236SWu Fengguang TP_ARGS(background_thresh, 430e1cbe236SWu Fengguang dirty_thresh 431e1cbe236SWu Fengguang ), 432e1cbe236SWu Fengguang 433e1cbe236SWu Fengguang TP_STRUCT__entry( 434e1cbe236SWu Fengguang __field(unsigned long, nr_dirty) 435e1cbe236SWu Fengguang __field(unsigned long, nr_writeback) 436e1cbe236SWu Fengguang __field(unsigned long, nr_unstable) 437e1cbe236SWu Fengguang __field(unsigned long, background_thresh) 438e1cbe236SWu Fengguang __field(unsigned long, dirty_thresh) 439e1cbe236SWu Fengguang __field(unsigned long, dirty_limit) 440e1cbe236SWu Fengguang __field(unsigned long, nr_dirtied) 441e1cbe236SWu Fengguang __field(unsigned long, nr_written) 442e1cbe236SWu Fengguang ), 443e1cbe236SWu Fengguang 444e1cbe236SWu Fengguang TP_fast_assign( 445e1cbe236SWu Fengguang __entry->nr_dirty = global_page_state(NR_FILE_DIRTY); 446e1cbe236SWu Fengguang __entry->nr_writeback = global_page_state(NR_WRITEBACK); 447e1cbe236SWu Fengguang __entry->nr_unstable = global_page_state(NR_UNSTABLE_NFS); 448e1cbe236SWu Fengguang __entry->nr_dirtied = global_page_state(NR_DIRTIED); 449e1cbe236SWu Fengguang __entry->nr_written = global_page_state(NR_WRITTEN); 450e1cbe236SWu Fengguang __entry->background_thresh = background_thresh; 451e1cbe236SWu Fengguang __entry->dirty_thresh = dirty_thresh; 452dcc25ae7STejun Heo __entry->dirty_limit = global_wb_domain.dirty_limit; 453e1cbe236SWu Fengguang ), 454e1cbe236SWu Fengguang 455e1cbe236SWu Fengguang TP_printk("dirty=%lu writeback=%lu unstable=%lu " 456e1cbe236SWu Fengguang "bg_thresh=%lu thresh=%lu limit=%lu " 457e1cbe236SWu Fengguang "dirtied=%lu written=%lu", 458e1cbe236SWu Fengguang __entry->nr_dirty, 459e1cbe236SWu Fengguang __entry->nr_writeback, 460e1cbe236SWu Fengguang __entry->nr_unstable, 461e1cbe236SWu Fengguang __entry->background_thresh, 462e1cbe236SWu Fengguang __entry->dirty_thresh, 463e1cbe236SWu Fengguang __entry->dirty_limit, 464e1cbe236SWu Fengguang __entry->nr_dirtied, 465e1cbe236SWu Fengguang __entry->nr_written 466e1cbe236SWu Fengguang ) 467e1cbe236SWu Fengguang ); 468e1cbe236SWu Fengguang 469b48c104dSWu Fengguang #define KBps(x) ((x) << (PAGE_SHIFT - 10)) 470b48c104dSWu Fengguang 471b48c104dSWu Fengguang TRACE_EVENT(bdi_dirty_ratelimit, 472b48c104dSWu Fengguang 473*5634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, 474b48c104dSWu Fengguang unsigned long dirty_rate, 475b48c104dSWu Fengguang unsigned long task_ratelimit), 476b48c104dSWu Fengguang 477*5634cc2aSTejun Heo TP_ARGS(wb, dirty_rate, task_ratelimit), 478b48c104dSWu Fengguang 479b48c104dSWu Fengguang TP_STRUCT__entry( 480b48c104dSWu Fengguang __array(char, bdi, 32) 481b48c104dSWu Fengguang __field(unsigned long, write_bw) 482b48c104dSWu Fengguang __field(unsigned long, avg_write_bw) 483b48c104dSWu Fengguang __field(unsigned long, dirty_rate) 484b48c104dSWu Fengguang __field(unsigned long, dirty_ratelimit) 485b48c104dSWu Fengguang __field(unsigned long, task_ratelimit) 486b48c104dSWu Fengguang __field(unsigned long, balanced_dirty_ratelimit) 487*5634cc2aSTejun Heo __dynamic_array(char, cgroup, __trace_wb_cgroup_size(wb)) 488b48c104dSWu Fengguang ), 489b48c104dSWu Fengguang 490b48c104dSWu Fengguang TP_fast_assign( 491*5634cc2aSTejun Heo strlcpy(__entry->bdi, dev_name(wb->bdi->dev), 32); 492*5634cc2aSTejun Heo __entry->write_bw = KBps(wb->write_bandwidth); 493*5634cc2aSTejun Heo __entry->avg_write_bw = KBps(wb->avg_write_bandwidth); 494b48c104dSWu Fengguang __entry->dirty_rate = KBps(dirty_rate); 495*5634cc2aSTejun Heo __entry->dirty_ratelimit = KBps(wb->dirty_ratelimit); 496b48c104dSWu Fengguang __entry->task_ratelimit = KBps(task_ratelimit); 497b48c104dSWu Fengguang __entry->balanced_dirty_ratelimit = 498*5634cc2aSTejun Heo KBps(wb->balanced_dirty_ratelimit); 499*5634cc2aSTejun Heo __trace_wb_assign_cgroup(__get_str(cgroup), wb); 500b48c104dSWu Fengguang ), 501b48c104dSWu Fengguang 502b48c104dSWu Fengguang TP_printk("bdi %s: " 503b48c104dSWu Fengguang "write_bw=%lu awrite_bw=%lu dirty_rate=%lu " 504b48c104dSWu Fengguang "dirty_ratelimit=%lu task_ratelimit=%lu " 505*5634cc2aSTejun Heo "balanced_dirty_ratelimit=%lu cgroup=%s", 506b48c104dSWu Fengguang __entry->bdi, 507b48c104dSWu Fengguang __entry->write_bw, /* write bandwidth */ 508b48c104dSWu Fengguang __entry->avg_write_bw, /* avg write bandwidth */ 509b48c104dSWu Fengguang __entry->dirty_rate, /* bdi dirty rate */ 510b48c104dSWu Fengguang __entry->dirty_ratelimit, /* base ratelimit */ 511b48c104dSWu Fengguang __entry->task_ratelimit, /* ratelimit with position control */ 512*5634cc2aSTejun Heo __entry->balanced_dirty_ratelimit, /* the balanced ratelimit */ 513*5634cc2aSTejun Heo __get_str(cgroup) 514b48c104dSWu Fengguang ) 515b48c104dSWu Fengguang ); 516b48c104dSWu Fengguang 517ece13ac3SWu Fengguang TRACE_EVENT(balance_dirty_pages, 518ece13ac3SWu Fengguang 519*5634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, 520ece13ac3SWu Fengguang unsigned long thresh, 521ece13ac3SWu Fengguang unsigned long bg_thresh, 522ece13ac3SWu Fengguang unsigned long dirty, 523ece13ac3SWu Fengguang unsigned long bdi_thresh, 524ece13ac3SWu Fengguang unsigned long bdi_dirty, 525ece13ac3SWu Fengguang unsigned long dirty_ratelimit, 526ece13ac3SWu Fengguang unsigned long task_ratelimit, 527ece13ac3SWu Fengguang unsigned long dirtied, 52883712358SWu Fengguang unsigned long period, 529ece13ac3SWu Fengguang long pause, 530ece13ac3SWu Fengguang unsigned long start_time), 531ece13ac3SWu Fengguang 532*5634cc2aSTejun Heo TP_ARGS(wb, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty, 533ece13ac3SWu Fengguang dirty_ratelimit, task_ratelimit, 53483712358SWu Fengguang dirtied, period, pause, start_time), 535ece13ac3SWu Fengguang 536ece13ac3SWu Fengguang TP_STRUCT__entry( 537ece13ac3SWu Fengguang __array( char, bdi, 32) 538ece13ac3SWu Fengguang __field(unsigned long, limit) 539ece13ac3SWu Fengguang __field(unsigned long, setpoint) 540ece13ac3SWu Fengguang __field(unsigned long, dirty) 541ece13ac3SWu Fengguang __field(unsigned long, bdi_setpoint) 542ece13ac3SWu Fengguang __field(unsigned long, bdi_dirty) 543ece13ac3SWu Fengguang __field(unsigned long, dirty_ratelimit) 544ece13ac3SWu Fengguang __field(unsigned long, task_ratelimit) 545ece13ac3SWu Fengguang __field(unsigned int, dirtied) 546ece13ac3SWu Fengguang __field(unsigned int, dirtied_pause) 547ece13ac3SWu Fengguang __field(unsigned long, paused) 548ece13ac3SWu Fengguang __field( long, pause) 54983712358SWu Fengguang __field(unsigned long, period) 55083712358SWu Fengguang __field( long, think) 551*5634cc2aSTejun Heo __dynamic_array(char, cgroup, __trace_wb_cgroup_size(wb)) 552ece13ac3SWu Fengguang ), 553ece13ac3SWu Fengguang 554ece13ac3SWu Fengguang TP_fast_assign( 555ece13ac3SWu Fengguang unsigned long freerun = (thresh + bg_thresh) / 2; 556*5634cc2aSTejun Heo strlcpy(__entry->bdi, dev_name(wb->bdi->dev), 32); 557ece13ac3SWu Fengguang 558dcc25ae7STejun Heo __entry->limit = global_wb_domain.dirty_limit; 559dcc25ae7STejun Heo __entry->setpoint = (global_wb_domain.dirty_limit + 560dcc25ae7STejun Heo freerun) / 2; 561ece13ac3SWu Fengguang __entry->dirty = dirty; 562ece13ac3SWu Fengguang __entry->bdi_setpoint = __entry->setpoint * 563ece13ac3SWu Fengguang bdi_thresh / (thresh + 1); 564ece13ac3SWu Fengguang __entry->bdi_dirty = bdi_dirty; 565ece13ac3SWu Fengguang __entry->dirty_ratelimit = KBps(dirty_ratelimit); 566ece13ac3SWu Fengguang __entry->task_ratelimit = KBps(task_ratelimit); 567ece13ac3SWu Fengguang __entry->dirtied = dirtied; 568ece13ac3SWu Fengguang __entry->dirtied_pause = current->nr_dirtied_pause; 56983712358SWu Fengguang __entry->think = current->dirty_paused_when == 0 ? 0 : 57083712358SWu Fengguang (long)(jiffies - current->dirty_paused_when) * 1000/HZ; 57183712358SWu Fengguang __entry->period = period * 1000 / HZ; 572ece13ac3SWu Fengguang __entry->pause = pause * 1000 / HZ; 573ece13ac3SWu Fengguang __entry->paused = (jiffies - start_time) * 1000 / HZ; 574*5634cc2aSTejun Heo __trace_wb_assign_cgroup(__get_str(cgroup), wb); 575ece13ac3SWu Fengguang ), 576ece13ac3SWu Fengguang 577ece13ac3SWu Fengguang 578ece13ac3SWu Fengguang TP_printk("bdi %s: " 579ece13ac3SWu Fengguang "limit=%lu setpoint=%lu dirty=%lu " 580ece13ac3SWu Fengguang "bdi_setpoint=%lu bdi_dirty=%lu " 581ece13ac3SWu Fengguang "dirty_ratelimit=%lu task_ratelimit=%lu " 582ece13ac3SWu Fengguang "dirtied=%u dirtied_pause=%u " 583*5634cc2aSTejun Heo "paused=%lu pause=%ld period=%lu think=%ld cgroup=%s", 584ece13ac3SWu Fengguang __entry->bdi, 585ece13ac3SWu Fengguang __entry->limit, 586ece13ac3SWu Fengguang __entry->setpoint, 587ece13ac3SWu Fengguang __entry->dirty, 588ece13ac3SWu Fengguang __entry->bdi_setpoint, 589ece13ac3SWu Fengguang __entry->bdi_dirty, 590ece13ac3SWu Fengguang __entry->dirty_ratelimit, 591ece13ac3SWu Fengguang __entry->task_ratelimit, 592ece13ac3SWu Fengguang __entry->dirtied, 593ece13ac3SWu Fengguang __entry->dirtied_pause, 594ece13ac3SWu Fengguang __entry->paused, /* ms */ 59583712358SWu Fengguang __entry->pause, /* ms */ 59683712358SWu Fengguang __entry->period, /* ms */ 597*5634cc2aSTejun Heo __entry->think, /* ms */ 598*5634cc2aSTejun Heo __get_str(cgroup) 599ece13ac3SWu Fengguang ) 600ece13ac3SWu Fengguang ); 601ece13ac3SWu Fengguang 602cc1676d9SJan Kara TRACE_EVENT(writeback_sb_inodes_requeue, 603cc1676d9SJan Kara 604cc1676d9SJan Kara TP_PROTO(struct inode *inode), 605cc1676d9SJan Kara TP_ARGS(inode), 606cc1676d9SJan Kara 607cc1676d9SJan Kara TP_STRUCT__entry( 608cc1676d9SJan Kara __array(char, name, 32) 609cc1676d9SJan Kara __field(unsigned long, ino) 610cc1676d9SJan Kara __field(unsigned long, state) 611cc1676d9SJan Kara __field(unsigned long, dirtied_when) 612*5634cc2aSTejun Heo __dynamic_array(char, cgroup, 613*5634cc2aSTejun Heo __trace_wb_cgroup_size(inode_to_wb(inode))) 614cc1676d9SJan Kara ), 615cc1676d9SJan Kara 616cc1676d9SJan Kara TP_fast_assign( 617cc1676d9SJan Kara strncpy(__entry->name, 618cc1676d9SJan Kara dev_name(inode_to_bdi(inode)->dev), 32); 619cc1676d9SJan Kara __entry->ino = inode->i_ino; 620cc1676d9SJan Kara __entry->state = inode->i_state; 621cc1676d9SJan Kara __entry->dirtied_when = inode->dirtied_when; 622*5634cc2aSTejun Heo __trace_wb_assign_cgroup(__get_str(cgroup), inode_to_wb(inode)); 623cc1676d9SJan Kara ), 624cc1676d9SJan Kara 625*5634cc2aSTejun Heo TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu cgroup=%s", 626cc1676d9SJan Kara __entry->name, 627cc1676d9SJan Kara __entry->ino, 628cc1676d9SJan Kara show_inode_state(__entry->state), 629cc1676d9SJan Kara __entry->dirtied_when, 630*5634cc2aSTejun Heo (jiffies - __entry->dirtied_when) / HZ, 631*5634cc2aSTejun Heo __get_str(cgroup) 632cc1676d9SJan Kara ) 633cc1676d9SJan Kara ); 634cc1676d9SJan Kara 63552bb9198SMel Gorman DECLARE_EVENT_CLASS(writeback_congest_waited_template, 63652bb9198SMel Gorman 63752bb9198SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 63852bb9198SMel Gorman 63952bb9198SMel Gorman TP_ARGS(usec_timeout, usec_delayed), 64052bb9198SMel Gorman 64152bb9198SMel Gorman TP_STRUCT__entry( 64252bb9198SMel Gorman __field( unsigned int, usec_timeout ) 64352bb9198SMel Gorman __field( unsigned int, usec_delayed ) 64452bb9198SMel Gorman ), 64552bb9198SMel Gorman 64652bb9198SMel Gorman TP_fast_assign( 64752bb9198SMel Gorman __entry->usec_timeout = usec_timeout; 64852bb9198SMel Gorman __entry->usec_delayed = usec_delayed; 64952bb9198SMel Gorman ), 65052bb9198SMel Gorman 65152bb9198SMel Gorman TP_printk("usec_timeout=%u usec_delayed=%u", 65252bb9198SMel Gorman __entry->usec_timeout, 65352bb9198SMel Gorman __entry->usec_delayed) 65452bb9198SMel Gorman ); 65552bb9198SMel Gorman 65652bb9198SMel Gorman DEFINE_EVENT(writeback_congest_waited_template, writeback_congestion_wait, 65752bb9198SMel Gorman 65852bb9198SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 65952bb9198SMel Gorman 66052bb9198SMel Gorman TP_ARGS(usec_timeout, usec_delayed) 66152bb9198SMel Gorman ); 66252bb9198SMel Gorman 6630e093d99SMel Gorman DEFINE_EVENT(writeback_congest_waited_template, writeback_wait_iff_congested, 6640e093d99SMel Gorman 6650e093d99SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 6660e093d99SMel Gorman 6670e093d99SMel Gorman TP_ARGS(usec_timeout, usec_delayed) 6680e093d99SMel Gorman ); 6690e093d99SMel Gorman 670251d6a47SWu Fengguang DECLARE_EVENT_CLASS(writeback_single_inode_template, 671251d6a47SWu Fengguang 672251d6a47SWu Fengguang TP_PROTO(struct inode *inode, 673251d6a47SWu Fengguang struct writeback_control *wbc, 674251d6a47SWu Fengguang unsigned long nr_to_write 675251d6a47SWu Fengguang ), 676251d6a47SWu Fengguang 677251d6a47SWu Fengguang TP_ARGS(inode, wbc, nr_to_write), 678251d6a47SWu Fengguang 679251d6a47SWu Fengguang TP_STRUCT__entry( 680251d6a47SWu Fengguang __array(char, name, 32) 681251d6a47SWu Fengguang __field(unsigned long, ino) 682251d6a47SWu Fengguang __field(unsigned long, state) 683c8ad6206SWu Fengguang __field(unsigned long, dirtied_when) 684251d6a47SWu Fengguang __field(unsigned long, writeback_index) 685251d6a47SWu Fengguang __field(long, nr_to_write) 686251d6a47SWu Fengguang __field(unsigned long, wrote) 687*5634cc2aSTejun Heo __dynamic_array(char, cgroup, __trace_wbc_cgroup_size(wbc)) 688251d6a47SWu Fengguang ), 689251d6a47SWu Fengguang 690251d6a47SWu Fengguang TP_fast_assign( 691251d6a47SWu Fengguang strncpy(__entry->name, 69215eb77a0SWu Fengguang dev_name(inode_to_bdi(inode)->dev), 32); 693251d6a47SWu Fengguang __entry->ino = inode->i_ino; 694251d6a47SWu Fengguang __entry->state = inode->i_state; 695c8ad6206SWu Fengguang __entry->dirtied_when = inode->dirtied_when; 696251d6a47SWu Fengguang __entry->writeback_index = inode->i_mapping->writeback_index; 697251d6a47SWu Fengguang __entry->nr_to_write = nr_to_write; 698251d6a47SWu Fengguang __entry->wrote = nr_to_write - wbc->nr_to_write; 699*5634cc2aSTejun Heo __trace_wbc_assign_cgroup(__get_str(cgroup), wbc); 700251d6a47SWu Fengguang ), 701251d6a47SWu Fengguang 702c8ad6206SWu Fengguang TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu " 703*5634cc2aSTejun Heo "index=%lu to_write=%ld wrote=%lu cgroup=%s", 704251d6a47SWu Fengguang __entry->name, 705251d6a47SWu Fengguang __entry->ino, 706251d6a47SWu Fengguang show_inode_state(__entry->state), 707c8ad6206SWu Fengguang __entry->dirtied_when, 708c8ad6206SWu Fengguang (jiffies - __entry->dirtied_when) / HZ, 709251d6a47SWu Fengguang __entry->writeback_index, 710251d6a47SWu Fengguang __entry->nr_to_write, 711*5634cc2aSTejun Heo __entry->wrote, 712*5634cc2aSTejun Heo __get_str(cgroup) 713251d6a47SWu Fengguang ) 714251d6a47SWu Fengguang ); 715251d6a47SWu Fengguang 7169fb0a7daSTejun Heo DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode_start, 7179fb0a7daSTejun Heo TP_PROTO(struct inode *inode, 7189fb0a7daSTejun Heo struct writeback_control *wbc, 7199fb0a7daSTejun Heo unsigned long nr_to_write), 7209fb0a7daSTejun Heo TP_ARGS(inode, wbc, nr_to_write) 7219fb0a7daSTejun Heo ); 7229fb0a7daSTejun Heo 723251d6a47SWu Fengguang DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode, 724251d6a47SWu Fengguang TP_PROTO(struct inode *inode, 725251d6a47SWu Fengguang struct writeback_control *wbc, 726251d6a47SWu Fengguang unsigned long nr_to_write), 727251d6a47SWu Fengguang TP_ARGS(inode, wbc, nr_to_write) 728251d6a47SWu Fengguang ); 729251d6a47SWu Fengguang 7300ae45f63STheodore Ts'o DECLARE_EVENT_CLASS(writeback_lazytime_template, 7310ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 7320ae45f63STheodore Ts'o 7330ae45f63STheodore Ts'o TP_ARGS(inode), 7340ae45f63STheodore Ts'o 7350ae45f63STheodore Ts'o TP_STRUCT__entry( 7360ae45f63STheodore Ts'o __field( dev_t, dev ) 7370ae45f63STheodore Ts'o __field(unsigned long, ino ) 7380ae45f63STheodore Ts'o __field(unsigned long, state ) 7390ae45f63STheodore Ts'o __field( __u16, mode ) 7400ae45f63STheodore Ts'o __field(unsigned long, dirtied_when ) 7410ae45f63STheodore Ts'o ), 7420ae45f63STheodore Ts'o 7430ae45f63STheodore Ts'o TP_fast_assign( 7440ae45f63STheodore Ts'o __entry->dev = inode->i_sb->s_dev; 7450ae45f63STheodore Ts'o __entry->ino = inode->i_ino; 7460ae45f63STheodore Ts'o __entry->state = inode->i_state; 7470ae45f63STheodore Ts'o __entry->mode = inode->i_mode; 7480ae45f63STheodore Ts'o __entry->dirtied_when = inode->dirtied_when; 7490ae45f63STheodore Ts'o ), 7500ae45f63STheodore Ts'o 7510ae45f63STheodore Ts'o TP_printk("dev %d,%d ino %lu dirtied %lu state %s mode 0%o", 7520ae45f63STheodore Ts'o MAJOR(__entry->dev), MINOR(__entry->dev), 7530ae45f63STheodore Ts'o __entry->ino, __entry->dirtied_when, 7540ae45f63STheodore Ts'o show_inode_state(__entry->state), __entry->mode) 7550ae45f63STheodore Ts'o ); 7560ae45f63STheodore Ts'o 7570ae45f63STheodore Ts'o DEFINE_EVENT(writeback_lazytime_template, writeback_lazytime, 7580ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 7590ae45f63STheodore Ts'o 7600ae45f63STheodore Ts'o TP_ARGS(inode) 7610ae45f63STheodore Ts'o ); 7620ae45f63STheodore Ts'o 7630ae45f63STheodore Ts'o DEFINE_EVENT(writeback_lazytime_template, writeback_lazytime_iput, 7640ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 7650ae45f63STheodore Ts'o 7660ae45f63STheodore Ts'o TP_ARGS(inode) 7670ae45f63STheodore Ts'o ); 7680ae45f63STheodore Ts'o 7690ae45f63STheodore Ts'o DEFINE_EVENT(writeback_lazytime_template, writeback_dirty_inode_enqueue, 7700ae45f63STheodore Ts'o 7710ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 7720ae45f63STheodore Ts'o 7730ae45f63STheodore Ts'o TP_ARGS(inode) 7740ae45f63STheodore Ts'o ); 7750ae45f63STheodore Ts'o 776455b2864SDave Chinner #endif /* _TRACE_WRITEBACK_H */ 777455b2864SDave Chinner 778455b2864SDave Chinner /* This part must be outside protection */ 779455b2864SDave Chinner #include <trace/define_trace.h> 780