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"}, \ 21*0ae45f63STheodore Ts'o {I_DIRTY_TIME, "I_DIRTY_TIME"}, \ 22*0ae45f63STheodore Ts'o {I_DIRTY_TIME_EXPIRED, "I_DIRTY_TIME_EXPIRED"}, \ 23251d6a47SWu Fengguang {I_REFERENCED, "I_REFERENCED"} \ 24251d6a47SWu Fengguang ) 25251d6a47SWu Fengguang 26b3bba872SWu Fengguang #define WB_WORK_REASON \ 27b3bba872SWu Fengguang {WB_REASON_BACKGROUND, "background"}, \ 28b3bba872SWu Fengguang {WB_REASON_TRY_TO_FREE_PAGES, "try_to_free_pages"}, \ 29b3bba872SWu Fengguang {WB_REASON_SYNC, "sync"}, \ 30b3bba872SWu Fengguang {WB_REASON_PERIODIC, "periodic"}, \ 31b3bba872SWu Fengguang {WB_REASON_LAPTOP_TIMER, "laptop_timer"}, \ 32b3bba872SWu Fengguang {WB_REASON_FREE_MORE_MEM, "free_more_memory"}, \ 33b3bba872SWu Fengguang {WB_REASON_FS_FREE_SPACE, "fs_free_space"}, \ 34b3bba872SWu Fengguang {WB_REASON_FORKER_THREAD, "forker_thread"} 35b3bba872SWu Fengguang 36455b2864SDave Chinner struct wb_writeback_work; 37455b2864SDave Chinner 389fb0a7daSTejun Heo TRACE_EVENT(writeback_dirty_page, 399fb0a7daSTejun Heo 409fb0a7daSTejun Heo TP_PROTO(struct page *page, struct address_space *mapping), 419fb0a7daSTejun Heo 429fb0a7daSTejun Heo TP_ARGS(page, mapping), 439fb0a7daSTejun Heo 449fb0a7daSTejun Heo TP_STRUCT__entry ( 459fb0a7daSTejun Heo __array(char, name, 32) 469fb0a7daSTejun Heo __field(unsigned long, ino) 479fb0a7daSTejun Heo __field(pgoff_t, index) 489fb0a7daSTejun Heo ), 499fb0a7daSTejun Heo 509fb0a7daSTejun Heo TP_fast_assign( 519fb0a7daSTejun Heo strncpy(__entry->name, 529fb0a7daSTejun Heo mapping ? dev_name(mapping->backing_dev_info->dev) : "(unknown)", 32); 539fb0a7daSTejun Heo __entry->ino = mapping ? mapping->host->i_ino : 0; 549fb0a7daSTejun Heo __entry->index = page->index; 559fb0a7daSTejun Heo ), 569fb0a7daSTejun Heo 579fb0a7daSTejun Heo TP_printk("bdi %s: ino=%lu index=%lu", 589fb0a7daSTejun Heo __entry->name, 599fb0a7daSTejun Heo __entry->ino, 609fb0a7daSTejun Heo __entry->index 619fb0a7daSTejun Heo ) 629fb0a7daSTejun Heo ); 639fb0a7daSTejun Heo 649fb0a7daSTejun Heo DECLARE_EVENT_CLASS(writeback_dirty_inode_template, 659fb0a7daSTejun Heo 669fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 679fb0a7daSTejun Heo 689fb0a7daSTejun Heo TP_ARGS(inode, flags), 699fb0a7daSTejun Heo 709fb0a7daSTejun Heo TP_STRUCT__entry ( 719fb0a7daSTejun Heo __array(char, name, 32) 729fb0a7daSTejun Heo __field(unsigned long, ino) 73*0ae45f63STheodore Ts'o __field(unsigned long, state) 749fb0a7daSTejun Heo __field(unsigned long, flags) 759fb0a7daSTejun Heo ), 769fb0a7daSTejun Heo 779fb0a7daSTejun Heo TP_fast_assign( 789fb0a7daSTejun Heo struct backing_dev_info *bdi = inode->i_mapping->backing_dev_info; 799fb0a7daSTejun Heo 809fb0a7daSTejun Heo /* may be called for files on pseudo FSes w/ unregistered bdi */ 819fb0a7daSTejun Heo strncpy(__entry->name, 829fb0a7daSTejun Heo bdi->dev ? dev_name(bdi->dev) : "(unknown)", 32); 839fb0a7daSTejun Heo __entry->ino = inode->i_ino; 84*0ae45f63STheodore Ts'o __entry->state = inode->i_state; 859fb0a7daSTejun Heo __entry->flags = flags; 869fb0a7daSTejun Heo ), 879fb0a7daSTejun Heo 88*0ae45f63STheodore Ts'o TP_printk("bdi %s: ino=%lu state=%s flags=%s", 899fb0a7daSTejun Heo __entry->name, 909fb0a7daSTejun Heo __entry->ino, 91*0ae45f63STheodore Ts'o show_inode_state(__entry->state), 929fb0a7daSTejun Heo show_inode_state(__entry->flags) 939fb0a7daSTejun Heo ) 949fb0a7daSTejun Heo ); 959fb0a7daSTejun Heo 96*0ae45f63STheodore Ts'o DEFINE_EVENT(writeback_dirty_inode_template, writeback_mark_inode_dirty, 97*0ae45f63STheodore Ts'o 98*0ae45f63STheodore Ts'o TP_PROTO(struct inode *inode, int flags), 99*0ae45f63STheodore Ts'o 100*0ae45f63STheodore Ts'o TP_ARGS(inode, flags) 101*0ae45f63STheodore Ts'o ); 102*0ae45f63STheodore Ts'o 1039fb0a7daSTejun Heo DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode_start, 1049fb0a7daSTejun Heo 1059fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 1069fb0a7daSTejun Heo 1079fb0a7daSTejun Heo TP_ARGS(inode, flags) 1089fb0a7daSTejun Heo ); 1099fb0a7daSTejun Heo 1109fb0a7daSTejun Heo DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode, 1119fb0a7daSTejun Heo 1129fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 1139fb0a7daSTejun Heo 1149fb0a7daSTejun Heo TP_ARGS(inode, flags) 1159fb0a7daSTejun Heo ); 1169fb0a7daSTejun Heo 1179fb0a7daSTejun Heo DECLARE_EVENT_CLASS(writeback_write_inode_template, 1189fb0a7daSTejun Heo 1199fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 1209fb0a7daSTejun Heo 1219fb0a7daSTejun Heo TP_ARGS(inode, wbc), 1229fb0a7daSTejun Heo 1239fb0a7daSTejun Heo TP_STRUCT__entry ( 1249fb0a7daSTejun Heo __array(char, name, 32) 1259fb0a7daSTejun Heo __field(unsigned long, ino) 1269fb0a7daSTejun Heo __field(int, sync_mode) 1279fb0a7daSTejun Heo ), 1289fb0a7daSTejun Heo 1299fb0a7daSTejun Heo TP_fast_assign( 1309fb0a7daSTejun Heo strncpy(__entry->name, 1319fb0a7daSTejun Heo dev_name(inode->i_mapping->backing_dev_info->dev), 32); 1329fb0a7daSTejun Heo __entry->ino = inode->i_ino; 1339fb0a7daSTejun Heo __entry->sync_mode = wbc->sync_mode; 1349fb0a7daSTejun Heo ), 1359fb0a7daSTejun Heo 1369fb0a7daSTejun Heo TP_printk("bdi %s: ino=%lu sync_mode=%d", 1379fb0a7daSTejun Heo __entry->name, 1389fb0a7daSTejun Heo __entry->ino, 1399fb0a7daSTejun Heo __entry->sync_mode 1409fb0a7daSTejun Heo ) 1419fb0a7daSTejun Heo ); 1429fb0a7daSTejun Heo 1439fb0a7daSTejun Heo DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode_start, 1449fb0a7daSTejun Heo 1459fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 1469fb0a7daSTejun Heo 1479fb0a7daSTejun Heo TP_ARGS(inode, wbc) 1489fb0a7daSTejun Heo ); 1499fb0a7daSTejun Heo 1509fb0a7daSTejun Heo DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode, 1519fb0a7daSTejun Heo 1529fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 1539fb0a7daSTejun Heo 1549fb0a7daSTejun Heo TP_ARGS(inode, wbc) 1559fb0a7daSTejun Heo ); 1569fb0a7daSTejun Heo 157455b2864SDave Chinner DECLARE_EVENT_CLASS(writeback_work_class, 158455b2864SDave Chinner TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work), 159455b2864SDave Chinner TP_ARGS(bdi, work), 160455b2864SDave Chinner TP_STRUCT__entry( 161455b2864SDave Chinner __array(char, name, 32) 162455b2864SDave Chinner __field(long, nr_pages) 163455b2864SDave Chinner __field(dev_t, sb_dev) 164455b2864SDave Chinner __field(int, sync_mode) 165455b2864SDave Chinner __field(int, for_kupdate) 166455b2864SDave Chinner __field(int, range_cyclic) 167455b2864SDave Chinner __field(int, for_background) 1680e175a18SCurt Wohlgemuth __field(int, reason) 169455b2864SDave Chinner ), 170455b2864SDave Chinner TP_fast_assign( 171977b7e3aSWu Fengguang struct device *dev = bdi->dev; 172977b7e3aSWu Fengguang if (!dev) 173977b7e3aSWu Fengguang dev = default_backing_dev_info.dev; 174977b7e3aSWu Fengguang strncpy(__entry->name, dev_name(dev), 32); 175455b2864SDave Chinner __entry->nr_pages = work->nr_pages; 176455b2864SDave Chinner __entry->sb_dev = work->sb ? work->sb->s_dev : 0; 177455b2864SDave Chinner __entry->sync_mode = work->sync_mode; 178455b2864SDave Chinner __entry->for_kupdate = work->for_kupdate; 179455b2864SDave Chinner __entry->range_cyclic = work->range_cyclic; 180455b2864SDave Chinner __entry->for_background = work->for_background; 1810e175a18SCurt Wohlgemuth __entry->reason = work->reason; 182455b2864SDave Chinner ), 183455b2864SDave Chinner TP_printk("bdi %s: sb_dev %d:%d nr_pages=%ld sync_mode=%d " 1840e175a18SCurt Wohlgemuth "kupdate=%d range_cyclic=%d background=%d reason=%s", 185455b2864SDave Chinner __entry->name, 186455b2864SDave Chinner MAJOR(__entry->sb_dev), MINOR(__entry->sb_dev), 187455b2864SDave Chinner __entry->nr_pages, 188455b2864SDave Chinner __entry->sync_mode, 189455b2864SDave Chinner __entry->for_kupdate, 190455b2864SDave Chinner __entry->range_cyclic, 1910e175a18SCurt Wohlgemuth __entry->for_background, 192b3bba872SWu Fengguang __print_symbolic(__entry->reason, WB_WORK_REASON) 193455b2864SDave Chinner ) 194455b2864SDave Chinner ); 195455b2864SDave Chinner #define DEFINE_WRITEBACK_WORK_EVENT(name) \ 196455b2864SDave Chinner DEFINE_EVENT(writeback_work_class, name, \ 197455b2864SDave Chinner TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work), \ 198455b2864SDave Chinner TP_ARGS(bdi, work)) 199455b2864SDave Chinner DEFINE_WRITEBACK_WORK_EVENT(writeback_queue); 200455b2864SDave Chinner DEFINE_WRITEBACK_WORK_EVENT(writeback_exec); 201d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_start); 202d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_written); 203d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_wait); 204455b2864SDave Chinner 205455b2864SDave Chinner TRACE_EVENT(writeback_pages_written, 206455b2864SDave Chinner TP_PROTO(long pages_written), 207455b2864SDave Chinner TP_ARGS(pages_written), 208455b2864SDave Chinner TP_STRUCT__entry( 209455b2864SDave Chinner __field(long, pages) 210455b2864SDave Chinner ), 211455b2864SDave Chinner TP_fast_assign( 212455b2864SDave Chinner __entry->pages = pages_written; 213455b2864SDave Chinner ), 214455b2864SDave Chinner TP_printk("%ld", __entry->pages) 215455b2864SDave Chinner ); 216455b2864SDave Chinner 217455b2864SDave Chinner DECLARE_EVENT_CLASS(writeback_class, 218455b2864SDave Chinner TP_PROTO(struct backing_dev_info *bdi), 219455b2864SDave Chinner TP_ARGS(bdi), 220455b2864SDave Chinner TP_STRUCT__entry( 221455b2864SDave Chinner __array(char, name, 32) 222455b2864SDave Chinner ), 223455b2864SDave Chinner TP_fast_assign( 224455b2864SDave Chinner strncpy(__entry->name, dev_name(bdi->dev), 32); 225455b2864SDave Chinner ), 226455b2864SDave Chinner TP_printk("bdi %s", 227455b2864SDave Chinner __entry->name 228455b2864SDave Chinner ) 229455b2864SDave Chinner ); 230455b2864SDave Chinner #define DEFINE_WRITEBACK_EVENT(name) \ 231455b2864SDave Chinner DEFINE_EVENT(writeback_class, name, \ 232455b2864SDave Chinner TP_PROTO(struct backing_dev_info *bdi), \ 233455b2864SDave Chinner TP_ARGS(bdi)) 234455b2864SDave Chinner 235455b2864SDave Chinner DEFINE_WRITEBACK_EVENT(writeback_nowork); 23671927e84SWu Fengguang DEFINE_WRITEBACK_EVENT(writeback_wake_background); 237455b2864SDave Chinner DEFINE_WRITEBACK_EVENT(writeback_bdi_register); 238455b2864SDave Chinner DEFINE_WRITEBACK_EVENT(writeback_bdi_unregister); 239455b2864SDave Chinner 240028c2dd1SDave Chinner DECLARE_EVENT_CLASS(wbc_class, 241028c2dd1SDave Chinner TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), 242028c2dd1SDave Chinner TP_ARGS(wbc, bdi), 243028c2dd1SDave Chinner TP_STRUCT__entry( 244028c2dd1SDave Chinner __array(char, name, 32) 245028c2dd1SDave Chinner __field(long, nr_to_write) 246028c2dd1SDave Chinner __field(long, pages_skipped) 247028c2dd1SDave Chinner __field(int, sync_mode) 248028c2dd1SDave Chinner __field(int, for_kupdate) 249028c2dd1SDave Chinner __field(int, for_background) 250028c2dd1SDave Chinner __field(int, for_reclaim) 251028c2dd1SDave Chinner __field(int, range_cyclic) 252028c2dd1SDave Chinner __field(long, range_start) 253028c2dd1SDave Chinner __field(long, range_end) 254028c2dd1SDave Chinner ), 255028c2dd1SDave Chinner 256028c2dd1SDave Chinner TP_fast_assign( 257028c2dd1SDave Chinner strncpy(__entry->name, dev_name(bdi->dev), 32); 258028c2dd1SDave Chinner __entry->nr_to_write = wbc->nr_to_write; 259028c2dd1SDave Chinner __entry->pages_skipped = wbc->pages_skipped; 260028c2dd1SDave Chinner __entry->sync_mode = wbc->sync_mode; 261028c2dd1SDave Chinner __entry->for_kupdate = wbc->for_kupdate; 262028c2dd1SDave Chinner __entry->for_background = wbc->for_background; 263028c2dd1SDave Chinner __entry->for_reclaim = wbc->for_reclaim; 264028c2dd1SDave Chinner __entry->range_cyclic = wbc->range_cyclic; 265028c2dd1SDave Chinner __entry->range_start = (long)wbc->range_start; 266028c2dd1SDave Chinner __entry->range_end = (long)wbc->range_end; 267028c2dd1SDave Chinner ), 268028c2dd1SDave Chinner 269028c2dd1SDave Chinner TP_printk("bdi %s: towrt=%ld skip=%ld mode=%d kupd=%d " 270d46db3d5SWu Fengguang "bgrd=%d reclm=%d cyclic=%d " 271028c2dd1SDave Chinner "start=0x%lx end=0x%lx", 272028c2dd1SDave Chinner __entry->name, 273028c2dd1SDave Chinner __entry->nr_to_write, 274028c2dd1SDave Chinner __entry->pages_skipped, 275028c2dd1SDave Chinner __entry->sync_mode, 276028c2dd1SDave Chinner __entry->for_kupdate, 277028c2dd1SDave Chinner __entry->for_background, 278028c2dd1SDave Chinner __entry->for_reclaim, 279028c2dd1SDave Chinner __entry->range_cyclic, 280028c2dd1SDave Chinner __entry->range_start, 281028c2dd1SDave Chinner __entry->range_end) 282028c2dd1SDave Chinner ) 283028c2dd1SDave Chinner 284028c2dd1SDave Chinner #define DEFINE_WBC_EVENT(name) \ 285028c2dd1SDave Chinner DEFINE_EVENT(wbc_class, name, \ 286028c2dd1SDave Chinner TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), \ 287028c2dd1SDave Chinner TP_ARGS(wbc, bdi)) 2889e094383SDave Chinner DEFINE_WBC_EVENT(wbc_writepage); 289028c2dd1SDave Chinner 290e84d0a4fSWu Fengguang TRACE_EVENT(writeback_queue_io, 291e84d0a4fSWu Fengguang TP_PROTO(struct bdi_writeback *wb, 292ad4e38ddSCurt Wohlgemuth struct wb_writeback_work *work, 293e84d0a4fSWu Fengguang int moved), 294ad4e38ddSCurt Wohlgemuth TP_ARGS(wb, work, moved), 295e84d0a4fSWu Fengguang TP_STRUCT__entry( 296e84d0a4fSWu Fengguang __array(char, name, 32) 297e84d0a4fSWu Fengguang __field(unsigned long, older) 298e84d0a4fSWu Fengguang __field(long, age) 299e84d0a4fSWu Fengguang __field(int, moved) 3000e175a18SCurt Wohlgemuth __field(int, reason) 301e84d0a4fSWu Fengguang ), 302e84d0a4fSWu Fengguang TP_fast_assign( 3030dc83bd3SJan Kara unsigned long *older_than_this = work->older_than_this; 304e84d0a4fSWu Fengguang strncpy(__entry->name, dev_name(wb->bdi->dev), 32); 3050dc83bd3SJan Kara __entry->older = older_than_this ? *older_than_this : 0; 306e84d0a4fSWu Fengguang __entry->age = older_than_this ? 3070dc83bd3SJan Kara (jiffies - *older_than_this) * 1000 / HZ : -1; 308e84d0a4fSWu Fengguang __entry->moved = moved; 3090e175a18SCurt Wohlgemuth __entry->reason = work->reason; 310e84d0a4fSWu Fengguang ), 3110e175a18SCurt Wohlgemuth TP_printk("bdi %s: older=%lu age=%ld enqueue=%d reason=%s", 312e84d0a4fSWu Fengguang __entry->name, 313e84d0a4fSWu Fengguang __entry->older, /* older_than_this in jiffies */ 314e84d0a4fSWu Fengguang __entry->age, /* older_than_this in relative milliseconds */ 3150e175a18SCurt Wohlgemuth __entry->moved, 316b3bba872SWu Fengguang __print_symbolic(__entry->reason, WB_WORK_REASON) 317b3bba872SWu Fengguang ) 318e84d0a4fSWu Fengguang ); 319e84d0a4fSWu Fengguang 320e1cbe236SWu Fengguang TRACE_EVENT(global_dirty_state, 321e1cbe236SWu Fengguang 322e1cbe236SWu Fengguang TP_PROTO(unsigned long background_thresh, 323e1cbe236SWu Fengguang unsigned long dirty_thresh 324e1cbe236SWu Fengguang ), 325e1cbe236SWu Fengguang 326e1cbe236SWu Fengguang TP_ARGS(background_thresh, 327e1cbe236SWu Fengguang dirty_thresh 328e1cbe236SWu Fengguang ), 329e1cbe236SWu Fengguang 330e1cbe236SWu Fengguang TP_STRUCT__entry( 331e1cbe236SWu Fengguang __field(unsigned long, nr_dirty) 332e1cbe236SWu Fengguang __field(unsigned long, nr_writeback) 333e1cbe236SWu Fengguang __field(unsigned long, nr_unstable) 334e1cbe236SWu Fengguang __field(unsigned long, background_thresh) 335e1cbe236SWu Fengguang __field(unsigned long, dirty_thresh) 336e1cbe236SWu Fengguang __field(unsigned long, dirty_limit) 337e1cbe236SWu Fengguang __field(unsigned long, nr_dirtied) 338e1cbe236SWu Fengguang __field(unsigned long, nr_written) 339e1cbe236SWu Fengguang ), 340e1cbe236SWu Fengguang 341e1cbe236SWu Fengguang TP_fast_assign( 342e1cbe236SWu Fengguang __entry->nr_dirty = global_page_state(NR_FILE_DIRTY); 343e1cbe236SWu Fengguang __entry->nr_writeback = global_page_state(NR_WRITEBACK); 344e1cbe236SWu Fengguang __entry->nr_unstable = global_page_state(NR_UNSTABLE_NFS); 345e1cbe236SWu Fengguang __entry->nr_dirtied = global_page_state(NR_DIRTIED); 346e1cbe236SWu Fengguang __entry->nr_written = global_page_state(NR_WRITTEN); 347e1cbe236SWu Fengguang __entry->background_thresh = background_thresh; 348e1cbe236SWu Fengguang __entry->dirty_thresh = dirty_thresh; 349e1cbe236SWu Fengguang __entry->dirty_limit = global_dirty_limit; 350e1cbe236SWu Fengguang ), 351e1cbe236SWu Fengguang 352e1cbe236SWu Fengguang TP_printk("dirty=%lu writeback=%lu unstable=%lu " 353e1cbe236SWu Fengguang "bg_thresh=%lu thresh=%lu limit=%lu " 354e1cbe236SWu Fengguang "dirtied=%lu written=%lu", 355e1cbe236SWu Fengguang __entry->nr_dirty, 356e1cbe236SWu Fengguang __entry->nr_writeback, 357e1cbe236SWu Fengguang __entry->nr_unstable, 358e1cbe236SWu Fengguang __entry->background_thresh, 359e1cbe236SWu Fengguang __entry->dirty_thresh, 360e1cbe236SWu Fengguang __entry->dirty_limit, 361e1cbe236SWu Fengguang __entry->nr_dirtied, 362e1cbe236SWu Fengguang __entry->nr_written 363e1cbe236SWu Fengguang ) 364e1cbe236SWu Fengguang ); 365e1cbe236SWu Fengguang 366b48c104dSWu Fengguang #define KBps(x) ((x) << (PAGE_SHIFT - 10)) 367b48c104dSWu Fengguang 368b48c104dSWu Fengguang TRACE_EVENT(bdi_dirty_ratelimit, 369b48c104dSWu Fengguang 370b48c104dSWu Fengguang TP_PROTO(struct backing_dev_info *bdi, 371b48c104dSWu Fengguang unsigned long dirty_rate, 372b48c104dSWu Fengguang unsigned long task_ratelimit), 373b48c104dSWu Fengguang 374b48c104dSWu Fengguang TP_ARGS(bdi, dirty_rate, task_ratelimit), 375b48c104dSWu Fengguang 376b48c104dSWu Fengguang TP_STRUCT__entry( 377b48c104dSWu Fengguang __array(char, bdi, 32) 378b48c104dSWu Fengguang __field(unsigned long, write_bw) 379b48c104dSWu Fengguang __field(unsigned long, avg_write_bw) 380b48c104dSWu Fengguang __field(unsigned long, dirty_rate) 381b48c104dSWu Fengguang __field(unsigned long, dirty_ratelimit) 382b48c104dSWu Fengguang __field(unsigned long, task_ratelimit) 383b48c104dSWu Fengguang __field(unsigned long, balanced_dirty_ratelimit) 384b48c104dSWu Fengguang ), 385b48c104dSWu Fengguang 386b48c104dSWu Fengguang TP_fast_assign( 387b48c104dSWu Fengguang strlcpy(__entry->bdi, dev_name(bdi->dev), 32); 388b48c104dSWu Fengguang __entry->write_bw = KBps(bdi->write_bandwidth); 389b48c104dSWu Fengguang __entry->avg_write_bw = KBps(bdi->avg_write_bandwidth); 390b48c104dSWu Fengguang __entry->dirty_rate = KBps(dirty_rate); 391b48c104dSWu Fengguang __entry->dirty_ratelimit = KBps(bdi->dirty_ratelimit); 392b48c104dSWu Fengguang __entry->task_ratelimit = KBps(task_ratelimit); 393b48c104dSWu Fengguang __entry->balanced_dirty_ratelimit = 394b48c104dSWu Fengguang KBps(bdi->balanced_dirty_ratelimit); 395b48c104dSWu Fengguang ), 396b48c104dSWu Fengguang 397b48c104dSWu Fengguang TP_printk("bdi %s: " 398b48c104dSWu Fengguang "write_bw=%lu awrite_bw=%lu dirty_rate=%lu " 399b48c104dSWu Fengguang "dirty_ratelimit=%lu task_ratelimit=%lu " 400b48c104dSWu Fengguang "balanced_dirty_ratelimit=%lu", 401b48c104dSWu Fengguang __entry->bdi, 402b48c104dSWu Fengguang __entry->write_bw, /* write bandwidth */ 403b48c104dSWu Fengguang __entry->avg_write_bw, /* avg write bandwidth */ 404b48c104dSWu Fengguang __entry->dirty_rate, /* bdi dirty rate */ 405b48c104dSWu Fengguang __entry->dirty_ratelimit, /* base ratelimit */ 406b48c104dSWu Fengguang __entry->task_ratelimit, /* ratelimit with position control */ 407b48c104dSWu Fengguang __entry->balanced_dirty_ratelimit /* the balanced ratelimit */ 408b48c104dSWu Fengguang ) 409b48c104dSWu Fengguang ); 410b48c104dSWu Fengguang 411ece13ac3SWu Fengguang TRACE_EVENT(balance_dirty_pages, 412ece13ac3SWu Fengguang 413ece13ac3SWu Fengguang TP_PROTO(struct backing_dev_info *bdi, 414ece13ac3SWu Fengguang unsigned long thresh, 415ece13ac3SWu Fengguang unsigned long bg_thresh, 416ece13ac3SWu Fengguang unsigned long dirty, 417ece13ac3SWu Fengguang unsigned long bdi_thresh, 418ece13ac3SWu Fengguang unsigned long bdi_dirty, 419ece13ac3SWu Fengguang unsigned long dirty_ratelimit, 420ece13ac3SWu Fengguang unsigned long task_ratelimit, 421ece13ac3SWu Fengguang unsigned long dirtied, 42283712358SWu Fengguang unsigned long period, 423ece13ac3SWu Fengguang long pause, 424ece13ac3SWu Fengguang unsigned long start_time), 425ece13ac3SWu Fengguang 426ece13ac3SWu Fengguang TP_ARGS(bdi, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty, 427ece13ac3SWu Fengguang dirty_ratelimit, task_ratelimit, 42883712358SWu Fengguang dirtied, period, pause, start_time), 429ece13ac3SWu Fengguang 430ece13ac3SWu Fengguang TP_STRUCT__entry( 431ece13ac3SWu Fengguang __array( char, bdi, 32) 432ece13ac3SWu Fengguang __field(unsigned long, limit) 433ece13ac3SWu Fengguang __field(unsigned long, setpoint) 434ece13ac3SWu Fengguang __field(unsigned long, dirty) 435ece13ac3SWu Fengguang __field(unsigned long, bdi_setpoint) 436ece13ac3SWu Fengguang __field(unsigned long, bdi_dirty) 437ece13ac3SWu Fengguang __field(unsigned long, dirty_ratelimit) 438ece13ac3SWu Fengguang __field(unsigned long, task_ratelimit) 439ece13ac3SWu Fengguang __field(unsigned int, dirtied) 440ece13ac3SWu Fengguang __field(unsigned int, dirtied_pause) 441ece13ac3SWu Fengguang __field(unsigned long, paused) 442ece13ac3SWu Fengguang __field( long, pause) 44383712358SWu Fengguang __field(unsigned long, period) 44483712358SWu Fengguang __field( long, think) 445ece13ac3SWu Fengguang ), 446ece13ac3SWu Fengguang 447ece13ac3SWu Fengguang TP_fast_assign( 448ece13ac3SWu Fengguang unsigned long freerun = (thresh + bg_thresh) / 2; 449ece13ac3SWu Fengguang strlcpy(__entry->bdi, dev_name(bdi->dev), 32); 450ece13ac3SWu Fengguang 451ece13ac3SWu Fengguang __entry->limit = global_dirty_limit; 452ece13ac3SWu Fengguang __entry->setpoint = (global_dirty_limit + freerun) / 2; 453ece13ac3SWu Fengguang __entry->dirty = dirty; 454ece13ac3SWu Fengguang __entry->bdi_setpoint = __entry->setpoint * 455ece13ac3SWu Fengguang bdi_thresh / (thresh + 1); 456ece13ac3SWu Fengguang __entry->bdi_dirty = bdi_dirty; 457ece13ac3SWu Fengguang __entry->dirty_ratelimit = KBps(dirty_ratelimit); 458ece13ac3SWu Fengguang __entry->task_ratelimit = KBps(task_ratelimit); 459ece13ac3SWu Fengguang __entry->dirtied = dirtied; 460ece13ac3SWu Fengguang __entry->dirtied_pause = current->nr_dirtied_pause; 46183712358SWu Fengguang __entry->think = current->dirty_paused_when == 0 ? 0 : 46283712358SWu Fengguang (long)(jiffies - current->dirty_paused_when) * 1000/HZ; 46383712358SWu Fengguang __entry->period = period * 1000 / HZ; 464ece13ac3SWu Fengguang __entry->pause = pause * 1000 / HZ; 465ece13ac3SWu Fengguang __entry->paused = (jiffies - start_time) * 1000 / HZ; 466ece13ac3SWu Fengguang ), 467ece13ac3SWu Fengguang 468ece13ac3SWu Fengguang 469ece13ac3SWu Fengguang TP_printk("bdi %s: " 470ece13ac3SWu Fengguang "limit=%lu setpoint=%lu dirty=%lu " 471ece13ac3SWu Fengguang "bdi_setpoint=%lu bdi_dirty=%lu " 472ece13ac3SWu Fengguang "dirty_ratelimit=%lu task_ratelimit=%lu " 473ece13ac3SWu Fengguang "dirtied=%u dirtied_pause=%u " 47483712358SWu Fengguang "paused=%lu pause=%ld period=%lu think=%ld", 475ece13ac3SWu Fengguang __entry->bdi, 476ece13ac3SWu Fengguang __entry->limit, 477ece13ac3SWu Fengguang __entry->setpoint, 478ece13ac3SWu Fengguang __entry->dirty, 479ece13ac3SWu Fengguang __entry->bdi_setpoint, 480ece13ac3SWu Fengguang __entry->bdi_dirty, 481ece13ac3SWu Fengguang __entry->dirty_ratelimit, 482ece13ac3SWu Fengguang __entry->task_ratelimit, 483ece13ac3SWu Fengguang __entry->dirtied, 484ece13ac3SWu Fengguang __entry->dirtied_pause, 485ece13ac3SWu Fengguang __entry->paused, /* ms */ 48683712358SWu Fengguang __entry->pause, /* ms */ 48783712358SWu Fengguang __entry->period, /* ms */ 48883712358SWu Fengguang __entry->think /* ms */ 489ece13ac3SWu Fengguang ) 490ece13ac3SWu Fengguang ); 491ece13ac3SWu Fengguang 492cc1676d9SJan Kara TRACE_EVENT(writeback_sb_inodes_requeue, 493cc1676d9SJan Kara 494cc1676d9SJan Kara TP_PROTO(struct inode *inode), 495cc1676d9SJan Kara TP_ARGS(inode), 496cc1676d9SJan Kara 497cc1676d9SJan Kara TP_STRUCT__entry( 498cc1676d9SJan Kara __array(char, name, 32) 499cc1676d9SJan Kara __field(unsigned long, ino) 500cc1676d9SJan Kara __field(unsigned long, state) 501cc1676d9SJan Kara __field(unsigned long, dirtied_when) 502cc1676d9SJan Kara ), 503cc1676d9SJan Kara 504cc1676d9SJan Kara TP_fast_assign( 505cc1676d9SJan Kara strncpy(__entry->name, 506cc1676d9SJan Kara dev_name(inode_to_bdi(inode)->dev), 32); 507cc1676d9SJan Kara __entry->ino = inode->i_ino; 508cc1676d9SJan Kara __entry->state = inode->i_state; 509cc1676d9SJan Kara __entry->dirtied_when = inode->dirtied_when; 510cc1676d9SJan Kara ), 511cc1676d9SJan Kara 512cc1676d9SJan Kara TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu", 513cc1676d9SJan Kara __entry->name, 514cc1676d9SJan Kara __entry->ino, 515cc1676d9SJan Kara show_inode_state(__entry->state), 516cc1676d9SJan Kara __entry->dirtied_when, 517cc1676d9SJan Kara (jiffies - __entry->dirtied_when) / HZ 518cc1676d9SJan Kara ) 519cc1676d9SJan Kara ); 520cc1676d9SJan Kara 52152bb9198SMel Gorman DECLARE_EVENT_CLASS(writeback_congest_waited_template, 52252bb9198SMel Gorman 52352bb9198SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 52452bb9198SMel Gorman 52552bb9198SMel Gorman TP_ARGS(usec_timeout, usec_delayed), 52652bb9198SMel Gorman 52752bb9198SMel Gorman TP_STRUCT__entry( 52852bb9198SMel Gorman __field( unsigned int, usec_timeout ) 52952bb9198SMel Gorman __field( unsigned int, usec_delayed ) 53052bb9198SMel Gorman ), 53152bb9198SMel Gorman 53252bb9198SMel Gorman TP_fast_assign( 53352bb9198SMel Gorman __entry->usec_timeout = usec_timeout; 53452bb9198SMel Gorman __entry->usec_delayed = usec_delayed; 53552bb9198SMel Gorman ), 53652bb9198SMel Gorman 53752bb9198SMel Gorman TP_printk("usec_timeout=%u usec_delayed=%u", 53852bb9198SMel Gorman __entry->usec_timeout, 53952bb9198SMel Gorman __entry->usec_delayed) 54052bb9198SMel Gorman ); 54152bb9198SMel Gorman 54252bb9198SMel Gorman DEFINE_EVENT(writeback_congest_waited_template, writeback_congestion_wait, 54352bb9198SMel Gorman 54452bb9198SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 54552bb9198SMel Gorman 54652bb9198SMel Gorman TP_ARGS(usec_timeout, usec_delayed) 54752bb9198SMel Gorman ); 54852bb9198SMel Gorman 5490e093d99SMel Gorman DEFINE_EVENT(writeback_congest_waited_template, writeback_wait_iff_congested, 5500e093d99SMel Gorman 5510e093d99SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 5520e093d99SMel Gorman 5530e093d99SMel Gorman TP_ARGS(usec_timeout, usec_delayed) 5540e093d99SMel Gorman ); 5550e093d99SMel Gorman 556251d6a47SWu Fengguang DECLARE_EVENT_CLASS(writeback_single_inode_template, 557251d6a47SWu Fengguang 558251d6a47SWu Fengguang TP_PROTO(struct inode *inode, 559251d6a47SWu Fengguang struct writeback_control *wbc, 560251d6a47SWu Fengguang unsigned long nr_to_write 561251d6a47SWu Fengguang ), 562251d6a47SWu Fengguang 563251d6a47SWu Fengguang TP_ARGS(inode, wbc, nr_to_write), 564251d6a47SWu Fengguang 565251d6a47SWu Fengguang TP_STRUCT__entry( 566251d6a47SWu Fengguang __array(char, name, 32) 567251d6a47SWu Fengguang __field(unsigned long, ino) 568251d6a47SWu Fengguang __field(unsigned long, state) 569c8ad6206SWu Fengguang __field(unsigned long, dirtied_when) 570251d6a47SWu Fengguang __field(unsigned long, writeback_index) 571251d6a47SWu Fengguang __field(long, nr_to_write) 572251d6a47SWu Fengguang __field(unsigned long, wrote) 573251d6a47SWu Fengguang ), 574251d6a47SWu Fengguang 575251d6a47SWu Fengguang TP_fast_assign( 576251d6a47SWu Fengguang strncpy(__entry->name, 57715eb77a0SWu Fengguang dev_name(inode_to_bdi(inode)->dev), 32); 578251d6a47SWu Fengguang __entry->ino = inode->i_ino; 579251d6a47SWu Fengguang __entry->state = inode->i_state; 580c8ad6206SWu Fengguang __entry->dirtied_when = inode->dirtied_when; 581251d6a47SWu Fengguang __entry->writeback_index = inode->i_mapping->writeback_index; 582251d6a47SWu Fengguang __entry->nr_to_write = nr_to_write; 583251d6a47SWu Fengguang __entry->wrote = nr_to_write - wbc->nr_to_write; 584251d6a47SWu Fengguang ), 585251d6a47SWu Fengguang 586c8ad6206SWu Fengguang TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu " 587251d6a47SWu Fengguang "index=%lu to_write=%ld wrote=%lu", 588251d6a47SWu Fengguang __entry->name, 589251d6a47SWu Fengguang __entry->ino, 590251d6a47SWu Fengguang show_inode_state(__entry->state), 591c8ad6206SWu Fengguang __entry->dirtied_when, 592c8ad6206SWu Fengguang (jiffies - __entry->dirtied_when) / HZ, 593251d6a47SWu Fengguang __entry->writeback_index, 594251d6a47SWu Fengguang __entry->nr_to_write, 595251d6a47SWu Fengguang __entry->wrote 596251d6a47SWu Fengguang ) 597251d6a47SWu Fengguang ); 598251d6a47SWu Fengguang 5999fb0a7daSTejun Heo DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode_start, 6009fb0a7daSTejun Heo TP_PROTO(struct inode *inode, 6019fb0a7daSTejun Heo struct writeback_control *wbc, 6029fb0a7daSTejun Heo unsigned long nr_to_write), 6039fb0a7daSTejun Heo TP_ARGS(inode, wbc, nr_to_write) 6049fb0a7daSTejun Heo ); 6059fb0a7daSTejun Heo 606251d6a47SWu Fengguang DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode, 607251d6a47SWu Fengguang TP_PROTO(struct inode *inode, 608251d6a47SWu Fengguang struct writeback_control *wbc, 609251d6a47SWu Fengguang unsigned long nr_to_write), 610251d6a47SWu Fengguang TP_ARGS(inode, wbc, nr_to_write) 611251d6a47SWu Fengguang ); 612251d6a47SWu Fengguang 613*0ae45f63STheodore Ts'o DECLARE_EVENT_CLASS(writeback_lazytime_template, 614*0ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 615*0ae45f63STheodore Ts'o 616*0ae45f63STheodore Ts'o TP_ARGS(inode), 617*0ae45f63STheodore Ts'o 618*0ae45f63STheodore Ts'o TP_STRUCT__entry( 619*0ae45f63STheodore Ts'o __field( dev_t, dev ) 620*0ae45f63STheodore Ts'o __field(unsigned long, ino ) 621*0ae45f63STheodore Ts'o __field(unsigned long, state ) 622*0ae45f63STheodore Ts'o __field( __u16, mode ) 623*0ae45f63STheodore Ts'o __field(unsigned long, dirtied_when ) 624*0ae45f63STheodore Ts'o ), 625*0ae45f63STheodore Ts'o 626*0ae45f63STheodore Ts'o TP_fast_assign( 627*0ae45f63STheodore Ts'o __entry->dev = inode->i_sb->s_dev; 628*0ae45f63STheodore Ts'o __entry->ino = inode->i_ino; 629*0ae45f63STheodore Ts'o __entry->state = inode->i_state; 630*0ae45f63STheodore Ts'o __entry->mode = inode->i_mode; 631*0ae45f63STheodore Ts'o __entry->dirtied_when = inode->dirtied_when; 632*0ae45f63STheodore Ts'o ), 633*0ae45f63STheodore Ts'o 634*0ae45f63STheodore Ts'o TP_printk("dev %d,%d ino %lu dirtied %lu state %s mode 0%o", 635*0ae45f63STheodore Ts'o MAJOR(__entry->dev), MINOR(__entry->dev), 636*0ae45f63STheodore Ts'o __entry->ino, __entry->dirtied_when, 637*0ae45f63STheodore Ts'o show_inode_state(__entry->state), __entry->mode) 638*0ae45f63STheodore Ts'o ); 639*0ae45f63STheodore Ts'o 640*0ae45f63STheodore Ts'o DEFINE_EVENT(writeback_lazytime_template, writeback_lazytime, 641*0ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 642*0ae45f63STheodore Ts'o 643*0ae45f63STheodore Ts'o TP_ARGS(inode) 644*0ae45f63STheodore Ts'o ); 645*0ae45f63STheodore Ts'o 646*0ae45f63STheodore Ts'o DEFINE_EVENT(writeback_lazytime_template, writeback_lazytime_iput, 647*0ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 648*0ae45f63STheodore Ts'o 649*0ae45f63STheodore Ts'o TP_ARGS(inode) 650*0ae45f63STheodore Ts'o ); 651*0ae45f63STheodore Ts'o 652*0ae45f63STheodore Ts'o DEFINE_EVENT(writeback_lazytime_template, writeback_dirty_inode_enqueue, 653*0ae45f63STheodore Ts'o 654*0ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 655*0ae45f63STheodore Ts'o 656*0ae45f63STheodore Ts'o TP_ARGS(inode) 657*0ae45f63STheodore Ts'o ); 658*0ae45f63STheodore Ts'o 659455b2864SDave Chinner #endif /* _TRACE_WRITEBACK_H */ 660455b2864SDave Chinner 661455b2864SDave Chinner /* This part must be outside protection */ 662455b2864SDave Chinner #include <trace/define_trace.h> 663