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

f2fs: add tracepoints for sync & inode operations

Add tracepoints in f2fs for tracing the syncing
operations like filesystem sync, file sync enter/exit.
It will helf to trace the code under debugging scenarios.

Also add tracepoints for tracing the various inode operations
like building inode, eviction of inode, link/unlike of
inodes.

Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: Pankaj Kumar <pankaj.km@samsung.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
[Jaegeuk: combine and modify the tracepoint structures]
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>

authored by

Namjae Jeon and committed by
Jaegeuk Kim
a2a4a7e4 e66509f0

+219 -4
+6 -1
fs/f2fs/file.c
··· 25 25 #include "segment.h" 26 26 #include "xattr.h" 27 27 #include "acl.h" 28 + #include <trace/events/f2fs.h> 28 29 29 30 static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma, 30 31 struct vm_fault *vmf) ··· 117 116 if (inode->i_sb->s_flags & MS_RDONLY) 118 117 return 0; 119 118 119 + trace_f2fs_sync_file_enter(inode); 120 120 ret = filemap_write_and_wait_range(inode->i_mapping, start, end); 121 - if (ret) 121 + if (ret) { 122 + trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); 122 123 return ret; 124 + } 123 125 124 126 /* guarantee free sections for fsync */ 125 127 f2fs_balance_fs(sbi); ··· 157 153 } 158 154 out: 159 155 mutex_unlock(&inode->i_mutex); 156 + trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); 160 157 return ret; 161 158 } 162 159
+10 -3
fs/f2fs/inode.c
··· 16 16 #include "f2fs.h" 17 17 #include "node.h" 18 18 19 + #include <trace/events/f2fs.h> 20 + 19 21 void f2fs_set_inode_flags(struct inode *inode) 20 22 { 21 23 unsigned int flags = F2FS_I(inode)->i_flags; ··· 93 91 { 94 92 struct f2fs_sb_info *sbi = F2FS_SB(sb); 95 93 struct inode *inode; 96 - int ret; 94 + int ret = 0; 97 95 98 96 inode = iget_locked(sb, ino); 99 97 if (!inode) 100 98 return ERR_PTR(-ENOMEM); 101 - if (!(inode->i_state & I_NEW)) 99 + 100 + if (!(inode->i_state & I_NEW)) { 101 + trace_f2fs_iget(inode); 102 102 return inode; 103 + } 103 104 if (ino == F2FS_NODE_INO(sbi) || ino == F2FS_META_INO(sbi)) 104 105 goto make_now; 105 106 ··· 144 139 goto bad_inode; 145 140 } 146 141 unlock_new_inode(inode); 147 - 142 + trace_f2fs_iget(inode); 148 143 return inode; 149 144 150 145 bad_inode: 151 146 iget_failed(inode); 147 + trace_f2fs_iget_exit(inode, ret); 152 148 return ERR_PTR(ret); 153 149 } 154 150 ··· 245 239 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); 246 240 int ilock; 247 241 242 + trace_f2fs_evict_inode(inode); 248 243 truncate_inode_pages(&inode->i_data, 0); 249 244 250 245 if (inode->i_ino == F2FS_NODE_INO(sbi) ||
+3
fs/f2fs/namei.c
··· 18 18 #include "node.h" 19 19 #include "xattr.h" 20 20 #include "acl.h" 21 + #include <trace/events/f2fs.h> 21 22 22 23 static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode) 23 24 { ··· 236 235 int err = -ENOENT; 237 236 int ilock; 238 237 238 + trace_f2fs_unlink_enter(dir, dentry); 239 239 f2fs_balance_fs(sbi); 240 240 241 241 de = f2fs_find_entry(dir, &dentry->d_name, &page); ··· 257 255 /* In order to evict this inode, we set it dirty */ 258 256 mark_inode_dirty(inode); 259 257 fail: 258 + trace_f2fs_unlink_exit(inode, err); 260 259 return err; 261 260 } 262 261
+5
fs/f2fs/super.c
··· 29 29 #include "segment.h" 30 30 #include "xattr.h" 31 31 32 + #define CREATE_TRACE_POINTS 33 + #include <trace/events/f2fs.h> 34 + 32 35 static struct kmem_cache *f2fs_inode_cachep; 33 36 34 37 enum { ··· 136 133 int f2fs_sync_fs(struct super_block *sb, int sync) 137 134 { 138 135 struct f2fs_sb_info *sbi = F2FS_SB(sb); 136 + 137 + trace_f2fs_sync_fs(sb, sync); 139 138 140 139 if (!sbi->s_dirty && !get_pages(sbi, F2FS_DIRTY_NODES)) 141 140 return 0;
+195
include/trace/events/f2fs.h
··· 1 + #undef TRACE_SYSTEM 2 + #define TRACE_SYSTEM f2fs 3 + 4 + #if !defined(_TRACE_F2FS_H) || defined(TRACE_HEADER_MULTI_READ) 5 + #define _TRACE_F2FS_H 6 + 7 + #include <linux/tracepoint.h> 8 + 9 + #define show_dev(entry) MAJOR(entry->dev), MINOR(entry->dev) 10 + #define show_dev_ino(entry) show_dev(entry), (unsigned long)entry->ino 11 + 12 + DECLARE_EVENT_CLASS(f2fs__inode, 13 + 14 + TP_PROTO(struct inode *inode), 15 + 16 + TP_ARGS(inode), 17 + 18 + TP_STRUCT__entry( 19 + __field(dev_t, dev) 20 + __field(ino_t, ino) 21 + __field(ino_t, pino) 22 + __field(umode_t, mode) 23 + __field(loff_t, size) 24 + __field(unsigned int, nlink) 25 + __field(blkcnt_t, blocks) 26 + __field(__u8, advise) 27 + ), 28 + 29 + TP_fast_assign( 30 + __entry->dev = inode->i_sb->s_dev; 31 + __entry->ino = inode->i_ino; 32 + __entry->pino = F2FS_I(inode)->i_pino; 33 + __entry->mode = inode->i_mode; 34 + __entry->nlink = inode->i_nlink; 35 + __entry->size = inode->i_size; 36 + __entry->blocks = inode->i_blocks; 37 + __entry->advise = F2FS_I(inode)->i_advise; 38 + ), 39 + 40 + TP_printk("dev = (%d,%d), ino = %lu, pino = %lu, i_mode = 0x%hx, " 41 + "i_size = %lld, i_nlink = %u, i_blocks = %llu, i_advise = 0x%x", 42 + show_dev_ino(__entry), 43 + (unsigned long)__entry->pino, 44 + __entry->mode, 45 + __entry->size, 46 + (unsigned int)__entry->nlink, 47 + (unsigned long long)__entry->blocks, 48 + (unsigned char)__entry->advise) 49 + ); 50 + 51 + DECLARE_EVENT_CLASS(f2fs__inode_exit, 52 + 53 + TP_PROTO(struct inode *inode, int ret), 54 + 55 + TP_ARGS(inode, ret), 56 + 57 + TP_STRUCT__entry( 58 + __field(dev_t, dev) 59 + __field(ino_t, ino) 60 + __field(int, ret) 61 + ), 62 + 63 + TP_fast_assign( 64 + __entry->dev = inode->i_sb->s_dev; 65 + __entry->ino = inode->i_ino; 66 + __entry->ret = ret; 67 + ), 68 + 69 + TP_printk("dev = (%d,%d), ino = %lu, ret = %d", 70 + show_dev_ino(__entry), 71 + __entry->ret) 72 + ); 73 + 74 + DEFINE_EVENT(f2fs__inode, f2fs_sync_file_enter, 75 + 76 + TP_PROTO(struct inode *inode), 77 + 78 + TP_ARGS(inode) 79 + ); 80 + 81 + TRACE_EVENT(f2fs_sync_file_exit, 82 + 83 + TP_PROTO(struct inode *inode, bool need_cp, int datasync, int ret), 84 + 85 + TP_ARGS(inode, need_cp, datasync, ret), 86 + 87 + TP_STRUCT__entry( 88 + __field(dev_t, dev) 89 + __field(ino_t, ino) 90 + __field(bool, need_cp) 91 + __field(int, datasync) 92 + __field(int, ret) 93 + ), 94 + 95 + TP_fast_assign( 96 + __entry->dev = inode->i_sb->s_dev; 97 + __entry->ino = inode->i_ino; 98 + __entry->need_cp = need_cp; 99 + __entry->datasync = datasync; 100 + __entry->ret = ret; 101 + ), 102 + 103 + TP_printk("dev = (%d,%d), ino = %lu, checkpoint is %s, " 104 + "datasync = %d, ret = %d", 105 + show_dev_ino(__entry), 106 + __entry->need_cp ? "needed" : "not needed", 107 + __entry->datasync, 108 + __entry->ret) 109 + ); 110 + 111 + TRACE_EVENT(f2fs_sync_fs, 112 + 113 + TP_PROTO(struct super_block *sb, int wait), 114 + 115 + TP_ARGS(sb, wait), 116 + 117 + TP_STRUCT__entry( 118 + __field(dev_t, dev) 119 + __field(int, dirty) 120 + __field(int, wait) 121 + ), 122 + 123 + TP_fast_assign( 124 + __entry->dev = sb->s_dev; 125 + __entry->dirty = F2FS_SB(sb)->s_dirty; 126 + __entry->wait = wait; 127 + ), 128 + 129 + TP_printk("dev = (%d,%d), superblock is %s, wait = %d", 130 + show_dev(__entry), 131 + __entry->dirty ? "dirty" : "not dirty", 132 + __entry->wait) 133 + ); 134 + 135 + DEFINE_EVENT(f2fs__inode, f2fs_iget, 136 + 137 + TP_PROTO(struct inode *inode), 138 + 139 + TP_ARGS(inode) 140 + ); 141 + 142 + DEFINE_EVENT(f2fs__inode_exit, f2fs_iget_exit, 143 + 144 + TP_PROTO(struct inode *inode, int ret), 145 + 146 + TP_ARGS(inode, ret) 147 + ); 148 + 149 + DEFINE_EVENT(f2fs__inode, f2fs_evict_inode, 150 + 151 + TP_PROTO(struct inode *inode), 152 + 153 + TP_ARGS(inode) 154 + ); 155 + 156 + TRACE_EVENT(f2fs_unlink_enter, 157 + 158 + TP_PROTO(struct inode *dir, struct dentry *dentry), 159 + 160 + TP_ARGS(dir, dentry), 161 + 162 + TP_STRUCT__entry( 163 + __field(dev_t, dev) 164 + __field(ino_t, ino) 165 + __field(loff_t, size) 166 + __field(blkcnt_t, blocks) 167 + __field(const char *, name) 168 + ), 169 + 170 + TP_fast_assign( 171 + __entry->dev = dir->i_sb->s_dev; 172 + __entry->ino = dir->i_ino; 173 + __entry->size = dir->i_size; 174 + __entry->blocks = dir->i_blocks; 175 + __entry->name = dentry->d_name.name; 176 + ), 177 + 178 + TP_printk("dev = (%d,%d), dir ino = %lu, i_size = %lld, " 179 + "i_blocks = %llu, name = %s", 180 + show_dev_ino(__entry), 181 + __entry->size, 182 + (unsigned long long)__entry->blocks, 183 + __entry->name) 184 + ); 185 + 186 + DEFINE_EVENT(f2fs__inode_exit, f2fs_unlink_exit, 187 + 188 + TP_PROTO(struct inode *inode, int ret), 189 + 190 + TP_ARGS(inode, ret) 191 + ); 192 + #endif /* _TRACE_F2FS_H */ 193 + 194 + /* This part must be outside protection */ 195 + #include <trace/define_trace.h>