These TPs can help us monitor iomap content for dax reads and writes. Signed-off-by: Liu Bo <bo.li....@oracle.com> --- fs/btrfs/inode.c | 9 ++++ include/trace/events/btrfs.h | 106 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 9851422..b5bee38 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8067,6 +8067,8 @@ btrfs_get_blocks_dax_fault(struct inode *inode, u64 start, u64 len, struct extent_map *em; int ret = 0; + trace_btrfs_get_blocks_dax_entry(inode, start, len, create); + if (!create && start >= i_size_read(inode)) { return 0; } @@ -8190,12 +8192,19 @@ btrfs_get_blocks_dax_fault(struct inode *inode, u64 start, u64 len, map_block: ret = btrfs_em_to_iomap(root->fs_info, start, len, em, create, iomap); + if (!ret) { + if (create) + trace_btrfs_iomap_alloc(inode, start, len, iomap); + else + trace_btrfs_iomap_found(inode, start, len, iomap); + } out: free_extent_map(em); ASSERT(lockstart < lockend); unlock_extent_cached(&BTRFS_I(inode)->io_tree, lockstart, lockend, &cached_state, GFP_NOFS); + trace_btrfs_get_blocks_dax_exit(inode, start, len, create); return ret; } diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h index 0e04208..f7eb44f 100644 --- a/include/trace/events/btrfs.h +++ b/include/trace/events/btrfs.h @@ -7,6 +7,7 @@ #include <linux/writeback.h> #include <linux/tracepoint.h> #include <trace/events/mmflags.h> +#include <linux/iomap.h> struct btrfs_root; struct btrfs_fs_info; @@ -1471,6 +1472,111 @@ TRACE_EVENT(qgroup_update_counters, __entry->cur_new_count) ); +DECLARE_EVENT_CLASS(btrfs_iomap_class, + + TP_PROTO(struct inode *inode, u64 offset, u64 len, struct iomap *iomap), + + TP_ARGS(inode, offset, len, iomap), + + TP_STRUCT__entry_btrfs( + __field( u64, ino ) + __field( u64, isize ) + __field( u64, disk_isize ) + __field( u64, root_objectid ) + __field( u64, offset ) + __field( u64, len ) + __field( u64, startoff ) + __field( u64, blockstart ) + __field( u64, blocklen ) + __field( int, type ) + ), + + TP_fast_assign_btrfs(btrfs_sb(inode->i_sb), + __entry->ino = btrfs_ino(inode); + __entry->isize = i_size_read(inode); + __entry->disk_isize = BTRFS_I(inode)->disk_i_size; + __entry->root_objectid = + BTRFS_I(inode)->root->root_key.objectid; + __entry->offset = offset; + __entry->len = len; + __entry->startoff = iomap ? iomap->offset : 0; + __entry->blockstart = iomap ? (iomap->blkno << 9) : 0; + __entry->blocklen = iomap ? iomap->length : 0; + __entry->type = iomap ? iomap->type : 0; + ), + + TP_printk_btrfs("root 0x%llx(%s) ino 0x%llx size 0x%llx " + "disk_isize 0x%llx offset 0x%llx len 0x%llx " + "startoff 0x%llx blockstart %llu blocklen 0x%llx " + " type %d", + show_root_type(__entry->root_objectid), + __entry->ino, + __entry->isize, + __entry->disk_isize, + __entry->offset, + __entry->len, + __entry->startoff, + __entry->blockstart, + __entry->blocklen, + __entry->type) +); + +#define DEFINE_IOMAP_EVENT(name) \ +DEFINE_EVENT(btrfs_iomap_class, name, \ + TP_PROTO(struct inode *inode, u64 offset, u64 len, \ + struct iomap *iomap), \ + TP_ARGS(inode, offset, len, iomap)); + +DEFINE_IOMAP_EVENT(btrfs_iomap_alloc) +DEFINE_IOMAP_EVENT(btrfs_iomap_found) + +DECLARE_EVENT_CLASS(btrfs_get_blocks_dax, + + TP_PROTO(struct inode *inode, u64 offset, u64 len, int create), + + TP_ARGS(inode, offset, len, create), + + TP_STRUCT__entry_btrfs( + __field( u64, root_objectid ) + __field( u64, ino ) + __field( u64, isize ) + __field( u64, disk_isize ) + __field( u64, offset ) + __field( u64, len ) + __field( int, create ) + ), + + TP_fast_assign_btrfs(btrfs_sb(inode->i_sb), + __entry->root_objectid = BTRFS_I(inode)->root->objectid; + __entry->ino = btrfs_ino(inode); + __entry->isize = i_size_read(inode); + __entry->disk_isize = BTRFS_I(inode)->disk_i_size; + __entry->offset = offset; + __entry->len = len; + __entry->create = create; + ), + + TP_printk_btrfs("root 0x%llx(%s) ino 0x%llx isize 0x%llx " + "disk_isize 0x%llx offset 0x%llx len 0x%llx create %d", + show_root_type(__entry->root_objectid), + __entry->ino, + __entry->isize, + __entry->disk_isize, + __entry->offset, + __entry->len, + __entry->create + ) +); + +#define DEFINE_GETBLOCKS_DAX_EVENT(name) \ +DEFINE_EVENT(btrfs_get_blocks_dax, name, \ + TP_PROTO(struct inode *inode, u64 offset, u64 len, \ + int create), \ + TP_ARGS(inode, offset, len, create)); + +DEFINE_GETBLOCKS_DAX_EVENT(btrfs_get_blocks_dax_entry) +DEFINE_GETBLOCKS_DAX_EVENT(btrfs_get_blocks_dax_exit) + #endif /* _TRACE_BTRFS_H */ /* This part must be outside protection */ -- 2.5.5 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html