From 462749cb87a9b8bdc391e37a5b13a80c45c40e90 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Wed, 4 Mar 2020 14:59:53 -0800 Subject: [PATCH] scoutfs: add stage and release tracing Add a bit more tracing to stage, release, and unwritten extent conversion so we can get a bit more visibility into the threads staging and releasing. Signed-off-by: Zach Brown --- kmod/src/data.c | 4 ++ kmod/src/ioctl.c | 7 ++- kmod/src/scoutfs_trace.h | 93 ++++++++++++++++++++++++++++++---------- 3 files changed, 80 insertions(+), 24 deletions(-) diff --git a/kmod/src/data.c b/kmod/src/data.c index 0750b441..f9666857 100644 --- a/kmod/src/data.c +++ b/kmod/src/data.c @@ -972,6 +972,7 @@ static int convert_unwritten(struct super_block *sb, struct inode *inode, struct unpacked_extent *ext, u64 iblock, struct scoutfs_lock *lock) { + struct scoutfs_traced_extent te; u64 blkno; u8 ext_fl; int err; @@ -980,6 +981,9 @@ static int convert_unwritten(struct super_block *sb, struct inode *inode, blkno = ext->blkno + (iblock - ext->iblock); ext_fl = ext->flags; + init_traced_extent(&te, iblock, 1, blkno, ext_fl); + trace_scoutfs_data_convert_unwritten(sb, scoutfs_ino(inode), &te); + ret = set_extent(sb, inode, scoutfs_ino(inode), unpe, iblock, blkno, 1, ext_fl & ~(SEF_OFFLINE|SEF_UNWRITTEN)); if (ret < 0) diff --git a/kmod/src/ioctl.c b/kmod/src/ioctl.c index eeebec8e..148e7356 100644 --- a/kmod/src/ioctl.c +++ b/kmod/src/ioctl.c @@ -281,7 +281,7 @@ static long scoutfs_ioc_release(struct file *file, unsigned long arg) if (copy_from_user(&args, (void __user *)arg, sizeof(args))) return -EFAULT; - trace_scoutfs_ioc_release(sb, &args); + trace_scoutfs_ioc_release(sb, scoutfs_ino(inode), &args); if (args.count == 0) return 0; @@ -344,7 +344,7 @@ out: mutex_unlock(&inode->i_mutex); mnt_drop_write_file(file); - trace_scoutfs_ioc_release_ret(sb, ret); + trace_scoutfs_ioc_release_ret(sb, scoutfs_ino(inode), ret); return ret; } @@ -395,6 +395,8 @@ static long scoutfs_ioc_stage(struct file *file, unsigned long arg) if (copy_from_user(&args, (void __user *)arg, sizeof(args))) return -EFAULT; + trace_scoutfs_ioc_stage(sb, scoutfs_ino(inode), &args); + end_size = args.offset + args.count; /* verify arg constraints that aren't dependent on file */ @@ -464,6 +466,7 @@ out: mutex_unlock(&inode->i_mutex); mnt_drop_write_file(file); + trace_scoutfs_ioc_stage_ret(sb, scoutfs_ino(inode), ret); return ret; } diff --git a/kmod/src/scoutfs_trace.h b/kmod/src/scoutfs_trace.h index c4b4b48d..7a56c831 100644 --- a/kmod/src/scoutfs_trace.h +++ b/kmod/src/scoutfs_trace.h @@ -61,6 +61,27 @@ struct lock_info; #define DECLARE_TRACED_EXTENT(name) \ struct scoutfs_traced_extent name = {0} +DECLARE_EVENT_CLASS(scoutfs_ino_ret_class, + TP_PROTO(struct super_block *sb, u64 ino, int ret), + + TP_ARGS(sb, ino, ret), + + TP_STRUCT__entry( + SCSB_TRACE_FIELDS + __field(__u64, ino) + __field(int, ret) + ), + + TP_fast_assign( + SCSB_TRACE_ASSIGN(sb); + __entry->ino = ino; + __entry->ret = ret; + ), + + TP_printk(SCSBF" ino %llu ret %d", + SCSB_TRACE_ARGS, __entry->ino, __entry->ret) +); + TRACE_EVENT(scoutfs_setattr, TP_PROTO(struct dentry *dentry, struct iattr *attr), @@ -232,6 +253,11 @@ DEFINE_EVENT(scoutfs_data_file_extent_class, scoutfs_data_alloc_block, struct scoutfs_traced_extent *te), TP_ARGS(sb, ino, te) ); +DEFINE_EVENT(scoutfs_data_file_extent_class, scoutfs_data_convert_unwritten, + TP_PROTO(struct super_block *sb, __u64 ino, + struct scoutfs_traced_extent *te), + TP_ARGS(sb, ino, te) +); DEFINE_EVENT(scoutfs_data_file_extent_class, scoutfs_data_prealloc_unwritten, TP_PROTO(struct super_block *sb, __u64 ino, struct scoutfs_traced_extent *te), @@ -471,31 +497,15 @@ TRACE_EVENT(scoutfs_trans_track_item, __entry->res_vals) ); -TRACE_EVENT(scoutfs_ioc_release_ret, - TP_PROTO(struct super_block *sb, int ret), - - TP_ARGS(sb, ret), - - TP_STRUCT__entry( - SCSB_TRACE_FIELDS - __field(int, ret) - ), - - TP_fast_assign( - SCSB_TRACE_ASSIGN(sb); - __entry->ret = ret; - ), - - TP_printk(SCSBF" ret %d", SCSB_TRACE_ARGS, __entry->ret) -); - TRACE_EVENT(scoutfs_ioc_release, - TP_PROTO(struct super_block *sb, struct scoutfs_ioctl_release *args), + TP_PROTO(struct super_block *sb, u64 ino, + struct scoutfs_ioctl_release *args), - TP_ARGS(sb, args), + TP_ARGS(sb, ino, args), TP_STRUCT__entry( SCSB_TRACE_FIELDS + __field(__u64, ino) __field(__u64, block) __field(__u64, count) __field(__u64, vers) @@ -503,13 +513,52 @@ TRACE_EVENT(scoutfs_ioc_release, TP_fast_assign( SCSB_TRACE_ASSIGN(sb); + __entry->ino = ino; __entry->block = args->block; __entry->count = args->count; __entry->vers = args->data_version; ), - TP_printk(SCSBF" block %llu count %llu vers %llu", SCSB_TRACE_ARGS, - __entry->block, __entry->count, __entry->vers) + TP_printk(SCSBF" ino %llu block %llu count %llu vers %llu", + SCSB_TRACE_ARGS, __entry->ino, __entry->block, + __entry->count, __entry->vers) +); + +DEFINE_EVENT(scoutfs_ino_ret_class, scoutfs_ioc_release_ret, + TP_PROTO(struct super_block *sb, u64 ino, int ret), + TP_ARGS(sb, ino, ret) +); + +TRACE_EVENT(scoutfs_ioc_stage, + TP_PROTO(struct super_block *sb, u64 ino, + struct scoutfs_ioctl_stage *args), + + TP_ARGS(sb, ino, args), + + TP_STRUCT__entry( + SCSB_TRACE_FIELDS + __field(__u64, ino) + __field(__u64, vers) + __field(__u64, offset) + __field(__s32, count) + ), + + TP_fast_assign( + SCSB_TRACE_ASSIGN(sb); + __entry->ino = ino; + __entry->vers = args->data_version; + __entry->offset = args->offset; + __entry->count = args->count; + ), + + TP_printk(SCSBF" ino %llu vers %llu offset %llu count %d", + SCSB_TRACE_ARGS, __entry->ino, __entry->vers, + __entry->offset, __entry->count) +); + +DEFINE_EVENT(scoutfs_ino_ret_class, scoutfs_ioc_stage_ret, + TP_PROTO(struct super_block *sb, u64 ino, int ret), + TP_ARGS(sb, ino, ret) ); TRACE_EVENT(scoutfs_ioc_walk_inodes,