1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM filemap 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_FILEMAP_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_FILEMAP_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/types.h> 9*4882a593Smuzhiyun #include <linux/tracepoint.h> 10*4882a593Smuzhiyun #include <linux/mm.h> 11*4882a593Smuzhiyun #include <linux/memcontrol.h> 12*4882a593Smuzhiyun #include <linux/device.h> 13*4882a593Smuzhiyun #include <linux/kdev_t.h> 14*4882a593Smuzhiyun #include <linux/errseq.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun DECLARE_EVENT_CLASS(mm_filemap_op_page_cache, 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun TP_PROTO(struct page *page), 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun TP_ARGS(page), 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun TP_STRUCT__entry( 23*4882a593Smuzhiyun __field(unsigned long, pfn) 24*4882a593Smuzhiyun __field(unsigned long, i_ino) 25*4882a593Smuzhiyun __field(unsigned long, index) 26*4882a593Smuzhiyun __field(dev_t, s_dev) 27*4882a593Smuzhiyun ), 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun TP_fast_assign( 30*4882a593Smuzhiyun __entry->pfn = page_to_pfn(page); 31*4882a593Smuzhiyun __entry->i_ino = page->mapping->host->i_ino; 32*4882a593Smuzhiyun __entry->index = page->index; 33*4882a593Smuzhiyun if (page->mapping->host->i_sb) 34*4882a593Smuzhiyun __entry->s_dev = page->mapping->host->i_sb->s_dev; 35*4882a593Smuzhiyun else 36*4882a593Smuzhiyun __entry->s_dev = page->mapping->host->i_rdev; 37*4882a593Smuzhiyun ), 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun TP_printk("dev %d:%d ino %lx page=%p pfn=%lu ofs=%lu", 40*4882a593Smuzhiyun MAJOR(__entry->s_dev), MINOR(__entry->s_dev), 41*4882a593Smuzhiyun __entry->i_ino, 42*4882a593Smuzhiyun pfn_to_page(__entry->pfn), 43*4882a593Smuzhiyun __entry->pfn, 44*4882a593Smuzhiyun __entry->index << PAGE_SHIFT) 45*4882a593Smuzhiyun ); 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun DEFINE_EVENT(mm_filemap_op_page_cache, mm_filemap_delete_from_page_cache, 48*4882a593Smuzhiyun TP_PROTO(struct page *page), 49*4882a593Smuzhiyun TP_ARGS(page) 50*4882a593Smuzhiyun ); 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun DEFINE_EVENT(mm_filemap_op_page_cache, mm_filemap_add_to_page_cache, 53*4882a593Smuzhiyun TP_PROTO(struct page *page), 54*4882a593Smuzhiyun TP_ARGS(page) 55*4882a593Smuzhiyun ); 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun TRACE_EVENT(filemap_set_wb_err, 58*4882a593Smuzhiyun TP_PROTO(struct address_space *mapping, errseq_t eseq), 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun TP_ARGS(mapping, eseq), 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun TP_STRUCT__entry( 63*4882a593Smuzhiyun __field(unsigned long, i_ino) 64*4882a593Smuzhiyun __field(dev_t, s_dev) 65*4882a593Smuzhiyun __field(errseq_t, errseq) 66*4882a593Smuzhiyun ), 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun TP_fast_assign( 69*4882a593Smuzhiyun __entry->i_ino = mapping->host->i_ino; 70*4882a593Smuzhiyun __entry->errseq = eseq; 71*4882a593Smuzhiyun if (mapping->host->i_sb) 72*4882a593Smuzhiyun __entry->s_dev = mapping->host->i_sb->s_dev; 73*4882a593Smuzhiyun else 74*4882a593Smuzhiyun __entry->s_dev = mapping->host->i_rdev; 75*4882a593Smuzhiyun ), 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun TP_printk("dev=%d:%d ino=0x%lx errseq=0x%x", 78*4882a593Smuzhiyun MAJOR(__entry->s_dev), MINOR(__entry->s_dev), 79*4882a593Smuzhiyun __entry->i_ino, __entry->errseq) 80*4882a593Smuzhiyun ); 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun TRACE_EVENT(file_check_and_advance_wb_err, 83*4882a593Smuzhiyun TP_PROTO(struct file *file, errseq_t old), 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun TP_ARGS(file, old), 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun TP_STRUCT__entry( 88*4882a593Smuzhiyun __field(struct file *, file) 89*4882a593Smuzhiyun __field(unsigned long, i_ino) 90*4882a593Smuzhiyun __field(dev_t, s_dev) 91*4882a593Smuzhiyun __field(errseq_t, old) 92*4882a593Smuzhiyun __field(errseq_t, new) 93*4882a593Smuzhiyun ), 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun TP_fast_assign( 96*4882a593Smuzhiyun __entry->file = file; 97*4882a593Smuzhiyun __entry->i_ino = file->f_mapping->host->i_ino; 98*4882a593Smuzhiyun if (file->f_mapping->host->i_sb) 99*4882a593Smuzhiyun __entry->s_dev = 100*4882a593Smuzhiyun file->f_mapping->host->i_sb->s_dev; 101*4882a593Smuzhiyun else 102*4882a593Smuzhiyun __entry->s_dev = 103*4882a593Smuzhiyun file->f_mapping->host->i_rdev; 104*4882a593Smuzhiyun __entry->old = old; 105*4882a593Smuzhiyun __entry->new = file->f_wb_err; 106*4882a593Smuzhiyun ), 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun TP_printk("file=%p dev=%d:%d ino=0x%lx old=0x%x new=0x%x", 109*4882a593Smuzhiyun __entry->file, MAJOR(__entry->s_dev), 110*4882a593Smuzhiyun MINOR(__entry->s_dev), __entry->i_ino, __entry->old, 111*4882a593Smuzhiyun __entry->new) 112*4882a593Smuzhiyun ); 113*4882a593Smuzhiyun #endif /* _TRACE_FILEMAP_H */ 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* This part must be outside protection */ 116*4882a593Smuzhiyun #include <trace/define_trace.h> 117