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

ext2: Add direct-io trace points

This patch adds the trace point to ext2 direct-io apis
in fs/ext2/file.c

Here is how the output looks like

a.out-467865 [006] 6758.170968: ext2_dio_write_begin: dev 7:12 ino 0xe isize 0x1000 pos 0x0 len 4096 flags DIRECT|WRITE aio 1 ret 0
a.out-467865 [006] 6758.171061: ext2_dio_write_end: dev 7:12 ino 0xe isize 0x1000 pos 0x0 len 0 flags DIRECT|WRITE aio 1 ret -529
kworker/3:153-444162 [003] 6758.171252: ext2_dio_write_endio: dev 7:12 ino 0xe isize 0x1000 pos 0x0 len 4096 flags DIRECT|WRITE aio 1 ret 0
a.out-468222 [001] 6761.628924: ext2_dio_read_begin: dev 7:12 ino 0xe isize 0x1000 pos 0x0 len 4096 flags DIRECT aio 1 ret 0
a.out-468222 [001] 6761.629063: ext2_dio_read_end: dev 7:12 ino 0xe isize 0x1000 pos 0x0 len 0 flags DIRECT aio 1 ret -529
a.out-468428 [005] 6763.937454: ext2_dio_write_begin: dev 7:12 ino 0xe isize 0x1000 pos 0x0 len 4096 flags DIRECT aio 0 ret 0
a.out-468428 [005] 6763.937829: ext2_dio_write_endio: dev 7:12 ino 0xe isize 0x1000 pos 0x0 len 4096 flags DIRECT aio 0 ret 0
a.out-468428 [005] 6763.937847: ext2_dio_write_end: dev 7:12 ino 0xe isize 0x1000 pos 0x1000 len 0 flags DIRECT aio 0 ret 4096
a.out-468609 [000] 6765.702878: ext2_dio_read_begin: dev 7:12 ino 0xe isize 0x1000 pos 0x0 len 4096 flags DIRECT aio 0 ret 0
a.out-468609 [000] 6765.703243: ext2_dio_read_end: dev 7:12 ino 0xe isize 0x1000 pos 0x1000 len 0 flags DIRECT aio 0 ret 4096

Reported-and-tested-by: Disha Goel <disgoel@linux.ibm.com>
[Need to add CFLAGS_trace for fixing unable to find trace file problem]
Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Message-Id: <b8b0897fa2b273a448d7b4ba7317357ac73c08bc.1682069716.git.ritesh.list@gmail.com>

authored by

Ritesh Harjani (IBM) and committed by
Jan Kara
6e335cd7 fb5de435

+113 -2
+4 -1
fs/ext2/Makefile
··· 6 6 obj-$(CONFIG_EXT2_FS) += ext2.o 7 7 8 8 ext2-y := balloc.o dir.o file.o ialloc.o inode.o \ 9 - ioctl.o namei.o super.o symlink.o 9 + ioctl.o namei.o super.o symlink.o trace.o 10 + 11 + # For tracepoints to include our trace.h from tracepoint infrastructure 12 + CFLAGS_trace.o := -I$(src) 10 13 11 14 ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o 12 15 ext2-$(CONFIG_EXT2_FS_POSIX_ACL) += acl.o
+9 -1
fs/ext2/file.c
··· 29 29 #include "ext2.h" 30 30 #include "xattr.h" 31 31 #include "acl.h" 32 + #include "trace.h" 32 33 33 34 #ifdef CONFIG_FS_DAX 34 35 static ssize_t ext2_dax_read_iter(struct kiocb *iocb, struct iov_iter *to) ··· 169 168 struct inode *inode = file->f_mapping->host; 170 169 ssize_t ret; 171 170 171 + trace_ext2_dio_read_begin(iocb, to, 0); 172 172 inode_lock_shared(inode); 173 173 ret = iomap_dio_rw(iocb, to, &ext2_iomap_ops, NULL, 0, NULL, 0); 174 174 inode_unlock_shared(inode); 175 + trace_ext2_dio_read_end(iocb, to, ret); 175 176 176 177 return ret; 177 178 } ··· 201 198 mark_inode_dirty(inode); 202 199 } 203 200 out: 201 + trace_ext2_dio_write_endio(iocb, size, error); 204 202 return error; 205 203 } 206 204 ··· 218 214 unsigned long blocksize = inode->i_sb->s_blocksize; 219 215 loff_t offset = iocb->ki_pos; 220 216 loff_t count = iov_iter_count(from); 217 + ssize_t status = 0; 221 218 219 + trace_ext2_dio_write_begin(iocb, from, 0); 222 220 inode_lock(inode); 223 221 ret = generic_write_checks(iocb, from); 224 222 if (ret <= 0) ··· 248 242 /* handle case for partial write and for fallback to buffered write */ 249 243 if (ret >= 0 && iov_iter_count(from)) { 250 244 loff_t pos, endbyte; 251 - ssize_t status; 252 245 int ret2; 253 246 254 247 iocb->ki_flags &= ~IOCB_DIRECT; ··· 273 268 274 269 out_unlock: 275 270 inode_unlock(inode); 271 + if (status) 272 + trace_ext2_dio_write_buff_end(iocb, from, status); 273 + trace_ext2_dio_write_end(iocb, from, ret); 276 274 return ret; 277 275 } 278 276
+6
fs/ext2/trace.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #include "ext2.h" 3 + #include <linux/uio.h> 4 + 5 + #define CREATE_TRACE_POINTS 6 + #include "trace.h"
+94
fs/ext2/trace.h
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + 3 + #undef TRACE_SYSTEM 4 + #define TRACE_SYSTEM ext2 5 + 6 + #if !defined(_EXT2_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 7 + #define _EXT2_TRACE_H 8 + 9 + #include <linux/tracepoint.h> 10 + 11 + DECLARE_EVENT_CLASS(ext2_dio_class, 12 + TP_PROTO(struct kiocb *iocb, struct iov_iter *iter, ssize_t ret), 13 + TP_ARGS(iocb, iter, ret), 14 + TP_STRUCT__entry( 15 + __field(dev_t, dev) 16 + __field(ino_t, ino) 17 + __field(loff_t, isize) 18 + __field(loff_t, pos) 19 + __field(size_t, count) 20 + __field(int, ki_flags) 21 + __field(bool, aio) 22 + __field(ssize_t, ret) 23 + ), 24 + TP_fast_assign( 25 + __entry->dev = file_inode(iocb->ki_filp)->i_sb->s_dev; 26 + __entry->ino = file_inode(iocb->ki_filp)->i_ino; 27 + __entry->isize = file_inode(iocb->ki_filp)->i_size; 28 + __entry->pos = iocb->ki_pos; 29 + __entry->count = iov_iter_count(iter); 30 + __entry->ki_flags = iocb->ki_flags; 31 + __entry->aio = !is_sync_kiocb(iocb); 32 + __entry->ret = ret; 33 + ), 34 + TP_printk("dev %d:%d ino 0x%lx isize 0x%llx pos 0x%llx len %zu flags %s aio %d ret %zd", 35 + MAJOR(__entry->dev), MINOR(__entry->dev), 36 + __entry->ino, 37 + __entry->isize, 38 + __entry->pos, 39 + __entry->count, 40 + __print_flags(__entry->ki_flags, "|", TRACE_IOCB_STRINGS), 41 + __entry->aio, 42 + __entry->ret) 43 + ); 44 + 45 + #define DEFINE_DIO_RW_EVENT(name) \ 46 + DEFINE_EVENT(ext2_dio_class, name, \ 47 + TP_PROTO(struct kiocb *iocb, struct iov_iter *iter, ssize_t ret), \ 48 + TP_ARGS(iocb, iter, ret)) 49 + DEFINE_DIO_RW_EVENT(ext2_dio_write_begin); 50 + DEFINE_DIO_RW_EVENT(ext2_dio_write_end); 51 + DEFINE_DIO_RW_EVENT(ext2_dio_write_buff_end); 52 + DEFINE_DIO_RW_EVENT(ext2_dio_read_begin); 53 + DEFINE_DIO_RW_EVENT(ext2_dio_read_end); 54 + 55 + TRACE_EVENT(ext2_dio_write_endio, 56 + TP_PROTO(struct kiocb *iocb, ssize_t size, int ret), 57 + TP_ARGS(iocb, size, ret), 58 + TP_STRUCT__entry( 59 + __field(dev_t, dev) 60 + __field(ino_t, ino) 61 + __field(loff_t, isize) 62 + __field(loff_t, pos) 63 + __field(ssize_t, size) 64 + __field(int, ki_flags) 65 + __field(bool, aio) 66 + __field(int, ret) 67 + ), 68 + TP_fast_assign( 69 + __entry->dev = file_inode(iocb->ki_filp)->i_sb->s_dev; 70 + __entry->ino = file_inode(iocb->ki_filp)->i_ino; 71 + __entry->isize = file_inode(iocb->ki_filp)->i_size; 72 + __entry->pos = iocb->ki_pos; 73 + __entry->size = size; 74 + __entry->ki_flags = iocb->ki_flags; 75 + __entry->aio = !is_sync_kiocb(iocb); 76 + __entry->ret = ret; 77 + ), 78 + TP_printk("dev %d:%d ino 0x%lx isize 0x%llx pos 0x%llx len %zd flags %s aio %d ret %d", 79 + MAJOR(__entry->dev), MINOR(__entry->dev), 80 + __entry->ino, 81 + __entry->isize, 82 + __entry->pos, 83 + __entry->size, 84 + __print_flags(__entry->ki_flags, "|", TRACE_IOCB_STRINGS), 85 + __entry->aio, 86 + __entry->ret) 87 + ); 88 + 89 + #endif /* _EXT2_TRACE_H */ 90 + 91 + #undef TRACE_INCLUDE_PATH 92 + #define TRACE_INCLUDE_PATH . 93 + #define TRACE_INCLUDE_FILE trace 94 + #include <trace/define_trace.h>