1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2455b2864SDave Chinner #undef TRACE_SYSTEM 3455b2864SDave Chinner #define TRACE_SYSTEM writeback 4455b2864SDave Chinner 5455b2864SDave Chinner #if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) 6455b2864SDave Chinner #define _TRACE_WRITEBACK_H 7455b2864SDave Chinner 8f479447aSSteven Rostedt (Red Hat) #include <linux/tracepoint.h> 9455b2864SDave Chinner #include <linux/backing-dev.h> 10455b2864SDave Chinner #include <linux/writeback.h> 11455b2864SDave Chinner 12251d6a47SWu Fengguang #define show_inode_state(state) \ 13251d6a47SWu Fengguang __print_flags(state, "|", \ 14251d6a47SWu Fengguang {I_DIRTY_SYNC, "I_DIRTY_SYNC"}, \ 15251d6a47SWu Fengguang {I_DIRTY_DATASYNC, "I_DIRTY_DATASYNC"}, \ 16251d6a47SWu Fengguang {I_DIRTY_PAGES, "I_DIRTY_PAGES"}, \ 17251d6a47SWu Fengguang {I_NEW, "I_NEW"}, \ 18251d6a47SWu Fengguang {I_WILL_FREE, "I_WILL_FREE"}, \ 19251d6a47SWu Fengguang {I_FREEING, "I_FREEING"}, \ 20251d6a47SWu Fengguang {I_CLEAR, "I_CLEAR"}, \ 21251d6a47SWu Fengguang {I_SYNC, "I_SYNC"}, \ 220ae45f63STheodore Ts'o {I_DIRTY_TIME, "I_DIRTY_TIME"}, \ 230ae45f63STheodore Ts'o {I_DIRTY_TIME_EXPIRED, "I_DIRTY_TIME_EXPIRED"}, \ 24251d6a47SWu Fengguang {I_REFERENCED, "I_REFERENCED"} \ 25251d6a47SWu Fengguang ) 26251d6a47SWu Fengguang 2791df6089SSteven Rostedt (Red Hat) /* enums need to be exported to user space */ 2891df6089SSteven Rostedt (Red Hat) #undef EM 2991df6089SSteven Rostedt (Red Hat) #undef EMe 3091df6089SSteven Rostedt (Red Hat) #define EM(a,b) TRACE_DEFINE_ENUM(a); 3191df6089SSteven Rostedt (Red Hat) #define EMe(a,b) TRACE_DEFINE_ENUM(a); 3291df6089SSteven Rostedt (Red Hat) 33b3bba872SWu Fengguang #define WB_WORK_REASON \ 3491df6089SSteven Rostedt (Red Hat) EM( WB_REASON_BACKGROUND, "background") \ 35726d061fSJohannes Weiner EM( WB_REASON_VMSCAN, "vmscan") \ 3691df6089SSteven Rostedt (Red Hat) EM( WB_REASON_SYNC, "sync") \ 3791df6089SSteven Rostedt (Red Hat) EM( WB_REASON_PERIODIC, "periodic") \ 3891df6089SSteven Rostedt (Red Hat) EM( WB_REASON_LAPTOP_TIMER, "laptop_timer") \ 3991df6089SSteven Rostedt (Red Hat) EM( WB_REASON_FREE_MORE_MEM, "free_more_memory") \ 4091df6089SSteven Rostedt (Red Hat) EM( WB_REASON_FS_FREE_SPACE, "fs_free_space") \ 4191df6089SSteven Rostedt (Red Hat) EMe(WB_REASON_FORKER_THREAD, "forker_thread") 4291df6089SSteven Rostedt (Red Hat) 4391df6089SSteven Rostedt (Red Hat) WB_WORK_REASON 4491df6089SSteven Rostedt (Red Hat) 4591df6089SSteven Rostedt (Red Hat) /* 4691df6089SSteven Rostedt (Red Hat) * Now redefine the EM() and EMe() macros to map the enums to the strings 4791df6089SSteven Rostedt (Red Hat) * that will be printed in the output. 4891df6089SSteven Rostedt (Red Hat) */ 4991df6089SSteven Rostedt (Red Hat) #undef EM 5091df6089SSteven Rostedt (Red Hat) #undef EMe 5191df6089SSteven Rostedt (Red Hat) #define EM(a,b) { a, b }, 5291df6089SSteven Rostedt (Red Hat) #define EMe(a,b) { a, b } 53b3bba872SWu Fengguang 54455b2864SDave Chinner struct wb_writeback_work; 55455b2864SDave Chinner 5619343b5bSYafang Shao DECLARE_EVENT_CLASS(writeback_page_template, 579fb0a7daSTejun Heo 589fb0a7daSTejun Heo TP_PROTO(struct page *page, struct address_space *mapping), 599fb0a7daSTejun Heo 609fb0a7daSTejun Heo TP_ARGS(page, mapping), 619fb0a7daSTejun Heo 629fb0a7daSTejun Heo TP_STRUCT__entry ( 639fb0a7daSTejun Heo __array(char, name, 32) 64f05499a0STejun Heo __field(ino_t, ino) 659fb0a7daSTejun Heo __field(pgoff_t, index) 669fb0a7daSTejun Heo ), 679fb0a7daSTejun Heo 689fb0a7daSTejun Heo TP_fast_assign( 69d1a445d3SQian Cai strscpy_pad(__entry->name, 70*68f23b89STheodore Ts'o bdi_dev_name(mapping ? inode_to_bdi(mapping->host) : 71*68f23b89STheodore Ts'o NULL), 32); 729fb0a7daSTejun Heo __entry->ino = mapping ? mapping->host->i_ino : 0; 739fb0a7daSTejun Heo __entry->index = page->index; 749fb0a7daSTejun Heo ), 759fb0a7daSTejun Heo 769fb0a7daSTejun Heo TP_printk("bdi %s: ino=%lu index=%lu", 779fb0a7daSTejun Heo __entry->name, 7840363cf1SQian Cai (unsigned long)__entry->ino, 799fb0a7daSTejun Heo __entry->index 809fb0a7daSTejun Heo ) 819fb0a7daSTejun Heo ); 829fb0a7daSTejun Heo 8319343b5bSYafang Shao DEFINE_EVENT(writeback_page_template, writeback_dirty_page, 8419343b5bSYafang Shao 8519343b5bSYafang Shao TP_PROTO(struct page *page, struct address_space *mapping), 8619343b5bSYafang Shao 8719343b5bSYafang Shao TP_ARGS(page, mapping) 8819343b5bSYafang Shao ); 8919343b5bSYafang Shao 9019343b5bSYafang Shao DEFINE_EVENT(writeback_page_template, wait_on_page_writeback, 9119343b5bSYafang Shao 9219343b5bSYafang Shao TP_PROTO(struct page *page, struct address_space *mapping), 9319343b5bSYafang Shao 9419343b5bSYafang Shao TP_ARGS(page, mapping) 9519343b5bSYafang Shao ); 9619343b5bSYafang Shao 979fb0a7daSTejun Heo DECLARE_EVENT_CLASS(writeback_dirty_inode_template, 989fb0a7daSTejun Heo 999fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 1009fb0a7daSTejun Heo 1019fb0a7daSTejun Heo TP_ARGS(inode, flags), 1029fb0a7daSTejun Heo 1039fb0a7daSTejun Heo TP_STRUCT__entry ( 1049fb0a7daSTejun Heo __array(char, name, 32) 105f05499a0STejun Heo __field(ino_t, ino) 1060ae45f63STheodore Ts'o __field(unsigned long, state) 1079fb0a7daSTejun Heo __field(unsigned long, flags) 1089fb0a7daSTejun Heo ), 1099fb0a7daSTejun Heo 1109fb0a7daSTejun Heo TP_fast_assign( 111de1414a6SChristoph Hellwig struct backing_dev_info *bdi = inode_to_bdi(inode); 1129fb0a7daSTejun Heo 1139fb0a7daSTejun Heo /* may be called for files on pseudo FSes w/ unregistered bdi */ 114*68f23b89STheodore Ts'o strscpy_pad(__entry->name, bdi_dev_name(bdi), 32); 1159fb0a7daSTejun Heo __entry->ino = inode->i_ino; 1160ae45f63STheodore Ts'o __entry->state = inode->i_state; 1179fb0a7daSTejun Heo __entry->flags = flags; 1189fb0a7daSTejun Heo ), 1199fb0a7daSTejun Heo 1200ae45f63STheodore Ts'o TP_printk("bdi %s: ino=%lu state=%s flags=%s", 1219fb0a7daSTejun Heo __entry->name, 12240363cf1SQian Cai (unsigned long)__entry->ino, 1230ae45f63STheodore Ts'o show_inode_state(__entry->state), 1249fb0a7daSTejun Heo show_inode_state(__entry->flags) 1259fb0a7daSTejun Heo ) 1269fb0a7daSTejun Heo ); 1279fb0a7daSTejun Heo 1280ae45f63STheodore Ts'o DEFINE_EVENT(writeback_dirty_inode_template, writeback_mark_inode_dirty, 1290ae45f63STheodore Ts'o 1300ae45f63STheodore Ts'o TP_PROTO(struct inode *inode, int flags), 1310ae45f63STheodore Ts'o 1320ae45f63STheodore Ts'o TP_ARGS(inode, flags) 1330ae45f63STheodore Ts'o ); 1340ae45f63STheodore Ts'o 1359fb0a7daSTejun Heo DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode_start, 1369fb0a7daSTejun Heo 1379fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 1389fb0a7daSTejun Heo 1399fb0a7daSTejun Heo TP_ARGS(inode, flags) 1409fb0a7daSTejun Heo ); 1419fb0a7daSTejun Heo 1429fb0a7daSTejun Heo DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode, 1439fb0a7daSTejun Heo 1449fb0a7daSTejun Heo TP_PROTO(struct inode *inode, int flags), 1459fb0a7daSTejun Heo 1469fb0a7daSTejun Heo TP_ARGS(inode, flags) 1479fb0a7daSTejun Heo ); 1489fb0a7daSTejun Heo 1495634cc2aSTejun Heo #ifdef CREATE_TRACE_POINTS 1505634cc2aSTejun Heo #ifdef CONFIG_CGROUP_WRITEBACK 1515634cc2aSTejun Heo 152f05499a0STejun Heo static inline ino_t __trace_wb_assign_cgroup(struct bdi_writeback *wb) 1535634cc2aSTejun Heo { 15467c0496eSTejun Heo return cgroup_ino(wb->memcg_css->cgroup); 1555634cc2aSTejun Heo } 1565634cc2aSTejun Heo 157f05499a0STejun Heo static inline ino_t __trace_wbc_assign_cgroup(struct writeback_control *wbc) 1585634cc2aSTejun Heo { 1595634cc2aSTejun Heo if (wbc->wb) 160a664edb3SYang Shi return __trace_wb_assign_cgroup(wbc->wb); 1615634cc2aSTejun Heo else 162f05499a0STejun Heo return 1; 1635634cc2aSTejun Heo } 1645634cc2aSTejun Heo #else /* CONFIG_CGROUP_WRITEBACK */ 1655634cc2aSTejun Heo 166f05499a0STejun Heo static inline ino_t __trace_wb_assign_cgroup(struct bdi_writeback *wb) 1675634cc2aSTejun Heo { 168f05499a0STejun Heo return 1; 1695634cc2aSTejun Heo } 1705634cc2aSTejun Heo 171f05499a0STejun Heo static inline ino_t __trace_wbc_assign_cgroup(struct writeback_control *wbc) 1725634cc2aSTejun Heo { 173f05499a0STejun Heo return 1; 1745634cc2aSTejun Heo } 1755634cc2aSTejun Heo 1765634cc2aSTejun Heo #endif /* CONFIG_CGROUP_WRITEBACK */ 1775634cc2aSTejun Heo #endif /* CREATE_TRACE_POINTS */ 1785634cc2aSTejun Heo 1793a8e9ac8STejun Heo #ifdef CONFIG_CGROUP_WRITEBACK 1803a8e9ac8STejun Heo TRACE_EVENT(inode_foreign_history, 1813a8e9ac8STejun Heo 1823a8e9ac8STejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc, 1833a8e9ac8STejun Heo unsigned int history), 1843a8e9ac8STejun Heo 1853a8e9ac8STejun Heo TP_ARGS(inode, wbc, history), 1863a8e9ac8STejun Heo 1873a8e9ac8STejun Heo TP_STRUCT__entry( 1883a8e9ac8STejun Heo __array(char, name, 32) 189f05499a0STejun Heo __field(ino_t, ino) 190f05499a0STejun Heo __field(ino_t, cgroup_ino) 1913a8e9ac8STejun Heo __field(unsigned int, history) 1923a8e9ac8STejun Heo ), 1933a8e9ac8STejun Heo 1943a8e9ac8STejun Heo TP_fast_assign( 195*68f23b89STheodore Ts'o strncpy(__entry->name, bdi_dev_name(inode_to_bdi(inode)), 32); 1963a8e9ac8STejun Heo __entry->ino = inode->i_ino; 1973a8e9ac8STejun Heo __entry->cgroup_ino = __trace_wbc_assign_cgroup(wbc); 1983a8e9ac8STejun Heo __entry->history = history; 1993a8e9ac8STejun Heo ), 2003a8e9ac8STejun Heo 201f05499a0STejun Heo TP_printk("bdi %s: ino=%lu cgroup_ino=%lu history=0x%x", 2023a8e9ac8STejun Heo __entry->name, 20340363cf1SQian Cai (unsigned long)__entry->ino, 20440363cf1SQian Cai (unsigned long)__entry->cgroup_ino, 2053a8e9ac8STejun Heo __entry->history 2063a8e9ac8STejun Heo ) 2073a8e9ac8STejun Heo ); 2083a8e9ac8STejun Heo 2093a8e9ac8STejun Heo TRACE_EVENT(inode_switch_wbs, 2103a8e9ac8STejun Heo 2113a8e9ac8STejun Heo TP_PROTO(struct inode *inode, struct bdi_writeback *old_wb, 2123a8e9ac8STejun Heo struct bdi_writeback *new_wb), 2133a8e9ac8STejun Heo 2143a8e9ac8STejun Heo TP_ARGS(inode, old_wb, new_wb), 2153a8e9ac8STejun Heo 2163a8e9ac8STejun Heo TP_STRUCT__entry( 2173a8e9ac8STejun Heo __array(char, name, 32) 218f05499a0STejun Heo __field(ino_t, ino) 219f05499a0STejun Heo __field(ino_t, old_cgroup_ino) 220f05499a0STejun Heo __field(ino_t, new_cgroup_ino) 2213a8e9ac8STejun Heo ), 2223a8e9ac8STejun Heo 2233a8e9ac8STejun Heo TP_fast_assign( 224*68f23b89STheodore Ts'o strncpy(__entry->name, bdi_dev_name(old_wb->bdi), 32); 2253a8e9ac8STejun Heo __entry->ino = inode->i_ino; 2263a8e9ac8STejun Heo __entry->old_cgroup_ino = __trace_wb_assign_cgroup(old_wb); 2273a8e9ac8STejun Heo __entry->new_cgroup_ino = __trace_wb_assign_cgroup(new_wb); 2283a8e9ac8STejun Heo ), 2293a8e9ac8STejun Heo 230f05499a0STejun Heo TP_printk("bdi %s: ino=%lu old_cgroup_ino=%lu new_cgroup_ino=%lu", 2313a8e9ac8STejun Heo __entry->name, 23240363cf1SQian Cai (unsigned long)__entry->ino, 23340363cf1SQian Cai (unsigned long)__entry->old_cgroup_ino, 23440363cf1SQian Cai (unsigned long)__entry->new_cgroup_ino 2353a8e9ac8STejun Heo ) 2363a8e9ac8STejun Heo ); 2373a8e9ac8STejun Heo 2383a8e9ac8STejun Heo TRACE_EVENT(track_foreign_dirty, 2393a8e9ac8STejun Heo 2403a8e9ac8STejun Heo TP_PROTO(struct page *page, struct bdi_writeback *wb), 2413a8e9ac8STejun Heo 2423a8e9ac8STejun Heo TP_ARGS(page, wb), 2433a8e9ac8STejun Heo 2443a8e9ac8STejun Heo TP_STRUCT__entry( 2453a8e9ac8STejun Heo __array(char, name, 32) 2463a8e9ac8STejun Heo __field(u64, bdi_id) 247f05499a0STejun Heo __field(ino_t, ino) 2483a8e9ac8STejun Heo __field(unsigned int, memcg_id) 249f05499a0STejun Heo __field(ino_t, cgroup_ino) 250f05499a0STejun Heo __field(ino_t, page_cgroup_ino) 2513a8e9ac8STejun Heo ), 2523a8e9ac8STejun Heo 2533a8e9ac8STejun Heo TP_fast_assign( 2540feacaa2STejun Heo struct address_space *mapping = page_mapping(page); 2550feacaa2STejun Heo struct inode *inode = mapping ? mapping->host : NULL; 2560feacaa2STejun Heo 257*68f23b89STheodore Ts'o strncpy(__entry->name, bdi_dev_name(wb->bdi), 32); 2583a8e9ac8STejun Heo __entry->bdi_id = wb->bdi->id; 2590feacaa2STejun Heo __entry->ino = inode ? inode->i_ino : 0; 2603a8e9ac8STejun Heo __entry->memcg_id = wb->memcg_css->id; 2613a8e9ac8STejun Heo __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 26267c0496eSTejun Heo __entry->page_cgroup_ino = cgroup_ino(page->mem_cgroup->css.cgroup); 2633a8e9ac8STejun Heo ), 2643a8e9ac8STejun Heo 265f05499a0STejun Heo TP_printk("bdi %s[%llu]: ino=%lu memcg_id=%u cgroup_ino=%lu page_cgroup_ino=%lu", 2663a8e9ac8STejun Heo __entry->name, 2673a8e9ac8STejun Heo __entry->bdi_id, 26840363cf1SQian Cai (unsigned long)__entry->ino, 2693a8e9ac8STejun Heo __entry->memcg_id, 27040363cf1SQian Cai (unsigned long)__entry->cgroup_ino, 27140363cf1SQian Cai (unsigned long)__entry->page_cgroup_ino 2723a8e9ac8STejun Heo ) 2733a8e9ac8STejun Heo ); 2743a8e9ac8STejun Heo 2753a8e9ac8STejun Heo TRACE_EVENT(flush_foreign, 2763a8e9ac8STejun Heo 2773a8e9ac8STejun Heo TP_PROTO(struct bdi_writeback *wb, unsigned int frn_bdi_id, 2783a8e9ac8STejun Heo unsigned int frn_memcg_id), 2793a8e9ac8STejun Heo 2803a8e9ac8STejun Heo TP_ARGS(wb, frn_bdi_id, frn_memcg_id), 2813a8e9ac8STejun Heo 2823a8e9ac8STejun Heo TP_STRUCT__entry( 2833a8e9ac8STejun Heo __array(char, name, 32) 284f05499a0STejun Heo __field(ino_t, cgroup_ino) 2853a8e9ac8STejun Heo __field(unsigned int, frn_bdi_id) 2863a8e9ac8STejun Heo __field(unsigned int, frn_memcg_id) 2873a8e9ac8STejun Heo ), 2883a8e9ac8STejun Heo 2893a8e9ac8STejun Heo TP_fast_assign( 290*68f23b89STheodore Ts'o strncpy(__entry->name, bdi_dev_name(wb->bdi), 32); 2913a8e9ac8STejun Heo __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 2923a8e9ac8STejun Heo __entry->frn_bdi_id = frn_bdi_id; 2933a8e9ac8STejun Heo __entry->frn_memcg_id = frn_memcg_id; 2943a8e9ac8STejun Heo ), 2953a8e9ac8STejun Heo 296f05499a0STejun Heo TP_printk("bdi %s: cgroup_ino=%lu frn_bdi_id=%u frn_memcg_id=%u", 2973a8e9ac8STejun Heo __entry->name, 29840363cf1SQian Cai (unsigned long)__entry->cgroup_ino, 2993a8e9ac8STejun Heo __entry->frn_bdi_id, 3003a8e9ac8STejun Heo __entry->frn_memcg_id 3013a8e9ac8STejun Heo ) 3023a8e9ac8STejun Heo ); 3033a8e9ac8STejun Heo #endif 3043a8e9ac8STejun Heo 3059fb0a7daSTejun Heo DECLARE_EVENT_CLASS(writeback_write_inode_template, 3069fb0a7daSTejun Heo 3079fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 3089fb0a7daSTejun Heo 3099fb0a7daSTejun Heo TP_ARGS(inode, wbc), 3109fb0a7daSTejun Heo 3119fb0a7daSTejun Heo TP_STRUCT__entry ( 3129fb0a7daSTejun Heo __array(char, name, 32) 313f05499a0STejun Heo __field(ino_t, ino) 3149fb0a7daSTejun Heo __field(int, sync_mode) 315f05499a0STejun Heo __field(ino_t, cgroup_ino) 3169fb0a7daSTejun Heo ), 3179fb0a7daSTejun Heo 3189fb0a7daSTejun Heo TP_fast_assign( 319d1a445d3SQian Cai strscpy_pad(__entry->name, 320*68f23b89STheodore Ts'o bdi_dev_name(inode_to_bdi(inode)), 32); 3219fb0a7daSTejun Heo __entry->ino = inode->i_ino; 3229fb0a7daSTejun Heo __entry->sync_mode = wbc->sync_mode; 323a664edb3SYang Shi __entry->cgroup_ino = __trace_wbc_assign_cgroup(wbc); 3249fb0a7daSTejun Heo ), 3259fb0a7daSTejun Heo 326f05499a0STejun Heo TP_printk("bdi %s: ino=%lu sync_mode=%d cgroup_ino=%lu", 3279fb0a7daSTejun Heo __entry->name, 32840363cf1SQian Cai (unsigned long)__entry->ino, 3295634cc2aSTejun Heo __entry->sync_mode, 33040363cf1SQian Cai (unsigned long)__entry->cgroup_ino 3319fb0a7daSTejun Heo ) 3329fb0a7daSTejun Heo ); 3339fb0a7daSTejun Heo 3349fb0a7daSTejun Heo DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode_start, 3359fb0a7daSTejun Heo 3369fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 3379fb0a7daSTejun Heo 3389fb0a7daSTejun Heo TP_ARGS(inode, wbc) 3399fb0a7daSTejun Heo ); 3409fb0a7daSTejun Heo 3419fb0a7daSTejun Heo DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode, 3429fb0a7daSTejun Heo 3439fb0a7daSTejun Heo TP_PROTO(struct inode *inode, struct writeback_control *wbc), 3449fb0a7daSTejun Heo 3459fb0a7daSTejun Heo TP_ARGS(inode, wbc) 3469fb0a7daSTejun Heo ); 3479fb0a7daSTejun Heo 348455b2864SDave Chinner DECLARE_EVENT_CLASS(writeback_work_class, 3495634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), 3505634cc2aSTejun Heo TP_ARGS(wb, work), 351455b2864SDave Chinner TP_STRUCT__entry( 352455b2864SDave Chinner __array(char, name, 32) 353455b2864SDave Chinner __field(long, nr_pages) 354455b2864SDave Chinner __field(dev_t, sb_dev) 355455b2864SDave Chinner __field(int, sync_mode) 356455b2864SDave Chinner __field(int, for_kupdate) 357455b2864SDave Chinner __field(int, range_cyclic) 358455b2864SDave Chinner __field(int, for_background) 3590e175a18SCurt Wohlgemuth __field(int, reason) 360f05499a0STejun Heo __field(ino_t, cgroup_ino) 361455b2864SDave Chinner ), 362455b2864SDave Chinner TP_fast_assign( 363*68f23b89STheodore Ts'o strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32); 364455b2864SDave Chinner __entry->nr_pages = work->nr_pages; 365455b2864SDave Chinner __entry->sb_dev = work->sb ? work->sb->s_dev : 0; 366455b2864SDave Chinner __entry->sync_mode = work->sync_mode; 367455b2864SDave Chinner __entry->for_kupdate = work->for_kupdate; 368455b2864SDave Chinner __entry->range_cyclic = work->range_cyclic; 369455b2864SDave Chinner __entry->for_background = work->for_background; 3700e175a18SCurt Wohlgemuth __entry->reason = work->reason; 371a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 372455b2864SDave Chinner ), 373455b2864SDave Chinner TP_printk("bdi %s: sb_dev %d:%d nr_pages=%ld sync_mode=%d " 374f05499a0STejun Heo "kupdate=%d range_cyclic=%d background=%d reason=%s cgroup_ino=%lu", 375455b2864SDave Chinner __entry->name, 376455b2864SDave Chinner MAJOR(__entry->sb_dev), MINOR(__entry->sb_dev), 377455b2864SDave Chinner __entry->nr_pages, 378455b2864SDave Chinner __entry->sync_mode, 379455b2864SDave Chinner __entry->for_kupdate, 380455b2864SDave Chinner __entry->range_cyclic, 3810e175a18SCurt Wohlgemuth __entry->for_background, 3825634cc2aSTejun Heo __print_symbolic(__entry->reason, WB_WORK_REASON), 38340363cf1SQian Cai (unsigned long)__entry->cgroup_ino 384455b2864SDave Chinner ) 385455b2864SDave Chinner ); 386455b2864SDave Chinner #define DEFINE_WRITEBACK_WORK_EVENT(name) \ 387455b2864SDave Chinner DEFINE_EVENT(writeback_work_class, name, \ 3885634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), \ 3895634cc2aSTejun Heo TP_ARGS(wb, work)) 390455b2864SDave Chinner DEFINE_WRITEBACK_WORK_EVENT(writeback_queue); 391455b2864SDave Chinner DEFINE_WRITEBACK_WORK_EVENT(writeback_exec); 392d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_start); 393d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_written); 394d46db3d5SWu Fengguang DEFINE_WRITEBACK_WORK_EVENT(writeback_wait); 395455b2864SDave Chinner 396455b2864SDave Chinner TRACE_EVENT(writeback_pages_written, 397455b2864SDave Chinner TP_PROTO(long pages_written), 398455b2864SDave Chinner TP_ARGS(pages_written), 399455b2864SDave Chinner TP_STRUCT__entry( 400455b2864SDave Chinner __field(long, pages) 401455b2864SDave Chinner ), 402455b2864SDave Chinner TP_fast_assign( 403455b2864SDave Chinner __entry->pages = pages_written; 404455b2864SDave Chinner ), 405455b2864SDave Chinner TP_printk("%ld", __entry->pages) 406455b2864SDave Chinner ); 407455b2864SDave Chinner 408455b2864SDave Chinner DECLARE_EVENT_CLASS(writeback_class, 4095634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb), 4105634cc2aSTejun Heo TP_ARGS(wb), 4115634cc2aSTejun Heo TP_STRUCT__entry( 4125634cc2aSTejun Heo __array(char, name, 32) 413f05499a0STejun Heo __field(ino_t, cgroup_ino) 4145634cc2aSTejun Heo ), 4155634cc2aSTejun Heo TP_fast_assign( 416*68f23b89STheodore Ts'o strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32); 417a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 4185634cc2aSTejun Heo ), 419f05499a0STejun Heo TP_printk("bdi %s: cgroup_ino=%lu", 4205634cc2aSTejun Heo __entry->name, 42140363cf1SQian Cai (unsigned long)__entry->cgroup_ino 4225634cc2aSTejun Heo ) 4235634cc2aSTejun Heo ); 4245634cc2aSTejun Heo #define DEFINE_WRITEBACK_EVENT(name) \ 4255634cc2aSTejun Heo DEFINE_EVENT(writeback_class, name, \ 4265634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb), \ 4275634cc2aSTejun Heo TP_ARGS(wb)) 4285634cc2aSTejun Heo 4295634cc2aSTejun Heo DEFINE_WRITEBACK_EVENT(writeback_wake_background); 4305634cc2aSTejun Heo 4315634cc2aSTejun Heo TRACE_EVENT(writeback_bdi_register, 432455b2864SDave Chinner TP_PROTO(struct backing_dev_info *bdi), 433455b2864SDave Chinner TP_ARGS(bdi), 434455b2864SDave Chinner TP_STRUCT__entry( 435455b2864SDave Chinner __array(char, name, 32) 436455b2864SDave Chinner ), 437455b2864SDave Chinner TP_fast_assign( 438*68f23b89STheodore Ts'o strscpy_pad(__entry->name, bdi_dev_name(bdi), 32); 439455b2864SDave Chinner ), 440455b2864SDave Chinner TP_printk("bdi %s", 441455b2864SDave Chinner __entry->name 442455b2864SDave Chinner ) 443455b2864SDave Chinner ); 444455b2864SDave Chinner 445028c2dd1SDave Chinner DECLARE_EVENT_CLASS(wbc_class, 446028c2dd1SDave Chinner TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), 447028c2dd1SDave Chinner TP_ARGS(wbc, bdi), 448028c2dd1SDave Chinner TP_STRUCT__entry( 449028c2dd1SDave Chinner __array(char, name, 32) 450028c2dd1SDave Chinner __field(long, nr_to_write) 451028c2dd1SDave Chinner __field(long, pages_skipped) 452028c2dd1SDave Chinner __field(int, sync_mode) 453028c2dd1SDave Chinner __field(int, for_kupdate) 454028c2dd1SDave Chinner __field(int, for_background) 455028c2dd1SDave Chinner __field(int, for_reclaim) 456028c2dd1SDave Chinner __field(int, range_cyclic) 457028c2dd1SDave Chinner __field(long, range_start) 458028c2dd1SDave Chinner __field(long, range_end) 459f05499a0STejun Heo __field(ino_t, cgroup_ino) 460028c2dd1SDave Chinner ), 461028c2dd1SDave Chinner 462028c2dd1SDave Chinner TP_fast_assign( 463*68f23b89STheodore Ts'o strscpy_pad(__entry->name, bdi_dev_name(bdi), 32); 464028c2dd1SDave Chinner __entry->nr_to_write = wbc->nr_to_write; 465028c2dd1SDave Chinner __entry->pages_skipped = wbc->pages_skipped; 466028c2dd1SDave Chinner __entry->sync_mode = wbc->sync_mode; 467028c2dd1SDave Chinner __entry->for_kupdate = wbc->for_kupdate; 468028c2dd1SDave Chinner __entry->for_background = wbc->for_background; 469028c2dd1SDave Chinner __entry->for_reclaim = wbc->for_reclaim; 470028c2dd1SDave Chinner __entry->range_cyclic = wbc->range_cyclic; 471028c2dd1SDave Chinner __entry->range_start = (long)wbc->range_start; 472028c2dd1SDave Chinner __entry->range_end = (long)wbc->range_end; 473a664edb3SYang Shi __entry->cgroup_ino = __trace_wbc_assign_cgroup(wbc); 474028c2dd1SDave Chinner ), 475028c2dd1SDave Chinner 476028c2dd1SDave Chinner TP_printk("bdi %s: towrt=%ld skip=%ld mode=%d kupd=%d " 477d46db3d5SWu Fengguang "bgrd=%d reclm=%d cyclic=%d " 478f05499a0STejun Heo "start=0x%lx end=0x%lx cgroup_ino=%lu", 479028c2dd1SDave Chinner __entry->name, 480028c2dd1SDave Chinner __entry->nr_to_write, 481028c2dd1SDave Chinner __entry->pages_skipped, 482028c2dd1SDave Chinner __entry->sync_mode, 483028c2dd1SDave Chinner __entry->for_kupdate, 484028c2dd1SDave Chinner __entry->for_background, 485028c2dd1SDave Chinner __entry->for_reclaim, 486028c2dd1SDave Chinner __entry->range_cyclic, 487028c2dd1SDave Chinner __entry->range_start, 4885634cc2aSTejun Heo __entry->range_end, 48940363cf1SQian Cai (unsigned long)__entry->cgroup_ino 4905634cc2aSTejun Heo ) 491028c2dd1SDave Chinner ) 492028c2dd1SDave Chinner 493028c2dd1SDave Chinner #define DEFINE_WBC_EVENT(name) \ 494028c2dd1SDave Chinner DEFINE_EVENT(wbc_class, name, \ 495028c2dd1SDave Chinner TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), \ 496028c2dd1SDave Chinner TP_ARGS(wbc, bdi)) 4979e094383SDave Chinner DEFINE_WBC_EVENT(wbc_writepage); 498028c2dd1SDave Chinner 499e84d0a4fSWu Fengguang TRACE_EVENT(writeback_queue_io, 500e84d0a4fSWu Fengguang TP_PROTO(struct bdi_writeback *wb, 501ad4e38ddSCurt Wohlgemuth struct wb_writeback_work *work, 502e84d0a4fSWu Fengguang int moved), 503ad4e38ddSCurt Wohlgemuth TP_ARGS(wb, work, moved), 504e84d0a4fSWu Fengguang TP_STRUCT__entry( 505e84d0a4fSWu Fengguang __array(char, name, 32) 506e84d0a4fSWu Fengguang __field(unsigned long, older) 507e84d0a4fSWu Fengguang __field(long, age) 508e84d0a4fSWu Fengguang __field(int, moved) 5090e175a18SCurt Wohlgemuth __field(int, reason) 510f05499a0STejun Heo __field(ino_t, cgroup_ino) 511e84d0a4fSWu Fengguang ), 512e84d0a4fSWu Fengguang TP_fast_assign( 5130dc83bd3SJan Kara unsigned long *older_than_this = work->older_than_this; 514*68f23b89STheodore Ts'o strscpy_pad(__entry->name, bdi_dev_name(wb->bdi), 32); 5150dc83bd3SJan Kara __entry->older = older_than_this ? *older_than_this : 0; 516e84d0a4fSWu Fengguang __entry->age = older_than_this ? 5170dc83bd3SJan Kara (jiffies - *older_than_this) * 1000 / HZ : -1; 518e84d0a4fSWu Fengguang __entry->moved = moved; 5190e175a18SCurt Wohlgemuth __entry->reason = work->reason; 520a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 521e84d0a4fSWu Fengguang ), 522f05499a0STejun Heo TP_printk("bdi %s: older=%lu age=%ld enqueue=%d reason=%s cgroup_ino=%lu", 523e84d0a4fSWu Fengguang __entry->name, 524e84d0a4fSWu Fengguang __entry->older, /* older_than_this in jiffies */ 525e84d0a4fSWu Fengguang __entry->age, /* older_than_this in relative milliseconds */ 5260e175a18SCurt Wohlgemuth __entry->moved, 5275634cc2aSTejun Heo __print_symbolic(__entry->reason, WB_WORK_REASON), 52840363cf1SQian Cai (unsigned long)__entry->cgroup_ino 529b3bba872SWu Fengguang ) 530e84d0a4fSWu Fengguang ); 531e84d0a4fSWu Fengguang 532e1cbe236SWu Fengguang TRACE_EVENT(global_dirty_state, 533e1cbe236SWu Fengguang 534e1cbe236SWu Fengguang TP_PROTO(unsigned long background_thresh, 535e1cbe236SWu Fengguang unsigned long dirty_thresh 536e1cbe236SWu Fengguang ), 537e1cbe236SWu Fengguang 538e1cbe236SWu Fengguang TP_ARGS(background_thresh, 539e1cbe236SWu Fengguang dirty_thresh 540e1cbe236SWu Fengguang ), 541e1cbe236SWu Fengguang 542e1cbe236SWu Fengguang TP_STRUCT__entry( 543e1cbe236SWu Fengguang __field(unsigned long, nr_dirty) 544e1cbe236SWu Fengguang __field(unsigned long, nr_writeback) 545e1cbe236SWu Fengguang __field(unsigned long, nr_unstable) 546e1cbe236SWu Fengguang __field(unsigned long, background_thresh) 547e1cbe236SWu Fengguang __field(unsigned long, dirty_thresh) 548e1cbe236SWu Fengguang __field(unsigned long, dirty_limit) 549e1cbe236SWu Fengguang __field(unsigned long, nr_dirtied) 550e1cbe236SWu Fengguang __field(unsigned long, nr_written) 551e1cbe236SWu Fengguang ), 552e1cbe236SWu Fengguang 553e1cbe236SWu Fengguang TP_fast_assign( 55411fb9989SMel Gorman __entry->nr_dirty = global_node_page_state(NR_FILE_DIRTY); 55511fb9989SMel Gorman __entry->nr_writeback = global_node_page_state(NR_WRITEBACK); 55611fb9989SMel Gorman __entry->nr_unstable = global_node_page_state(NR_UNSTABLE_NFS); 557c4a25635SMel Gorman __entry->nr_dirtied = global_node_page_state(NR_DIRTIED); 558c4a25635SMel Gorman __entry->nr_written = global_node_page_state(NR_WRITTEN); 559e1cbe236SWu Fengguang __entry->background_thresh = background_thresh; 560e1cbe236SWu Fengguang __entry->dirty_thresh = dirty_thresh; 561dcc25ae7STejun Heo __entry->dirty_limit = global_wb_domain.dirty_limit; 562e1cbe236SWu Fengguang ), 563e1cbe236SWu Fengguang 564e1cbe236SWu Fengguang TP_printk("dirty=%lu writeback=%lu unstable=%lu " 565e1cbe236SWu Fengguang "bg_thresh=%lu thresh=%lu limit=%lu " 566e1cbe236SWu Fengguang "dirtied=%lu written=%lu", 567e1cbe236SWu Fengguang __entry->nr_dirty, 568e1cbe236SWu Fengguang __entry->nr_writeback, 569e1cbe236SWu Fengguang __entry->nr_unstable, 570e1cbe236SWu Fengguang __entry->background_thresh, 571e1cbe236SWu Fengguang __entry->dirty_thresh, 572e1cbe236SWu Fengguang __entry->dirty_limit, 573e1cbe236SWu Fengguang __entry->nr_dirtied, 574e1cbe236SWu Fengguang __entry->nr_written 575e1cbe236SWu Fengguang ) 576e1cbe236SWu Fengguang ); 577e1cbe236SWu Fengguang 578b48c104dSWu Fengguang #define KBps(x) ((x) << (PAGE_SHIFT - 10)) 579b48c104dSWu Fengguang 580b48c104dSWu Fengguang TRACE_EVENT(bdi_dirty_ratelimit, 581b48c104dSWu Fengguang 5825634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, 583b48c104dSWu Fengguang unsigned long dirty_rate, 584b48c104dSWu Fengguang unsigned long task_ratelimit), 585b48c104dSWu Fengguang 5865634cc2aSTejun Heo TP_ARGS(wb, dirty_rate, task_ratelimit), 587b48c104dSWu Fengguang 588b48c104dSWu Fengguang TP_STRUCT__entry( 589b48c104dSWu Fengguang __array(char, bdi, 32) 590b48c104dSWu Fengguang __field(unsigned long, write_bw) 591b48c104dSWu Fengguang __field(unsigned long, avg_write_bw) 592b48c104dSWu Fengguang __field(unsigned long, dirty_rate) 593b48c104dSWu Fengguang __field(unsigned long, dirty_ratelimit) 594b48c104dSWu Fengguang __field(unsigned long, task_ratelimit) 595b48c104dSWu Fengguang __field(unsigned long, balanced_dirty_ratelimit) 596f05499a0STejun Heo __field(ino_t, cgroup_ino) 597b48c104dSWu Fengguang ), 598b48c104dSWu Fengguang 599b48c104dSWu Fengguang TP_fast_assign( 600*68f23b89STheodore Ts'o strscpy_pad(__entry->bdi, bdi_dev_name(wb->bdi), 32); 6015634cc2aSTejun Heo __entry->write_bw = KBps(wb->write_bandwidth); 6025634cc2aSTejun Heo __entry->avg_write_bw = KBps(wb->avg_write_bandwidth); 603b48c104dSWu Fengguang __entry->dirty_rate = KBps(dirty_rate); 6045634cc2aSTejun Heo __entry->dirty_ratelimit = KBps(wb->dirty_ratelimit); 605b48c104dSWu Fengguang __entry->task_ratelimit = KBps(task_ratelimit); 606b48c104dSWu Fengguang __entry->balanced_dirty_ratelimit = 6075634cc2aSTejun Heo KBps(wb->balanced_dirty_ratelimit); 608a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 609b48c104dSWu Fengguang ), 610b48c104dSWu Fengguang 611b48c104dSWu Fengguang TP_printk("bdi %s: " 612b48c104dSWu Fengguang "write_bw=%lu awrite_bw=%lu dirty_rate=%lu " 613b48c104dSWu Fengguang "dirty_ratelimit=%lu task_ratelimit=%lu " 614f05499a0STejun Heo "balanced_dirty_ratelimit=%lu cgroup_ino=%lu", 615b48c104dSWu Fengguang __entry->bdi, 616b48c104dSWu Fengguang __entry->write_bw, /* write bandwidth */ 617b48c104dSWu Fengguang __entry->avg_write_bw, /* avg write bandwidth */ 618b48c104dSWu Fengguang __entry->dirty_rate, /* bdi dirty rate */ 619b48c104dSWu Fengguang __entry->dirty_ratelimit, /* base ratelimit */ 620b48c104dSWu Fengguang __entry->task_ratelimit, /* ratelimit with position control */ 6215634cc2aSTejun Heo __entry->balanced_dirty_ratelimit, /* the balanced ratelimit */ 62240363cf1SQian Cai (unsigned long)__entry->cgroup_ino 623b48c104dSWu Fengguang ) 624b48c104dSWu Fengguang ); 625b48c104dSWu Fengguang 626ece13ac3SWu Fengguang TRACE_EVENT(balance_dirty_pages, 627ece13ac3SWu Fengguang 6285634cc2aSTejun Heo TP_PROTO(struct bdi_writeback *wb, 629ece13ac3SWu Fengguang unsigned long thresh, 630ece13ac3SWu Fengguang unsigned long bg_thresh, 631ece13ac3SWu Fengguang unsigned long dirty, 632ece13ac3SWu Fengguang unsigned long bdi_thresh, 633ece13ac3SWu Fengguang unsigned long bdi_dirty, 634ece13ac3SWu Fengguang unsigned long dirty_ratelimit, 635ece13ac3SWu Fengguang unsigned long task_ratelimit, 636ece13ac3SWu Fengguang unsigned long dirtied, 63783712358SWu Fengguang unsigned long period, 638ece13ac3SWu Fengguang long pause, 639ece13ac3SWu Fengguang unsigned long start_time), 640ece13ac3SWu Fengguang 6415634cc2aSTejun Heo TP_ARGS(wb, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty, 642ece13ac3SWu Fengguang dirty_ratelimit, task_ratelimit, 64383712358SWu Fengguang dirtied, period, pause, start_time), 644ece13ac3SWu Fengguang 645ece13ac3SWu Fengguang TP_STRUCT__entry( 646ece13ac3SWu Fengguang __array( char, bdi, 32) 647ece13ac3SWu Fengguang __field(unsigned long, limit) 648ece13ac3SWu Fengguang __field(unsigned long, setpoint) 649ece13ac3SWu Fengguang __field(unsigned long, dirty) 650ece13ac3SWu Fengguang __field(unsigned long, bdi_setpoint) 651ece13ac3SWu Fengguang __field(unsigned long, bdi_dirty) 652ece13ac3SWu Fengguang __field(unsigned long, dirty_ratelimit) 653ece13ac3SWu Fengguang __field(unsigned long, task_ratelimit) 654ece13ac3SWu Fengguang __field(unsigned int, dirtied) 655ece13ac3SWu Fengguang __field(unsigned int, dirtied_pause) 656ece13ac3SWu Fengguang __field(unsigned long, paused) 657ece13ac3SWu Fengguang __field( long, pause) 65883712358SWu Fengguang __field(unsigned long, period) 65983712358SWu Fengguang __field( long, think) 660f05499a0STejun Heo __field(ino_t, cgroup_ino) 661ece13ac3SWu Fengguang ), 662ece13ac3SWu Fengguang 663ece13ac3SWu Fengguang TP_fast_assign( 664ece13ac3SWu Fengguang unsigned long freerun = (thresh + bg_thresh) / 2; 665*68f23b89STheodore Ts'o strscpy_pad(__entry->bdi, bdi_dev_name(wb->bdi), 32); 666ece13ac3SWu Fengguang 667dcc25ae7STejun Heo __entry->limit = global_wb_domain.dirty_limit; 668dcc25ae7STejun Heo __entry->setpoint = (global_wb_domain.dirty_limit + 669dcc25ae7STejun Heo freerun) / 2; 670ece13ac3SWu Fengguang __entry->dirty = dirty; 671ece13ac3SWu Fengguang __entry->bdi_setpoint = __entry->setpoint * 672ece13ac3SWu Fengguang bdi_thresh / (thresh + 1); 673ece13ac3SWu Fengguang __entry->bdi_dirty = bdi_dirty; 674ece13ac3SWu Fengguang __entry->dirty_ratelimit = KBps(dirty_ratelimit); 675ece13ac3SWu Fengguang __entry->task_ratelimit = KBps(task_ratelimit); 676ece13ac3SWu Fengguang __entry->dirtied = dirtied; 677ece13ac3SWu Fengguang __entry->dirtied_pause = current->nr_dirtied_pause; 67883712358SWu Fengguang __entry->think = current->dirty_paused_when == 0 ? 0 : 67983712358SWu Fengguang (long)(jiffies - current->dirty_paused_when) * 1000/HZ; 68083712358SWu Fengguang __entry->period = period * 1000 / HZ; 681ece13ac3SWu Fengguang __entry->pause = pause * 1000 / HZ; 682ece13ac3SWu Fengguang __entry->paused = (jiffies - start_time) * 1000 / HZ; 683a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(wb); 684ece13ac3SWu Fengguang ), 685ece13ac3SWu Fengguang 686ece13ac3SWu Fengguang 687ece13ac3SWu Fengguang TP_printk("bdi %s: " 688ece13ac3SWu Fengguang "limit=%lu setpoint=%lu dirty=%lu " 689ece13ac3SWu Fengguang "bdi_setpoint=%lu bdi_dirty=%lu " 690ece13ac3SWu Fengguang "dirty_ratelimit=%lu task_ratelimit=%lu " 691ece13ac3SWu Fengguang "dirtied=%u dirtied_pause=%u " 692f05499a0STejun Heo "paused=%lu pause=%ld period=%lu think=%ld cgroup_ino=%lu", 693ece13ac3SWu Fengguang __entry->bdi, 694ece13ac3SWu Fengguang __entry->limit, 695ece13ac3SWu Fengguang __entry->setpoint, 696ece13ac3SWu Fengguang __entry->dirty, 697ece13ac3SWu Fengguang __entry->bdi_setpoint, 698ece13ac3SWu Fengguang __entry->bdi_dirty, 699ece13ac3SWu Fengguang __entry->dirty_ratelimit, 700ece13ac3SWu Fengguang __entry->task_ratelimit, 701ece13ac3SWu Fengguang __entry->dirtied, 702ece13ac3SWu Fengguang __entry->dirtied_pause, 703ece13ac3SWu Fengguang __entry->paused, /* ms */ 70483712358SWu Fengguang __entry->pause, /* ms */ 70583712358SWu Fengguang __entry->period, /* ms */ 7065634cc2aSTejun Heo __entry->think, /* ms */ 70740363cf1SQian Cai (unsigned long)__entry->cgroup_ino 708ece13ac3SWu Fengguang ) 709ece13ac3SWu Fengguang ); 710ece13ac3SWu Fengguang 711cc1676d9SJan Kara TRACE_EVENT(writeback_sb_inodes_requeue, 712cc1676d9SJan Kara 713cc1676d9SJan Kara TP_PROTO(struct inode *inode), 714cc1676d9SJan Kara TP_ARGS(inode), 715cc1676d9SJan Kara 716cc1676d9SJan Kara TP_STRUCT__entry( 717cc1676d9SJan Kara __array(char, name, 32) 718f05499a0STejun Heo __field(ino_t, ino) 719cc1676d9SJan Kara __field(unsigned long, state) 720cc1676d9SJan Kara __field(unsigned long, dirtied_when) 721f05499a0STejun Heo __field(ino_t, cgroup_ino) 722cc1676d9SJan Kara ), 723cc1676d9SJan Kara 724cc1676d9SJan Kara TP_fast_assign( 725d1a445d3SQian Cai strscpy_pad(__entry->name, 726*68f23b89STheodore Ts'o bdi_dev_name(inode_to_bdi(inode)), 32); 727cc1676d9SJan Kara __entry->ino = inode->i_ino; 728cc1676d9SJan Kara __entry->state = inode->i_state; 729cc1676d9SJan Kara __entry->dirtied_when = inode->dirtied_when; 730a664edb3SYang Shi __entry->cgroup_ino = __trace_wb_assign_cgroup(inode_to_wb(inode)); 731cc1676d9SJan Kara ), 732cc1676d9SJan Kara 733f05499a0STejun Heo TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu cgroup_ino=%lu", 734cc1676d9SJan Kara __entry->name, 73540363cf1SQian Cai (unsigned long)__entry->ino, 736cc1676d9SJan Kara show_inode_state(__entry->state), 737cc1676d9SJan Kara __entry->dirtied_when, 7385634cc2aSTejun Heo (jiffies - __entry->dirtied_when) / HZ, 73940363cf1SQian Cai (unsigned long)__entry->cgroup_ino 740cc1676d9SJan Kara ) 741cc1676d9SJan Kara ); 742cc1676d9SJan Kara 74352bb9198SMel Gorman DECLARE_EVENT_CLASS(writeback_congest_waited_template, 74452bb9198SMel Gorman 74552bb9198SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 74652bb9198SMel Gorman 74752bb9198SMel Gorman TP_ARGS(usec_timeout, usec_delayed), 74852bb9198SMel Gorman 74952bb9198SMel Gorman TP_STRUCT__entry( 75052bb9198SMel Gorman __field( unsigned int, usec_timeout ) 75152bb9198SMel Gorman __field( unsigned int, usec_delayed ) 75252bb9198SMel Gorman ), 75352bb9198SMel Gorman 75452bb9198SMel Gorman TP_fast_assign( 75552bb9198SMel Gorman __entry->usec_timeout = usec_timeout; 75652bb9198SMel Gorman __entry->usec_delayed = usec_delayed; 75752bb9198SMel Gorman ), 75852bb9198SMel Gorman 75952bb9198SMel Gorman TP_printk("usec_timeout=%u usec_delayed=%u", 76052bb9198SMel Gorman __entry->usec_timeout, 76152bb9198SMel Gorman __entry->usec_delayed) 76252bb9198SMel Gorman ); 76352bb9198SMel Gorman 76452bb9198SMel Gorman DEFINE_EVENT(writeback_congest_waited_template, writeback_congestion_wait, 76552bb9198SMel Gorman 76652bb9198SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 76752bb9198SMel Gorman 76852bb9198SMel Gorman TP_ARGS(usec_timeout, usec_delayed) 76952bb9198SMel Gorman ); 77052bb9198SMel Gorman 7710e093d99SMel Gorman DEFINE_EVENT(writeback_congest_waited_template, writeback_wait_iff_congested, 7720e093d99SMel Gorman 7730e093d99SMel Gorman TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed), 7740e093d99SMel Gorman 7750e093d99SMel Gorman TP_ARGS(usec_timeout, usec_delayed) 7760e093d99SMel Gorman ); 7770e093d99SMel Gorman 778251d6a47SWu Fengguang DECLARE_EVENT_CLASS(writeback_single_inode_template, 779251d6a47SWu Fengguang 780251d6a47SWu Fengguang TP_PROTO(struct inode *inode, 781251d6a47SWu Fengguang struct writeback_control *wbc, 782251d6a47SWu Fengguang unsigned long nr_to_write 783251d6a47SWu Fengguang ), 784251d6a47SWu Fengguang 785251d6a47SWu Fengguang TP_ARGS(inode, wbc, nr_to_write), 786251d6a47SWu Fengguang 787251d6a47SWu Fengguang TP_STRUCT__entry( 788251d6a47SWu Fengguang __array(char, name, 32) 789f05499a0STejun Heo __field(ino_t, ino) 790251d6a47SWu Fengguang __field(unsigned long, state) 791c8ad6206SWu Fengguang __field(unsigned long, dirtied_when) 792251d6a47SWu Fengguang __field(unsigned long, writeback_index) 793251d6a47SWu Fengguang __field(long, nr_to_write) 794251d6a47SWu Fengguang __field(unsigned long, wrote) 795f05499a0STejun Heo __field(ino_t, cgroup_ino) 796251d6a47SWu Fengguang ), 797251d6a47SWu Fengguang 798251d6a47SWu Fengguang TP_fast_assign( 799d1a445d3SQian Cai strscpy_pad(__entry->name, 800*68f23b89STheodore Ts'o bdi_dev_name(inode_to_bdi(inode)), 32); 801251d6a47SWu Fengguang __entry->ino = inode->i_ino; 802251d6a47SWu Fengguang __entry->state = inode->i_state; 803c8ad6206SWu Fengguang __entry->dirtied_when = inode->dirtied_when; 804251d6a47SWu Fengguang __entry->writeback_index = inode->i_mapping->writeback_index; 805251d6a47SWu Fengguang __entry->nr_to_write = nr_to_write; 806251d6a47SWu Fengguang __entry->wrote = nr_to_write - wbc->nr_to_write; 807a664edb3SYang Shi __entry->cgroup_ino = __trace_wbc_assign_cgroup(wbc); 808251d6a47SWu Fengguang ), 809251d6a47SWu Fengguang 810c8ad6206SWu Fengguang TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu " 811f05499a0STejun Heo "index=%lu to_write=%ld wrote=%lu cgroup_ino=%lu", 812251d6a47SWu Fengguang __entry->name, 81340363cf1SQian Cai (unsigned long)__entry->ino, 814251d6a47SWu Fengguang show_inode_state(__entry->state), 815c8ad6206SWu Fengguang __entry->dirtied_when, 816c8ad6206SWu Fengguang (jiffies - __entry->dirtied_when) / HZ, 817251d6a47SWu Fengguang __entry->writeback_index, 818251d6a47SWu Fengguang __entry->nr_to_write, 8195634cc2aSTejun Heo __entry->wrote, 82040363cf1SQian Cai (unsigned long)__entry->cgroup_ino 821251d6a47SWu Fengguang ) 822251d6a47SWu Fengguang ); 823251d6a47SWu Fengguang 8249fb0a7daSTejun Heo DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode_start, 8259fb0a7daSTejun Heo TP_PROTO(struct inode *inode, 8269fb0a7daSTejun Heo struct writeback_control *wbc, 8279fb0a7daSTejun Heo unsigned long nr_to_write), 8289fb0a7daSTejun Heo TP_ARGS(inode, wbc, nr_to_write) 8299fb0a7daSTejun Heo ); 8309fb0a7daSTejun Heo 831251d6a47SWu Fengguang DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode, 832251d6a47SWu Fengguang TP_PROTO(struct inode *inode, 833251d6a47SWu Fengguang struct writeback_control *wbc, 834251d6a47SWu Fengguang unsigned long nr_to_write), 835251d6a47SWu Fengguang TP_ARGS(inode, wbc, nr_to_write) 836251d6a47SWu Fengguang ); 837251d6a47SWu Fengguang 8389a46b04fSBrian Foster DECLARE_EVENT_CLASS(writeback_inode_template, 8390ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 8400ae45f63STheodore Ts'o 8410ae45f63STheodore Ts'o TP_ARGS(inode), 8420ae45f63STheodore Ts'o 8430ae45f63STheodore Ts'o TP_STRUCT__entry( 8440ae45f63STheodore Ts'o __field( dev_t, dev ) 845f05499a0STejun Heo __field( ino_t, ino ) 8460ae45f63STheodore Ts'o __field(unsigned long, state ) 8470ae45f63STheodore Ts'o __field( __u16, mode ) 8480ae45f63STheodore Ts'o __field(unsigned long, dirtied_when ) 8490ae45f63STheodore Ts'o ), 8500ae45f63STheodore Ts'o 8510ae45f63STheodore Ts'o TP_fast_assign( 8520ae45f63STheodore Ts'o __entry->dev = inode->i_sb->s_dev; 8530ae45f63STheodore Ts'o __entry->ino = inode->i_ino; 8540ae45f63STheodore Ts'o __entry->state = inode->i_state; 8550ae45f63STheodore Ts'o __entry->mode = inode->i_mode; 8560ae45f63STheodore Ts'o __entry->dirtied_when = inode->dirtied_when; 8570ae45f63STheodore Ts'o ), 8580ae45f63STheodore Ts'o 8590ae45f63STheodore Ts'o TP_printk("dev %d,%d ino %lu dirtied %lu state %s mode 0%o", 8600ae45f63STheodore Ts'o MAJOR(__entry->dev), MINOR(__entry->dev), 86140363cf1SQian Cai (unsigned long)__entry->ino, __entry->dirtied_when, 8620ae45f63STheodore Ts'o show_inode_state(__entry->state), __entry->mode) 8630ae45f63STheodore Ts'o ); 8640ae45f63STheodore Ts'o 8659a46b04fSBrian Foster DEFINE_EVENT(writeback_inode_template, writeback_lazytime, 8660ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 8670ae45f63STheodore Ts'o 8680ae45f63STheodore Ts'o TP_ARGS(inode) 8690ae45f63STheodore Ts'o ); 8700ae45f63STheodore Ts'o 8719a46b04fSBrian Foster DEFINE_EVENT(writeback_inode_template, writeback_lazytime_iput, 8720ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 8730ae45f63STheodore Ts'o 8740ae45f63STheodore Ts'o TP_ARGS(inode) 8750ae45f63STheodore Ts'o ); 8760ae45f63STheodore Ts'o 8779a46b04fSBrian Foster DEFINE_EVENT(writeback_inode_template, writeback_dirty_inode_enqueue, 8780ae45f63STheodore Ts'o 8790ae45f63STheodore Ts'o TP_PROTO(struct inode *inode), 8800ae45f63STheodore Ts'o 8810ae45f63STheodore Ts'o TP_ARGS(inode) 8820ae45f63STheodore Ts'o ); 8830ae45f63STheodore Ts'o 8849a46b04fSBrian Foster /* 8859a46b04fSBrian Foster * Inode writeback list tracking. 8869a46b04fSBrian Foster */ 8879a46b04fSBrian Foster 8889a46b04fSBrian Foster DEFINE_EVENT(writeback_inode_template, sb_mark_inode_writeback, 8899a46b04fSBrian Foster TP_PROTO(struct inode *inode), 8909a46b04fSBrian Foster TP_ARGS(inode) 8919a46b04fSBrian Foster ); 8929a46b04fSBrian Foster 8939a46b04fSBrian Foster DEFINE_EVENT(writeback_inode_template, sb_clear_inode_writeback, 8949a46b04fSBrian Foster TP_PROTO(struct inode *inode), 8959a46b04fSBrian Foster TP_ARGS(inode) 8969a46b04fSBrian Foster ); 8979a46b04fSBrian Foster 898455b2864SDave Chinner #endif /* _TRACE_WRITEBACK_H */ 899455b2864SDave Chinner 900455b2864SDave Chinner /* This part must be outside protection */ 901455b2864SDave Chinner #include <trace/define_trace.h> 902