Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

staging: erofs: support tracepoint

Add basic tracepoints for ->readpage{,s}, ->lookup,
->destroy_inode, fill_inode and map_blocks.

Reviewed-by: Gao Xiang <gaoxiang25@huawei.com>
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Chao Yu and committed by
Greg Kroah-Hartman
13f06f48 9c07b3b3

+261 -3
+10 -3
drivers/staging/erofs/data.c
··· 13 13 #include "internal.h" 14 14 #include <linux/prefetch.h> 15 15 16 + #include <trace/events/erofs.h> 17 + 16 18 static inline void read_endio(struct bio *bio) 17 19 { 18 20 int i; ··· 115 113 u64 offset = map->m_la; 116 114 struct erofs_vnode *vi = EROFS_V(inode); 117 115 116 + trace_erofs_map_blocks_flatmode_enter(inode, map, flags); 118 117 BUG_ON(is_inode_layout_compression(inode)); 119 118 120 119 nblocks = DIV_ROUND_UP(inode->i_size, PAGE_SIZE); ··· 153 150 154 151 out: 155 152 map->m_llen = map->m_plen; 156 - debugln("%s, m_la 0x%llx m_pa %llx m_len %llu", 157 - __func__, map->m_la, map->m_pa, map->m_plen); 153 + trace_erofs_map_blocks_flatmode_exit(inode, map, flags, 0); 158 154 return 0; 159 155 } 160 156 ··· 307 305 erofs_off_t last_block; 308 306 struct bio *bio; 309 307 308 + trace_erofs_readpage(page, true); 309 + 310 310 bio = erofs_read_raw_page(NULL, page->mapping, 311 311 page, &last_block, 1, false); 312 312 ··· 326 322 erofs_off_t last_block; 327 323 struct bio *bio = NULL; 328 324 gfp_t gfp = readahead_gfp_mask(mapping); 325 + struct page *page = list_last_entry(pages, struct page, lru); 326 + 327 + trace_erofs_readpages(mapping->host, page, nr_pages, true); 329 328 330 329 for (; nr_pages; --nr_pages) { 331 - struct page *page = list_entry(pages->prev, struct page, lru); 330 + page = list_entry(pages->prev, struct page, lru); 332 331 333 332 prefetchw(&page->flags); 334 333 list_del(&page->lru);
+240
drivers/staging/erofs/include/trace/events/erofs.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + #undef TRACE_SYSTEM 3 + #define TRACE_SYSTEM erofs 4 + 5 + #if !defined(_TRACE_EROFS_H) || defined(TRACE_HEADER_MULTI_READ) 6 + #define _TRACE_EROFS_H 7 + 8 + #include <linux/tracepoint.h> 9 + 10 + #define show_dev(dev) MAJOR(dev), MINOR(dev) 11 + #define show_dev_nid(entry) show_dev(entry->dev), entry->nid 12 + 13 + #define show_file_type(type) \ 14 + __print_symbolic(type, \ 15 + { 0, "FILE" }, \ 16 + { 1, "DIR" }) 17 + 18 + #define show_map_flags(flags) __print_flags(flags, "|", \ 19 + { EROFS_GET_BLOCKS_RAW, "RAW" }) 20 + 21 + #define show_mflags(flags) __print_flags(flags, "", \ 22 + { EROFS_MAP_MAPPED, "M" }, \ 23 + { EROFS_MAP_META, "I" }, \ 24 + { EROFS_MAP_ZIPPED, "Z" }) 25 + 26 + TRACE_EVENT(erofs_lookup, 27 + 28 + TP_PROTO(struct inode *dir, struct dentry *dentry, unsigned int flags), 29 + 30 + TP_ARGS(dir, dentry, flags), 31 + 32 + TP_STRUCT__entry( 33 + __field(dev_t, dev ) 34 + __field(erofs_nid_t, nid ) 35 + __field(const char *, name ) 36 + __field(unsigned int, flags ) 37 + ), 38 + 39 + TP_fast_assign( 40 + __entry->dev = dir->i_sb->s_dev; 41 + __entry->nid = EROFS_V(dir)->nid; 42 + __entry->name = dentry->d_name.name; 43 + __entry->flags = flags; 44 + ), 45 + 46 + TP_printk("dev = (%d,%d), pnid = %llu, name:%s, flags:%x", 47 + show_dev_nid(__entry), 48 + __entry->name, 49 + __entry->flags) 50 + ); 51 + 52 + TRACE_EVENT(erofs_fill_inode, 53 + TP_PROTO(struct inode *inode, int isdir), 54 + TP_ARGS(inode, isdir), 55 + 56 + TP_STRUCT__entry( 57 + __field(dev_t, dev ) 58 + __field(erofs_nid_t, nid ) 59 + __field(erofs_blk_t, blkaddr ) 60 + __field(unsigned int, ofs ) 61 + __field(int, isdir ) 62 + ), 63 + 64 + TP_fast_assign( 65 + __entry->dev = inode->i_sb->s_dev; 66 + __entry->nid = EROFS_V(inode)->nid; 67 + __entry->blkaddr = erofs_blknr(iloc(EROFS_I_SB(inode), __entry->nid)); 68 + __entry->ofs = erofs_blkoff(iloc(EROFS_I_SB(inode), __entry->nid)); 69 + __entry->isdir = isdir; 70 + ), 71 + 72 + TP_printk("dev = (%d,%d), nid = %llu, blkaddr %u ofs %u, isdir %d", 73 + show_dev_nid(__entry), 74 + __entry->blkaddr, __entry->ofs, 75 + __entry->isdir) 76 + ); 77 + 78 + TRACE_EVENT(erofs_readpage, 79 + 80 + TP_PROTO(struct page *page, bool raw), 81 + 82 + TP_ARGS(page, raw), 83 + 84 + TP_STRUCT__entry( 85 + __field(dev_t, dev ) 86 + __field(erofs_nid_t, nid ) 87 + __field(int, dir ) 88 + __field(pgoff_t, index ) 89 + __field(int, uptodate) 90 + __field(bool, raw ) 91 + ), 92 + 93 + TP_fast_assign( 94 + __entry->dev = page->mapping->host->i_sb->s_dev; 95 + __entry->nid = EROFS_V(page->mapping->host)->nid; 96 + __entry->dir = S_ISDIR(page->mapping->host->i_mode); 97 + __entry->index = page->index; 98 + __entry->uptodate = PageUptodate(page); 99 + __entry->raw = raw; 100 + ), 101 + 102 + TP_printk("dev = (%d,%d), nid = %llu, %s, index = %lu, uptodate = %d " 103 + "raw = %d", 104 + show_dev_nid(__entry), 105 + show_file_type(__entry->dir), 106 + (unsigned long)__entry->index, 107 + __entry->uptodate, 108 + __entry->raw) 109 + ); 110 + 111 + TRACE_EVENT(erofs_readpages, 112 + 113 + TP_PROTO(struct inode *inode, struct page *page, unsigned int nrpage, 114 + bool raw), 115 + 116 + TP_ARGS(inode, page, nrpage, raw), 117 + 118 + TP_STRUCT__entry( 119 + __field(dev_t, dev ) 120 + __field(erofs_nid_t, nid ) 121 + __field(pgoff_t, start ) 122 + __field(unsigned int, nrpage ) 123 + __field(bool, raw ) 124 + ), 125 + 126 + TP_fast_assign( 127 + __entry->dev = inode->i_sb->s_dev; 128 + __entry->nid = EROFS_V(inode)->nid; 129 + __entry->start = page->index; 130 + __entry->nrpage = nrpage; 131 + __entry->raw = raw; 132 + ), 133 + 134 + TP_printk("dev = (%d,%d), nid = %llu, start = %lu nrpage = %u raw = %d", 135 + show_dev_nid(__entry), 136 + (unsigned long)__entry->start, 137 + __entry->nrpage, 138 + __entry->raw) 139 + ); 140 + 141 + DECLARE_EVENT_CLASS(erofs__map_blocks_enter, 142 + TP_PROTO(struct inode *inode, struct erofs_map_blocks *map, 143 + unsigned int flags), 144 + 145 + TP_ARGS(inode, map, flags), 146 + 147 + TP_STRUCT__entry( 148 + __field( dev_t, dev ) 149 + __field( erofs_nid_t, nid ) 150 + __field( erofs_off_t, la ) 151 + __field( u64, llen ) 152 + __field( unsigned int, flags ) 153 + ), 154 + 155 + TP_fast_assign( 156 + __entry->dev = inode->i_sb->s_dev; 157 + __entry->nid = EROFS_V(inode)->nid; 158 + __entry->la = map->m_la; 159 + __entry->llen = map->m_llen; 160 + __entry->flags = flags; 161 + ), 162 + 163 + TP_printk("dev = (%d,%d), nid = %llu, la %llu llen %llu flags %s", 164 + show_dev_nid(__entry), 165 + __entry->la, __entry->llen, show_map_flags(__entry->flags)) 166 + ); 167 + 168 + DEFINE_EVENT(erofs__map_blocks_enter, erofs_map_blocks_flatmode_enter, 169 + TP_PROTO(struct inode *inode, struct erofs_map_blocks *map, 170 + unsigned flags), 171 + 172 + TP_ARGS(inode, map, flags) 173 + ); 174 + 175 + DECLARE_EVENT_CLASS(erofs__map_blocks_exit, 176 + TP_PROTO(struct inode *inode, struct erofs_map_blocks *map, 177 + unsigned int flags, int ret), 178 + 179 + TP_ARGS(inode, map, flags, ret), 180 + 181 + TP_STRUCT__entry( 182 + __field( dev_t, dev ) 183 + __field( erofs_nid_t, nid ) 184 + __field( unsigned int, flags ) 185 + __field( erofs_off_t, la ) 186 + __field( erofs_off_t, pa ) 187 + __field( u64, llen ) 188 + __field( u64, plen ) 189 + __field( unsigned int, mflags ) 190 + __field( int, ret ) 191 + ), 192 + 193 + TP_fast_assign( 194 + __entry->dev = inode->i_sb->s_dev; 195 + __entry->nid = EROFS_V(inode)->nid; 196 + __entry->flags = flags; 197 + __entry->la = map->m_la; 198 + __entry->pa = map->m_pa; 199 + __entry->llen = map->m_llen; 200 + __entry->plen = map->m_plen; 201 + __entry->mflags = map->m_flags; 202 + __entry->ret = ret; 203 + ), 204 + 205 + TP_printk("dev = (%d,%d), nid = %llu, flags %s " 206 + "la %llu pa %llu llen %llu plen %llu mflags %s ret %d", 207 + show_dev_nid(__entry), show_map_flags(__entry->flags), 208 + __entry->la, __entry->pa, __entry->llen, __entry->plen, 209 + show_mflags(__entry->mflags), __entry->ret) 210 + ); 211 + 212 + DEFINE_EVENT(erofs__map_blocks_exit, erofs_map_blocks_flatmode_exit, 213 + TP_PROTO(struct inode *inode, struct erofs_map_blocks *map, 214 + unsigned flags, int ret), 215 + 216 + TP_ARGS(inode, map, flags, ret) 217 + ); 218 + 219 + TRACE_EVENT(erofs_destroy_inode, 220 + TP_PROTO(struct inode *inode), 221 + 222 + TP_ARGS(inode), 223 + 224 + TP_STRUCT__entry( 225 + __field( dev_t, dev ) 226 + __field( erofs_nid_t, nid ) 227 + ), 228 + 229 + TP_fast_assign( 230 + __entry->dev = inode->i_sb->s_dev; 231 + __entry->nid = EROFS_V(inode)->nid; 232 + ), 233 + 234 + TP_printk("dev = (%d,%d), nid = %llu", show_dev_nid(__entry)) 235 + ); 236 + 237 + #endif /* _TRACE_EROFS_H */ 238 + 239 + /* This part must be outside protection */ 240 + #include <trace/define_trace.h>
+4
drivers/staging/erofs/inode.c
··· 12 12 */ 13 13 #include "xattr.h" 14 14 15 + #include <trace/events/erofs.h> 16 + 15 17 /* no locking */ 16 18 static int read_inode(struct inode *inode, void *data) 17 19 { ··· 153 151 int err; 154 152 erofs_blk_t blkaddr; 155 153 unsigned ofs; 154 + 155 + trace_erofs_fill_inode(inode, isdir); 156 156 157 157 blkaddr = erofs_blknr(iloc(sbi, vi->nid)); 158 158 ofs = erofs_blkoff(iloc(sbi, vi->nid));
+4
drivers/staging/erofs/namei.c
··· 13 13 #include "internal.h" 14 14 #include "xattr.h" 15 15 16 + #include <trace/events/erofs.h> 17 + 16 18 /* based on the value of qn->len is accurate */ 17 19 static inline int dirnamecmp(struct qstr *qn, 18 20 struct qstr *qd, unsigned *matched) ··· 210 208 DBG_BUGON(!d_really_is_negative(dentry)); 211 209 /* dentry must be unhashed in lookup, no need to worry about */ 212 210 DBG_BUGON(!d_unhashed(dentry)); 211 + 212 + trace_erofs_lookup(dir, dentry, flags); 213 213 214 214 /* file name exceeds fs limit */ 215 215 if (unlikely(dentry->d_name.len > EROFS_NAME_LEN))
+3
drivers/staging/erofs/super.c
··· 17 17 #include <linux/seq_file.h> 18 18 #include "internal.h" 19 19 20 + #define CREATE_TRACE_POINTS 21 + #include <trace/events/erofs.h> 22 + 20 23 static struct kmem_cache *erofs_inode_cachep __read_mostly; 21 24 22 25 static void init_once(void *ptr)