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 7455b2864SDave Chinner #include <linux/backing-dev.h> 8455b2864SDave Chinner #include <linux/writeback.h> 9455b2864SDave Chinner 10251d6a47SWu Fengguang #define show_inode_state(state) \ 11251d6a47SWu Fengguang __print_flags(state, "|", \ 12251d6a47SWu Fengguang {I_DIRTY_SYNC, "I_DIRTY_SYNC"}, \ 13251d6a47SWu Fengguang {I_DIRTY_DATASYNC, "I_DIRTY_DATASYNC"}, \ 14251d6a47SWu Fengguang {I_DIRTY_PAGES, "I_DIRTY_PAGES"}, \ 15251d6a47SWu Fengguang {I_NEW, "I_NEW"}, \ 16251d6a47SWu Fengguang {I_WILL_FREE, "I_WILL_FREE"}, \ 17251d6a47SWu Fengguang {I_FREEING, "I_FREEING"}, \ 18251d6a47SWu Fengguang {I_CLEAR, "I_CLEAR"}, \ 19251d6a47SWu Fengguang {I_SYNC, "I_SYNC"}, \ 20251d6a47SWu Fengguang {I_REFERENCED, "I_REFERENCED"} \ 21251d6a47SWu Fengguang ) 22251d6a47SWu Fengguang 23b3bba872SWu Fengguang #define WB_WORK_REASON \ 24b3bba872SWu Fengguang {WB_REASON_BACKGROUND, "background"}, \ 25b3bba872SWu Fengguang {WB_REASON_TRY_TO_FREE_PAGES, "try_to_free_pages"}, \ 26b3bba872SWu Fengguang {WB_REASON_SYNC, "sync"}, \ 27b3bba872SWu Fengguang {WB_REASON_PERIODIC, "periodic"}, \ 28b3bba872SWu Fengguang {WB_REASON_LAPTOP_TIMER, "laptop_timer"}, \ 29b3bba872SWu Fengguang {WB_REASON_FREE_MORE_MEM, "free_more_memory"}, \ 30b3bba872SWu Fengguang {WB_REASON_FS_FREE_SPACE, "fs_free_space"}, \ 31b3bba872SWu Fengguang {WB_REASON_FORKER_THREAD, "forker_thread"} 32b3bba872SWu Fengguang 33455b2864SDave Chinner struct wb_writeback_work; 34455b2864SDave Chinner 359fb0a7daSTejun Heo TRACE_EVENT(writeback_dirty_page, 369fb0a7daSTejun Heo 379fb0a7daSTejun Heo TP_PROTO(struct page *page, struct address_space *mapping), 389fb0a7daSTejun Heo 399fb0a7daSTejun Heo TP_ARGS(page, mapping), 409fb0a7daSTejun Heo 419fb0a7daSTejun Heo TP_STRUCT__entry ( 429fb0a7daSTejun Heo __array(char, name, 32) 439fb0a7daSTejun Heo __field(unsigned long, ino) 449fb0a7daSTejun Heo __field(pgoff_t, index) 459fb0a7daSTejun Heo ), 469fb0a7daSTejun Heo 479fb0a7daSTejun Heo TP_fast_assign( 489fb0a7daSTejun Heo strncpy(__entry->name, 499fb0a7daSTejun Heo mapping ? dev_name(mapping->backing_dev_info->dev) : "(unknown)", 32); 509fb0a7daSTejun Heo __entry->ino = mapping ? mapping->host->i_ino : 0; 519fb0a7daSTejun Heo __entry->index = page->index; 529fb0a7daSTejun Heo ), 539fb0a7daSTejun Heo 549fb0a7daSTejun Heo TP_printk("bdi %s: ino=%lu index=%lu", 559fb0a7daSTejun Heo __entry->name, 569fb0a7daSTejun Heo __entry->ino, 579fb0a7daSTejun Heo __entry->index 589fb0a7daSTejun Heo ) 599fb0a7daSTejun Heo ); 609fb0a7daSTejun Heo 619fb0a7daSTejun Heo DECLARE_EVENT_CLASS(writeback_dirty_inode_template, 629fb0a7daSTejun Heo 639fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 649fb0a7daSTejun Heo 659fb0a7daSTejun Heo TP_ARGS(inode, flags), 669fb0a7daSTejun Heo 679fb0a7daSTejun Heo TP_STRUCT__entry ( 689fb0a7daSTejun Heo __array(char, name, 32) 699fb0a7daSTejun Heo __field(unsigned long, ino) 709fb0a7daSTejun Heo __field(unsigned long, flags) 719fb0a7daSTejun Heo ), 729fb0a7daSTejun Heo 739fb0a7daSTejun Heo TP_fast_assign( 749fb0a7daSTejun Heo struct backing_dev_info *bdi = inode->i_mapping->backing_dev_info; 759fb0a7daSTejun Heo 769fb0a7daSTejun Heo /* may be called for files on pseudo FSes w/ unregistered bdi */ 779fb0a7daSTejun Heo strncpy(__entry->name, 789fb0a7daSTejun Heo bdi->dev ? dev_name(bdi->dev) : "(unknown)", 32); 799fb0a7daSTejun Heo __entry->ino = inode->i_ino; 809fb0a7daSTejun Heo __entry->flags = flags; 819fb0a7daSTejun Heo ), 829fb0a7daSTejun Heo 839fb0a7daSTejun Heo TP_printk("bdi %s: ino=%lu flags=%s", 849fb0a7daSTejun Heo __entry->name, 859fb0a7daSTejun Heo __entry->ino, 869fb0a7daSTejun Heo show_inode_state(__entry->flags) 879fb0a7daSTejun Heo ) 889fb0a7daSTejun Heo ); 899fb0a7daSTejun Heo 909fb0a7daSTejun Heo DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode_start, 919fb0a7daSTejun Heo 929fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 939fb0a7daSTejun Heo 949fb0a7daSTejun Heo TP_ARGS(inode, flags) 959fb0a7daSTejun Heo ); 969fb0a7daSTejun Heo 979fb0a7daSTejun Heo DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode, 989fb0a7daSTejun Heo 999fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 1009fb0a7daSTejun Heo 1019fb0a7daSTejun Heo TP_ARGS(inode, flags) 1029fb0a7daSTejun Heo ); 1039fb0a7daSTejun Heo 1049fb0a7daSTejun Heo DECLARE_EVENT_CLASS(writeback_write_inode_template, 1059fb0a7daSTejun Heo 1069fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 1079fb0a7daSTejun Heo 1089fb0a7daSTejun Heo TP_ARGS(inode, wbc), 1099fb0a7daSTejun Heo 1109fb0a7daSTejun Heo TP_STRUCT__entry ( 1119fb0a7daSTejun Heo __array(char, name, 32) 1129fb0a7daSTejun Heo __field(unsigned long, ino) 1139fb0a7daSTejun Heo __field(int, sync_mode) 1149fb0a7daSTejun Heo ), 1159fb0a7daSTejun Heo 1169fb0a7daSTejun Heo TP_fast_assign( 1179fb0a7daSTejun Heo strncpy(__entry->name, 1189fb0a7daSTejun Heo dev_name(inode->i_mapping->backing_dev_info->dev), 32); 1199fb0a7daSTejun Heo __entry->ino = inode->i_ino; 1209fb0a7daSTejun Heo __entry->sync_mode = wbc->sync_mode; 1219fb0a7daSTejun Heo ), 1229fb0a7daSTejun Heo 1239fb0a7daSTejun Heo TP_printk("bdi %s: ino=%lu sync_mode=%d", 1249fb0a7daSTejun Heo __entry->name, 1259fb0a7daSTejun Heo __entry->ino, 1269fb0a7daSTejun Heo __entry->sync_mode 1279fb0a7daSTejun Heo ) 1289fb0a7daSTejun Heo ); 1299fb0a7daSTejun Heo 1309fb0a7daSTejun Heo DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode_start, 1319fb0a7daSTejun Heo 1329fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 1339fb0a7daSTejun Heo 1349fb0a7daSTejun Heo TP_ARGS(inode, wbc) 1359fb0a7daSTejun Heo ); 1369fb0a7daSTejun Heo 1379fb0a7daSTejun Heo DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode, 1389fb0a7daSTejun Heo 1399fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 1409fb0a7daSTejun Heo 1419fb0a7daSTejun Heo TP_ARGS(inode, wbc) 1429fb0a7daSTejun Heo ); 1439fb0a7daSTejun Heo 144455b2864SDave Chinner DECLARE_EVENT_CLASS(writeback_work_class, 145455b2864SDave Chinner TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work), 146455b2864SDave Chinner TP_ARGS(bdi, work), 147455b2864SDave Chinner TP_STRUCT__entry( 148455b2864SDave Chinner __array(char, name, 32) 149455b2864SDave Chinner __field(long, nr_pages) 150455b2864SDave Chinner __field(dev_t, sb_dev) 151455b2864SDave Chinner __field(int, sync_mode) 152455b2864SDave Chinner __field(int, for_kupdate) 153455b2864SDave Chinner __field(int, range_cyclic) 154455b2864SDave Chinner __field(int, for_background) 1550e175a18SCurt Wohlgemuth __field(int, reason) 156455b2864SDave Chinner ), 157455b2864SDave Chinner TP_fast_assign( 158977b7e3aSWu Fengguang struct device *dev = bdi->dev; 159977b7e3aSWu Fengguang if (!dev) 160977b7e3aSWu Fengguang dev = default_backing_dev_info.dev; 161977b7e3aSWu Fengguang strncpy(__entry->name, dev_name(dev), 32); 162455b2864SDave Chinner __entry->nr_pages = work->nr_pages; 163455b2864SDave Chinner __entry->sb_dev = work->sb ? work->sb->s_dev : 0; 164455b2864SDave Chinner __entry->sync_mode = work->sync_mode; 165455b2864SDave Chinner __entry->for_kupdate = work->for_kupdate; 166455b2864SDave Chinner __entry->range_cyclic = work->range_cyclic; 167455b2864SDave Chinner __entry->for_background = work->for_background; 1680e175a18SCurt Wohlgemuth __entry->reason = work->reason; 169455b2864SDave Chinner ), 170455b2864SDave Chinner TP_printk("bdi %s: sb_dev %d:%d nr_pages=%ld sync_mode=%d " 1710e175a18SCurt Wohlgemuth "kupdate=%d range_cyclic=%d background=%d reason=%s", 172455b2864SDave Chinner __entry->name, 173455b2864SDave Chinner MAJOR(__entry->sb_dev), MINOR(__entry->sb_dev), 174455b2864SDave Chinner __entry->nr_pages, 175455b2864SDave Chinner __entry->sync_mode, 176455b2864SDave Chinner __entry->for_kupdate, 177455b2864SDave Chinner __entry->range_cyclic, 1780e175a18SCurt Wohlgemuth __entry->for_background, 179b3bba872SWu Fengguang __print_symbolic(__entry->reason, WB_WORK_REASON) 180455b2864SDave Chinner ) 181455b2864SDave Chinner ); 182455b2864SDave Chinner #define DEFINE_WRITEBACK_WORK_EVENT(name) \ 183455b2864SDave Chinner DEFINE_EVENT(writeback_work_class, name, \ 184455b2864SDave Chinner TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work), \ 185455b2864SDave Chinner TP_ARGS(bdi, work)) 186455b2864SDave Chinner DEFINE_WRITEBACK_WORK_EVENT(writeback_queue); 187455b2864SDave Chinner DEFINE_WRITEBACK_WORK_EVENT(writeback_exec); 188d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_start); 189d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_written); 190d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_wait); 191455b2864SDave Chinner 192455b2864SDave Chinner TRACE_EVENT(writeback_pages_written, 193455b2864SDave Chinner TP_PROTO(long pages_written), 194455b2864SDave Chinner TP_ARGS(pages_written), 195455b2864SDave Chinner TP_STRUCT__entry( 196455b2864SDave Chinner __field(long, pages) 197455b2864SDave Chinner ), 198455b2864SDave Chinner TP_fast_assign( 199455b2864SDave Chinner __entry->pages = pages_written; 200455b2864SDave Chinner ), 201455b2864SDave Chinner TP_printk("%ld", __entry->pages) 202455b2864SDave Chinner ); 203455b2864SDave Chinner 204455b2864SDave Chinner DECLARE_EVENT_CLASS(writeback_class, 205455b2864SDave Chinner TP_PROTO(struct backing_dev_info *bdi), 206455b2864SDave Chinner TP_ARGS(bdi), 207455b2864SDave Chinner TP_STRUCT__entry( 208455b2864SDave Chinner __array(char, name, 32) 209455b2864SDave Chinner ), 210455b2864SDave Chinner TP_fast_assign( 211455b2864SDave Chinner strncpy(__entry->name, dev_name(bdi->dev), 32); 212455b2864SDave Chinner ), 213455b2864SDave Chinner TP_printk("bdi %s", 214455b2864SDave Chinner __entry->name 215455b2864SDave Chinner ) 216455b2864SDave Chinner ); 217455b2864SDave Chinner #define DEFINE_WRITEBACK_EVENT(name) \ 218455b2864SDave Chinner DEFINE_EVENT(writeback_class, name, \ 219455b2864SDave Chinner TP_PROTO(struct backing_dev_info *bdi), \ 220455b2864SDave Chinner TP_ARGS(bdi)) 221455b2864SDave Chinner 222455b2864SDave Chinner DEFINE_WRITEBACK_EVENT(writeback_nowork); 22371927e84SWu Fengguang DEFINE_WRITEBACK_EVENT(writeback_wake_background); 224455b2864SDave Chinner DEFINE_WRITEBACK_EVENT(writeback_bdi_register); 225455b2864SDave Chinner DEFINE_WRITEBACK_EVENT(writeback_bdi_unregister); 226455b2864SDave Chinner 227028c2dd1SDave Chinner DECLARE_EVENT_CLASS(wbc_class, 228028c2dd1SDave Chinner TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), 229028c2dd1SDave Chinner TP_ARGS(wbc, bdi), 230028c2dd1SDave Chinner TP_STRUCT__entry( 231028c2dd1SDave Chinner __array(char, name, 32) 232028c2dd1SDave Chinner __field(long, nr_to_write) 233028c2dd1SDave Chinner __field(long, pages_skipped) 234028c2dd1SDave Chinner __field(int, sync_mode) 235028c2dd1SDave Chinner __field(int, for_kupdate) 236028c2dd1SDave Chinner __field(int, for_background) 237028c2dd1SDave Chinner __field(int, for_reclaim) 238028c2dd1SDave Chinner __field(int, range_cyclic) 239028c2dd1SDave Chinner __field(long, range_start) 240028c2dd1SDave Chinner __field(long, range_end) 241028c2dd1SDave Chinner ), 242028c2dd1SDave Chinner 243028c2dd1SDave Chinner TP_fast_assign( 244028c2dd1SDave Chinner strncpy(__entry->name, dev_name(bdi->dev), 32); 245028c2dd1SDave Chinner __entry->nr_to_write = wbc->nr_to_write; 246028c2dd1SDave Chinner __entry->pages_skipped = wbc->pages_skipped; 247028c2dd1SDave Chinner __entry->sync_mode = wbc->sync_mode; 248028c2dd1SDave Chinner __entry->for_kupdate = wbc->for_kupdate; 249028c2dd1SDave Chinner __entry->for_background = wbc->for_background; 250028c2dd1SDave Chinner __entry->for_reclaim = wbc->for_reclaim; 251028c2dd1SDave Chinner __entry->range_cyclic = wbc->range_cyclic; 252028c2dd1SDave Chinner __entry->range_start = (long)wbc->range_start; 253028c2dd1SDave Chinner __entry->range_end = (long)wbc->range_end; 254028c2dd1SDave Chinner ), 255028c2dd1SDave Chinner 256028c2dd1SDave Chinner TP_printk("bdi %s: towrt=%ld skip=%ld mode=%d kupd=%d " 257d46db3d5SWu Fengguang "bgrd=%d reclm=%d cyclic=%d " 258028c2dd1SDave Chinner "start=0x%lx end=0x%lx", 259028c2dd1SDave Chinner __entry->name, 260028c2dd1SDave Chinner __entry->nr_to_write, 261028c2dd1SDave Chinner __entry->pages_skipped, 262028c2dd1SDave Chinner __entry->sync_mode, 263028c2dd1SDave Chinner __entry->for_kupdate, 264028c2dd1SDave Chinner __entry->for_background, 265028c2dd1SDave Chinner __entry->for_reclaim, 266028c2dd1SDave Chinner __entry->range_cyclic, 267028c2dd1SDave Chinner __entry->range_start, 268028c2dd1SDave Chinner __entry->range_end) 269028c2dd1SDave Chinner ) 270028c2dd1SDave Chinner 271028c2dd1SDave Chinner #define DEFINE_WBC_EVENT(name) \ 272028c2dd1SDave Chinner DEFINE_EVENT(wbc_class, name, \ 273028c2dd1SDave Chinner TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), \ 274028c2dd1SDave Chinner TP_ARGS(wbc, bdi)) 2759e094383SDave Chinner DEFINE_WBC_EVENT(wbc_writepage); 276028c2dd1SDave Chinner 277e84d0a4fSWu Fengguang TRACE_EVENT(writeback_queue_io, 278e84d0a4fSWu Fengguang TP_PROTO(struct bdi_writeback *wb, 279ad4e38ddSCurt Wohlgemuth struct wb_writeback_work *work, 280e84d0a4fSWu Fengguang int moved), 281ad4e38ddSCurt Wohlgemuth TP_ARGS(wb, work, moved), 282e84d0a4fSWu Fengguang TP_STRUCT__entry( 283e84d0a4fSWu Fengguang __array(char, name, 32) 284e84d0a4fSWu Fengguang __field(unsigned long, older) 285e84d0a4fSWu Fengguang __field(long, age) 286e84d0a4fSWu Fengguang __field(int, moved) 2870e175a18SCurt Wohlgemuth __field(int, reason) 288e84d0a4fSWu Fengguang ), 289e84d0a4fSWu Fengguang TP_fast_assign( 290*0dc83bd3SJan Kara unsigned long *older_than_this = work->older_than_this; 291e84d0a4fSWu Fengguang strncpy(__entry->name, dev_name(wb->bdi->dev), 32); 292*0dc83bd3SJan Kara __entry->older = older_than_this ? *older_than_this : 0; 293e84d0a4fSWu Fengguang __entry->age = older_than_this ? 294*0dc83bd3SJan Kara (jiffies - *older_than_this) * 1000 / HZ : -1; 295e84d0a4fSWu Fengguang __entry->moved = moved; 2960e175a18SCurt Wohlgemuth __entry->reason = work->reason; 297e84d0a4fSWu Fengguang ), 2980e175a18SCurt Wohlgemuth TP_printk("bdi %s: older=%lu age=%ld enqueue=%d reason=%s", 299e84d0a4fSWu Fengguang __entry->name, 300e84d0a4fSWu Fengguang __entry->older, /* older_than_this in jiffies */ 301e84d0a4fSWu Fengguang __entry->age, /* older_than_this in relative milliseconds */ 3020e175a18SCurt Wohlgemuth __entry->moved, 303b3bba872SWu Fengguang __print_symbolic(__entry->reason, WB_WORK_REASON) 304b3bba872SWu Fengguang ) 305e84d0a4fSWu Fengguang ); 306e84d0a4fSWu Fengguang 307e1cbe236SWu Fengguang TRACE_EVENT(global_dirty_state, 308e1cbe236SWu Fengguang 309e1cbe236SWu Fengguang TP_PROTO(unsigned long background_thresh, 310e1cbe236SWu Fengguang unsigned long dirty_thresh 311e1cbe236SWu Fengguang ), 312e1cbe236SWu Fengguang 313e1cbe236SWu Fengguang TP_ARGS(background_thresh, 314e1cbe236SWu Fengguang dirty_thresh 315e1cbe236SWu Fengguang ), 316e1cbe236SWu Fengguang 317e1cbe236SWu Fengguang TP_STRUCT__entry( 318e1cbe236SWu Fengguang __field(unsigned long, nr_dirty) 319e1cbe236SWu Fengguang __field(unsigned long, nr_writeback) 320e1cbe236SWu Fengguang __field(unsigned long, nr_unstable) 321e1cbe236SWu Fengguang __field(unsigned long, background_thresh) 322e1cbe236SWu Fengguang __field(unsigned long, dirty_thresh) 323e1cbe236SWu Fengguang __field(unsigned long, dirty_limit) 324e1cbe236SWu Fengguang __field(unsigned long, nr_dirtied) 325e1cbe236SWu Fengguang __field(unsigned long, nr_written) 326e1cbe236SWu Fengguang ), 327e1cbe236SWu Fengguang 328e1cbe236SWu Fengguang TP_fast_assign( 329e1cbe236SWu Fengguang __entry->nr_dirty = global_page_state(NR_FILE_DIRTY); 330e1cbe236SWu Fengguang __entry->nr_writeback = global_page_state(NR_WRITEBACK); 331e1cbe236SWu Fengguang __entry->nr_unstable = global_page_state(NR_UNSTABLE_NFS); 332e1cbe236SWu Fengguang __entry->nr_dirtied = global_page_state(NR_DIRTIED); 333e1cbe236SWu Fengguang __entry->nr_written = global_page_state(NR_WRITTEN); 334e1cbe236SWu Fengguang __entry->background_thresh = background_thresh; 335e1cbe236SWu Fengguang __entry->dirty_thresh = dirty_thresh; 336e1cbe236SWu Fengguang __entry->dirty_limit = global_dirty_limit; 337e1cbe236SWu Fengguang ), 338e1cbe236SWu Fengguang 339e1cbe236SWu Fengguang TP_printk("dirty=%lu writeback=%lu unstable=%lu " 340e1cbe236SWu Fengguang "bg_thresh=%lu thresh=%lu limit=%lu " 341e1cbe236SWu Fengguang "dirtied=%lu written=%lu", 342e1cbe236SWu Fengguang __entry->nr_dirty, 343e1cbe236SWu Fengguang __entry->nr_writeback, 344e1cbe236SWu Fengguang __entry->nr_unstable, 345e1cbe236SWu Fengguang __entry->background_thresh, 346e1cbe236SWu Fengguang __entry->dirty_thresh, 347e1cbe236SWu Fengguang __entry->dirty_limit, 348e1cbe236SWu Fengguang __entry->nr_dirtied, 349e1cbe236SWu Fengguang __entry->nr_written 350e1cbe236SWu Fengguang ) 351e1cbe236SWu Fengguang ); 352e1cbe236SWu Fengguang 353b48c104dSWu Fengguang #define KBps(x) ((x) << (PAGE_SHIFT - 10)) 354b48c104dSWu Fengguang 355b48c104dSWu Fengguang TRACE_EVENT(bdi_dirty_ratelimit, 356b48c104dSWu Fengguang 357b48c104dSWu Fengguang TP_PROTO(struct backing_dev_info *bdi, 358b48c104dSWu Fengguang unsigned long dirty_rate, 359b48c104dSWu Fengguang unsigned long task_ratelimit), 360b48c104dSWu Fengguang 361b48c104dSWu Fengguang TP_ARGS(bdi, dirty_rate, task_ratelimit), 362b48c104dSWu Fengguang 363b48c104dSWu Fengguang TP_STRUCT__entry( 364b48c104dSWu Fengguang __array(char, bdi, 32) 365b48c104dSWu Fengguang __field(unsigned long, write_bw) 366b48c104dSWu Fengguang __field(unsigned long, avg_write_bw) 367b48c104dSWu Fengguang __field(unsigned long, dirty_rate) 368b48c104dSWu Fengguang __field(unsigned long, dirty_ratelimit) 369b48c104dSWu Fengguang __field(unsigned long, task_ratelimit) 370b48c104dSWu Fengguang __field(unsigned long, balanced_dirty_ratelimit) 371b48c104dSWu Fengguang ), 372b48c104dSWu Fengguang 373b48c104dSWu Fengguang TP_fast_assign( 374b48c104dSWu Fengguang strlcpy(__entry->bdi, dev_name(bdi->dev), 32); 375b48c104dSWu Fengguang __entry->write_bw = KBps(bdi->write_bandwidth); 376b48c104dSWu Fengguang __entry->avg_write_bw = KBps(bdi->avg_write_bandwidth); 377b48c104dSWu Fengguang __entry->dirty_rate = KBps(dirty_rate); 378b48c104dSWu Fengguang __entry->dirty_ratelimit = KBps(bdi->dirty_ratelimit); 379b48c104dSWu Fengguang __entry->task_ratelimit = KBps(task_ratelimit); 380b48c104dSWu Fengguang __entry->balanced_dirty_ratelimit = 381b48c104dSWu Fengguang KBps(bdi->balanced_dirty_ratelimit); 382b48c104dSWu Fengguang ), 383b48c104dSWu Fengguang 384b48c104dSWu Fengguang TP_printk("bdi %s: " 385b48c104dSWu Fengguang "write_bw=%lu awrite_bw=%lu dirty_rate=%lu " 386b48c104dSWu Fengguang "dirty_ratelimit=%lu task_ratelimit=%lu " 387b48c104dSWu Fengguang "balanced_dirty_ratelimit=%lu", 388b48c104dSWu Fengguang __entry->bdi, 389b48c104dSWu Fengguang __entry->write_bw, /* write bandwidth */ 390b48c104dSWu Fengguang __entry->avg_write_bw, /* avg write bandwidth */ 391b48c104dSWu Fengguang __entry->dirty_rate, /* bdi dirty rate */ 392b48c104dSWu Fengguang __entry->dirty_ratelimit, /* base ratelimit */ 393b48c104dSWu Fengguang __entry->task_ratelimit, /* ratelimit with position control */ 394b48c104dSWu Fengguang __entry->balanced_dirty_ratelimit /* the balanced ratelimit */ 395b48c104dSWu Fengguang ) 396b48c104dSWu Fengguang ); 397b48c104dSWu Fengguang 398ece13ac3SWu Fengguang TRACE_EVENT(balance_dirty_pages, 399ece13ac3SWu Fengguang 400ece13ac3SWu Fengguang TP_PROTO(struct backing_dev_info *bdi, 401ece13ac3SWu Fengguang unsigned long thresh, 402ece13ac3SWu Fengguang unsigned long bg_thresh, 403ece13ac3SWu Fengguang unsigned long dirty, 404ece13ac3SWu Fengguang unsigned long bdi_thresh, 405ece13ac3SWu Fengguang unsigned long bdi_dirty, 406ece13ac3SWu Fengguang unsigned long dirty_ratelimit, 407ece13ac3SWu Fengguang unsigned long task_ratelimit, 408ece13ac3SWu Fengguang unsigned long dirtied, 40983712358SWu Fengguang unsigned long period, 410ece13ac3SWu Fengguang long pause, 411ece13ac3SWu Fengguang unsigned long start_time), 412ece13ac3SWu Fengguang 413ece13ac3SWu Fengguang TP_ARGS(bdi, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty, 414ece13ac3SWu Fengguang dirty_ratelimit, task_ratelimit, 41583712358SWu Fengguang dirtied, period, pause, start_time), 416ece13ac3SWu Fengguang 417ece13ac3SWu Fengguang TP_STRUCT__entry( 418ece13ac3SWu Fengguang __array( char, bdi, 32) 419ece13ac3SWu Fengguang __field(unsigned long, limit) 420ece13ac3SWu Fengguang __field(unsigned long, setpoint) 421ece13ac3SWu Fengguang __field(unsigned long, dirty) 422ece13ac3SWu Fengguang __field(unsigned long, bdi_setpoint) 423ece13ac3SWu Fengguang __field(unsigned long, bdi_dirty) 424ece13ac3SWu Fengguang __field(unsigned long, dirty_ratelimit) 425ece13ac3SWu Fengguang __field(unsigned long, task_ratelimit) 426ece13ac3SWu Fengguang __field(unsigned int, dirtied) 427ece13ac3SWu Fengguang __field(unsigned int, dirtied_pause) 428ece13ac3SWu Fengguang __field(unsigned long, paused) 429ece13ac3SWu Fengguang __field( long, pause) 43083712358SWu Fengguang __field(unsigned long, period) 43183712358SWu Fengguang __field( long, think) 432ece13ac3SWu Fengguang ), 433ece13ac3SWu Fengguang 434ece13ac3SWu Fengguang TP_fast_assign( 435ece13ac3SWu Fengguang unsigned long freerun = (thresh + bg_thresh) / 2; 436ece13ac3SWu Fengguang strlcpy(__entry->bdi, dev_name(bdi->dev), 32); 437ece13ac3SWu Fengguang 438ece13ac3SWu Fengguang __entry->limit = global_dirty_limit; 439ece13ac3SWu Fengguang __entry->setpoint = (global_dirty_limit + freerun) / 2; 440ece13ac3SWu Fengguang __entry->dirty = dirty; 441ece13ac3SWu Fengguang __entry->bdi_setpoint = __entry->setpoint * 442ece13ac3SWu Fengguang bdi_thresh / (thresh + 1); 443ece13ac3SWu Fengguang __entry->bdi_dirty = bdi_dirty; 444ece13ac3SWu Fengguang __entry->dirty_ratelimit = KBps(dirty_ratelimit); 445ece13ac3SWu Fengguang __entry->task_ratelimit = KBps(task_ratelimit); 446ece13ac3SWu Fengguang __entry->dirtied = dirtied; 447ece13ac3SWu Fengguang __entry->dirtied_pause = current->nr_dirtied_pause; 44883712358SWu Fengguang __entry->think = current->dirty_paused_when == 0 ? 0 : 44983712358SWu Fengguang (long)(jiffies - current->dirty_paused_when) * 1000/HZ; 45083712358SWu Fengguang __entry->period = period * 1000 / HZ; 451ece13ac3SWu Fengguang __entry->pause = pause * 1000 / HZ; 452ece13ac3SWu Fengguang __entry->paused = (jiffies - start_time) * 1000 / HZ; 453ece13ac3SWu Fengguang ), 454ece13ac3SWu Fengguang 455ece13ac3SWu Fengguang 456ece13ac3SWu Fengguang TP_printk("bdi %s: " 457ece13ac3SWu Fengguang "limit=%lu setpoint=%lu dirty=%lu " 458ece13ac3SWu Fengguang "bdi_setpoint=%lu bdi_dirty=%lu " 459ece13ac3SWu Fengguang "dirty_ratelimit=%lu task_ratelimit=%lu " 460ece13ac3SWu Fengguang "dirtied=%u dirtied_pause=%u " 46183712358SWu Fengguang "paused=%lu pause=%ld period=%lu think=%ld", 462ece13ac3SWu Fengguang __entry->bdi, 463ece13ac3SWu Fengguang __entry->limit, 464ece13ac3SWu Fengguang __entry->setpoint, 465ece13ac3SWu Fengguang __entry->dirty, 466ece13ac3SWu Fengguang __entry->bdi_setpoint, 467ece13ac3SWu Fengguang __entry->bdi_dirty, 468ece13ac3SWu Fengguang __entry->dirty_ratelimit, 469ece13ac3SWu Fengguang __entry->task_ratelimit, 470ece13ac3SWu Fengguang __entry->dirtied, 471ece13ac3SWu Fengguang __entry->dirtied_pause, 472ece13ac3SWu Fengguang __entry->paused, /* ms */ 47383712358SWu Fengguang __entry->pause, /* ms */ 47483712358SWu Fengguang __entry->period, /* ms */ 47583712358SWu Fengguang __entry->think /* ms */ 476ece13ac3SWu Fengguang ) 477ece13ac3SWu Fengguang ); 478ece13ac3SWu Fengguang 479cc1676d9SJan Kara TRACE_EVENT(writeback_sb_inodes_requeue, 480cc1676d9SJan Kara 481cc1676d9SJan Kara TP_PROTO(struct inode *inode), 482cc1676d9SJan Kara TP_ARGS(inode), 483cc1676d9SJan Kara 484cc1676d9SJan Kara TP_STRUCT__entry( 485cc1676d9SJan Kara __array(char, name, 32) 486cc1676d9SJan Kara __field(unsigned long, ino) 487cc1676d9SJan Kara __field(unsigned long, state) 488cc1676d9SJan Kara __field(unsigned long, dirtied_when) 489cc1676d9SJan Kara ), 490cc1676d9SJan Kara 491cc1676d9SJan Kara TP_fast_assign( 492cc1676d9SJan Kara strncpy(__entry->name, 493cc1676d9SJan Kara dev_name(inode_to_bdi(inode)->dev), 32); 494cc1676d9SJan Kara __entry->ino = inode->i_ino; 495cc1676d9SJan Kara __entry->state = inode->i_state; 496cc1676d9SJan Kara __entry->dirtied_when = inode->dirtied_when; 497cc1676d9SJan Kara ), 498cc1676d9SJan Kara 499cc1676d9SJan Kara TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu", 500cc1676d9SJan Kara __entry->name, 501cc1676d9SJan Kara __entry->ino, 502cc1676d9SJan Kara show_inode_state(__entry->state), 503cc1676d9SJan Kara __entry->dirtied_when, 504cc1676d9SJan Kara (jiffies - __entry->dirtied_when) / HZ 505cc1676d9SJan Kara ) 506cc1676d9SJan Kara ); 507cc1676d9SJan Kara 50852bb9198SMel Gorman DECLARE_EVENT_CLASS(writeback_congest_waited_template, 50952bb9198SMel Gorman 51052bb9198SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 51152bb9198SMel Gorman 51252bb9198SMel Gorman TP_ARGS(usec_timeout, usec_delayed), 51352bb9198SMel Gorman 51452bb9198SMel Gorman TP_STRUCT__entry( 51552bb9198SMel Gorman __field( unsigned int, usec_timeout ) 51652bb9198SMel Gorman __field( unsigned int, usec_delayed ) 51752bb9198SMel Gorman ), 51852bb9198SMel Gorman 51952bb9198SMel Gorman TP_fast_assign( 52052bb9198SMel Gorman __entry->usec_timeout = usec_timeout; 52152bb9198SMel Gorman __entry->usec_delayed = usec_delayed; 52252bb9198SMel Gorman ), 52352bb9198SMel Gorman 52452bb9198SMel Gorman TP_printk("usec_timeout=%u usec_delayed=%u", 52552bb9198SMel Gorman __entry->usec_timeout, 52652bb9198SMel Gorman __entry->usec_delayed) 52752bb9198SMel Gorman ); 52852bb9198SMel Gorman 52952bb9198SMel Gorman DEFINE_EVENT(writeback_congest_waited_template, writeback_congestion_wait, 53052bb9198SMel Gorman 53152bb9198SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 53252bb9198SMel Gorman 53352bb9198SMel Gorman TP_ARGS(usec_timeout, usec_delayed) 53452bb9198SMel Gorman ); 53552bb9198SMel Gorman 5360e093d99SMel Gorman DEFINE_EVENT(writeback_congest_waited_template, writeback_wait_iff_congested, 5370e093d99SMel Gorman 5380e093d99SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 5390e093d99SMel Gorman 5400e093d99SMel Gorman TP_ARGS(usec_timeout, usec_delayed) 5410e093d99SMel Gorman ); 5420e093d99SMel Gorman 543251d6a47SWu Fengguang DECLARE_EVENT_CLASS(writeback_single_inode_template, 544251d6a47SWu Fengguang 545251d6a47SWu Fengguang TP_PROTO(struct inode *inode, 546251d6a47SWu Fengguang struct writeback_control *wbc, 547251d6a47SWu Fengguang unsigned long nr_to_write 548251d6a47SWu Fengguang ), 549251d6a47SWu Fengguang 550251d6a47SWu Fengguang TP_ARGS(inode, wbc, nr_to_write), 551251d6a47SWu Fengguang 552251d6a47SWu Fengguang TP_STRUCT__entry( 553251d6a47SWu Fengguang __array(char, name, 32) 554251d6a47SWu Fengguang __field(unsigned long, ino) 555251d6a47SWu Fengguang __field(unsigned long, state) 556c8ad6206SWu Fengguang __field(unsigned long, dirtied_when) 557251d6a47SWu Fengguang __field(unsigned long, writeback_index) 558251d6a47SWu Fengguang __field(long, nr_to_write) 559251d6a47SWu Fengguang __field(unsigned long, wrote) 560251d6a47SWu Fengguang ), 561251d6a47SWu Fengguang 562251d6a47SWu Fengguang TP_fast_assign( 563251d6a47SWu Fengguang strncpy(__entry->name, 56415eb77a0SWu Fengguang dev_name(inode_to_bdi(inode)->dev), 32); 565251d6a47SWu Fengguang __entry->ino = inode->i_ino; 566251d6a47SWu Fengguang __entry->state = inode->i_state; 567c8ad6206SWu Fengguang __entry->dirtied_when = inode->dirtied_when; 568251d6a47SWu Fengguang __entry->writeback_index = inode->i_mapping->writeback_index; 569251d6a47SWu Fengguang __entry->nr_to_write = nr_to_write; 570251d6a47SWu Fengguang __entry->wrote = nr_to_write - wbc->nr_to_write; 571251d6a47SWu Fengguang ), 572251d6a47SWu Fengguang 573c8ad6206SWu Fengguang TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu " 574251d6a47SWu Fengguang "index=%lu to_write=%ld wrote=%lu", 575251d6a47SWu Fengguang __entry->name, 576251d6a47SWu Fengguang __entry->ino, 577251d6a47SWu Fengguang show_inode_state(__entry->state), 578c8ad6206SWu Fengguang __entry->dirtied_when, 579c8ad6206SWu Fengguang (jiffies - __entry->dirtied_when) / HZ, 580251d6a47SWu Fengguang __entry->writeback_index, 581251d6a47SWu Fengguang __entry->nr_to_write, 582251d6a47SWu Fengguang __entry->wrote 583251d6a47SWu Fengguang ) 584251d6a47SWu Fengguang ); 585251d6a47SWu Fengguang 5869fb0a7daSTejun Heo DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode_start, 5879fb0a7daSTejun Heo TP_PROTO(struct inode *inode, 5889fb0a7daSTejun Heo struct writeback_control *wbc, 5899fb0a7daSTejun Heo unsigned long nr_to_write), 5909fb0a7daSTejun Heo TP_ARGS(inode, wbc, nr_to_write) 5919fb0a7daSTejun Heo ); 5929fb0a7daSTejun Heo 593251d6a47SWu Fengguang DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode, 594251d6a47SWu Fengguang TP_PROTO(struct inode *inode, 595251d6a47SWu Fengguang struct writeback_control *wbc, 596251d6a47SWu Fengguang unsigned long nr_to_write), 597251d6a47SWu Fengguang TP_ARGS(inode, wbc, nr_to_write) 598251d6a47SWu Fengguang ); 599251d6a47SWu Fengguang 600455b2864SDave Chinner #endif /* _TRACE_WRITEBACK_H */ 601455b2864SDave Chinner 602455b2864SDave Chinner /* This part must be outside protection */ 603455b2864SDave Chinner #include <trace/define_trace.h> 604