Add basic tracepoints for {alloc, evict, free}_inode, setattr and
fallocate. These can help users to debug hugetlbfs more conveniently.

Signed-off-by: Hongbo Li <[email protected]>
---
 MAINTAINERS                      |   1 +
 include/trace/events/hugetlbfs.h | 160 +++++++++++++++++++++++++++++++
 2 files changed, 161 insertions(+)
 create mode 100644 include/trace/events/hugetlbfs.h

diff --git a/MAINTAINERS b/MAINTAINERS
index cd2ca0c3158e..865c48e92d40 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -10188,6 +10188,7 @@ F:      Documentation/mm/hugetlbfs_reserv.rst
 F:     Documentation/mm/vmemmap_dedup.rst
 F:     fs/hugetlbfs/
 F:     include/linux/hugetlb.h
+F:     include/trace/events/hugetlbfs.h
 F:     mm/hugetlb.c
 F:     mm/hugetlb_vmemmap.c
 F:     mm/hugetlb_vmemmap.h
diff --git a/include/trace/events/hugetlbfs.h b/include/trace/events/hugetlbfs.h
new file mode 100644
index 000000000000..975f584f6f51
--- /dev/null
+++ b/include/trace/events/hugetlbfs.h
@@ -0,0 +1,160 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM hugetlbfs
+
+#if !defined(_TRACE_HUGETLBFS_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_HUGETLBFS_H
+
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(hugetlbfs_alloc_inode,
+
+       TP_PROTO(struct inode *inode, struct inode *dir, int mode),
+
+       TP_ARGS(inode, dir, mode),
+
+       TP_STRUCT__entry(
+               __field(dev_t,          dev)
+               __field(ino_t,          ino)
+               __field(ino_t,          dir)
+               __field(__u16,          mode)
+       ),
+
+       TP_fast_assign(
+               __entry->dev            = inode->i_sb->s_dev;
+               __entry->ino            = inode->i_ino;
+               __entry->dir            = dir->i_ino;
+               __entry->mode           = mode;
+       ),
+
+       TP_printk("dev = (%d,%d), ino = %lu, dir = %lu, mode = 0%o",
+               MAJOR(__entry->dev), MINOR(__entry->dev),
+               (unsigned long) __entry->ino,
+               (unsigned long) __entry->dir, __entry->mode)
+);
+
+DECLARE_EVENT_CLASS(hugetlbfs__inode,
+
+       TP_PROTO(struct inode *inode),
+
+       TP_ARGS(inode),
+
+       TP_STRUCT__entry(
+               __field(dev_t,          dev)
+               __field(ino_t,          ino)
+               __field(__u16,          mode)
+               __field(loff_t,         size)
+               __field(unsigned int,   nlink)
+               __field(unsigned int,   seals)
+               __field(blkcnt_t,       blocks)
+       ),
+
+       TP_fast_assign(
+               __entry->dev            = inode->i_sb->s_dev;
+               __entry->ino            = inode->i_ino;
+               __entry->mode           = inode->i_mode;
+               __entry->size           = inode->i_size;
+               __entry->nlink          = inode->i_nlink;
+               __entry->seals          = HUGETLBFS_I(inode)->seals;
+               __entry->blocks         = inode->i_blocks;
+       ),
+
+       TP_printk("dev = (%d,%d), ino = %lu, i_mode = 0%o, i_size = %lld, 
i_nlink = %u, seals = %u, i_blocks = %llu",
+               MAJOR(__entry->dev), MINOR(__entry->dev), (unsigned long) 
__entry->ino,
+               __entry->mode, __entry->size, __entry->nlink, __entry->seals,
+               (unsigned long long)__entry->blocks)
+);
+
+DEFINE_EVENT(hugetlbfs__inode, hugetlbfs_evict_inode,
+
+       TP_PROTO(struct inode *inode),
+
+       TP_ARGS(inode)
+);
+
+DEFINE_EVENT(hugetlbfs__inode, hugetlbfs_free_inode,
+
+       TP_PROTO(struct inode *inode),
+
+       TP_ARGS(inode)
+);
+
+TRACE_EVENT(hugetlbfs_setattr,
+
+       TP_PROTO(struct inode *inode, struct dentry *dentry,
+               struct iattr *attr),
+
+       TP_ARGS(inode, dentry, attr),
+
+       TP_STRUCT__entry(
+               __field(dev_t,          dev)
+               __field(ino_t,          ino)
+               __field(unsigned int,   d_len)
+               __string(d_name,        dentry->d_name.name)
+               __field(unsigned int,   ia_valid)
+               __field(unsigned int,   ia_mode)
+               __field(unsigned int,   ia_uid)
+               __field(unsigned int,   ia_gid)
+               __field(loff_t,         old_size)
+               __field(loff_t,         ia_size)
+       ),
+
+       TP_fast_assign(
+               __entry->dev            = inode->i_sb->s_dev;
+               __entry->ino            = inode->i_ino;
+               __entry->d_len          = dentry->d_name.len;
+               __assign_str(d_name);
+               __entry->ia_valid       = attr->ia_valid;
+               __entry->ia_mode        = attr->ia_mode;
+               __entry->ia_uid         = from_kuid_munged(current_user_ns(), 
attr->ia_uid);
+               __entry->ia_gid         = from_kgid_munged(current_user_ns(), 
attr->ia_gid);
+               __entry->old_size       = inode->i_size;
+               __entry->ia_size        = attr->ia_size;
+       ),
+
+       TP_printk("dev = (%d,%d), ino = %lu, name = %.*s, ia_valid = %u, 
ia_mode = 0%o, ia_uid = %u, ia_gid = %u, old_size = %lld, ia_size = %lld",
+               MAJOR(__entry->dev), MINOR(__entry->dev), (unsigned 
long)__entry->ino,
+               __entry->d_len, __get_str(d_name), __entry->ia_valid, 
__entry->ia_mode,
+               __entry->ia_uid, __entry->ia_gid, __entry->old_size, 
__entry->ia_size)
+);
+
+TRACE_EVENT(hugetlbfs_fallocate,
+
+       TP_PROTO(struct inode *inode, int mode,
+               loff_t offset, loff_t len, int ret),
+
+       TP_ARGS(inode, mode, offset, len, ret),
+
+       TP_STRUCT__entry(
+               __field(dev_t,          dev)
+               __field(ino_t,          ino)
+               __field(int,            mode)
+               __field(loff_t,         offset)
+               __field(loff_t,         len)
+               __field(loff_t,         size)
+               __field(int,            ret)
+       ),
+
+       TP_fast_assign(
+               __entry->dev            = inode->i_sb->s_dev;
+               __entry->ino            = inode->i_ino;
+               __entry->mode           = mode;
+               __entry->offset         = offset;
+               __entry->len            = len;
+               __entry->size           = inode->i_size;
+               __entry->ret            = ret;
+       ),
+
+       TP_printk("dev = (%d,%d), ino = %lu, mode = %x, offset = %lld, len = 
%lld,  i_size = %lld, ret = %d",
+               MAJOR(__entry->dev), MINOR(__entry->dev),
+               (unsigned long)__entry->ino, __entry->mode,
+               (unsigned long long)__entry->offset,
+               (unsigned long long)__entry->len,
+               (unsigned long long)__entry->size,
+               __entry->ret)
+);
+
+#endif /* _TRACE_HUGETLBFS_H */
+
+ /* This part must be outside protection */
+#include <trace/define_trace.h>
-- 
2.34.1


Reply via email to