From: Hongbo Li <lihongbo22@huawei.com> hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/release-management/issues/ID5W1P -------------------------------- In order to debug mfs, we provide the some basic tracepoint in MFS, which are: - trace_mfs_post_event_read: trace events which are posted - trace_mfs_open: trace open operation - trace_mfs_release: trace close operation - trace_mfs_dev_read: trace events reading - trace_mfs_lookup: trace lookup operation Signed-off-by: Huang Xiaojia <huangxiaojia2@huawei.com> Signed-off-by: Hongbo Li <lihongbo22@huawei.com> --- fs/mfs/cache.c | 3 ++ fs/mfs/data.c | 4 ++ fs/mfs/dev.c | 3 ++ fs/mfs/inode.c | 3 ++ fs/mfs/super.c | 3 ++ include/trace/events/mfs.h | 105 +++++++++++++++++++++++++++++++++++++ 6 files changed, 121 insertions(+) create mode 100644 include/trace/events/mfs.h diff --git a/fs/mfs/cache.c b/fs/mfs/cache.c index 0466f6aefe6f..2178c78f4f1a 100644 --- a/fs/mfs/cache.c +++ b/fs/mfs/cache.c @@ -9,6 +9,8 @@ #include <linux/rwsem.h> #include <linux/pagemap.h> +#include <trace/events/mfs.h> + /* * Used for cache object */ @@ -278,6 +280,7 @@ void mfs_post_event_read(struct mfs_cache_object *object, /* 2. hold object's owner mfs_inode */ ihold(object->mfs_inode); + trace_mfs_post_event_read(object->mfs_inode, off, len, op); refcount_set(&event->ref, 1); event->object = object; event->msg.version = 0; diff --git a/fs/mfs/data.c b/fs/mfs/data.c index 9df523abf92e..6b4f61096f87 100644 --- a/fs/mfs/data.c +++ b/fs/mfs/data.c @@ -7,6 +7,8 @@ #include <linux/uio.h> #include <linux/completion.h> +#include <trace/events/mfs.h> + static struct mfs_file_info *mfs_file_info_alloc(struct file *lower, struct file *cache) { struct mfs_file_info *info = kzalloc(sizeof(struct mfs_file_info), GFP_KERNEL); @@ -36,6 +38,7 @@ static int mfs_open(struct inode *inode, struct file *file) struct mfs_file_info *file_info; int err = 0; + trace_mfs_open(inode, file); mfs_get_path(dentry, &lpath, &cpath); lfile = dentry_open(&lpath, flags, current_cred()); if (IS_ERR(lfile)) { @@ -71,6 +74,7 @@ static int mfs_open(struct inode *inode, struct file *file) static int mfs_release(struct inode *inode, struct file *file) { + trace_mfs_release(inode, file); mfs_file_info_free(file->private_data); return 0; } diff --git a/fs/mfs/dev.c b/fs/mfs/dev.c index b9e512a11ee4..15b55b257d2f 100644 --- a/fs/mfs/dev.c +++ b/fs/mfs/dev.c @@ -9,6 +9,8 @@ #include <linux/list.h> #include "../mount.h" +#include <trace/events/mfs.h> + static DEFINE_MUTEX(mfs_dev_lock); static DEFINE_IDR(mfs_dev_minor); @@ -130,6 +132,7 @@ static ssize_t mfs_dev_read(struct file *file, char __user *buf, if (ret) mfs_finish_event(event, &xas); put_mfs_event(event); + trace_mfs_dev_read(file, msg->opcode, msg->id, msg->fd); return ret ? ret : n; } diff --git a/fs/mfs/inode.c b/fs/mfs/inode.c index 3edd9bb3afa1..9894676a1da9 100644 --- a/fs/mfs/inode.c +++ b/fs/mfs/inode.c @@ -7,6 +7,8 @@ #include <linux/fs_stack.h> #include <linux/namei.h> +#include <trace/events/mfs.h> + static int mfs_inode_eq(struct inode *inode, void *lower_target) { return mfs_lower_inode(inode) == (struct inode *)lower_target; @@ -126,6 +128,7 @@ struct dentry *mfs_lookup(struct inode *dir, struct dentry *dentry, const char *name; int err; + trace_mfs_lookup(dir, dentry, flag); parent = dget_parent(dentry); mfs_get_path(parent, &parent_lpath, &parent_cpath); err = mfs_alloc_dentry_info(dentry); diff --git a/fs/mfs/super.c b/fs/mfs/super.c index 172d95b7d607..fa096f17e4a7 100644 --- a/fs/mfs/super.c +++ b/fs/mfs/super.c @@ -13,6 +13,9 @@ #include <linux/delay.h> #include <linux/string.h> +#define CREATE_TRACE_POINTS +#include <trace/events/mfs.h> + /* * Used for alloc_inode */ diff --git a/include/trace/events/mfs.h b/include/trace/events/mfs.h new file mode 100644 index 000000000000..5963888d0993 --- /dev/null +++ b/include/trace/events/mfs.h @@ -0,0 +1,105 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM mfs + +#if !defined(_TRACE_MFS_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_MFS_H + +#include <linux/tracepoint.h> +#include <linux/fs.h> + +TRACE_EVENT(mfs_lookup, + TP_PROTO(struct inode *dir, struct dentry *dentry, unsigned int flag), + TP_ARGS(dir, dentry, flag), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __string(name, dentry->d_name.name) + __field(unsigned int, flag) + ), + TP_fast_assign( + __entry->dev = dir->i_sb->s_dev; + __entry->ino = dir->i_ino; + __assign_str(name, dentry->d_name.name); + __entry->flag = flag; + ), + + TP_printk("dev=%d ino=%lu name=%s flag=%x", + MINOR(__entry->dev), __entry->ino, __get_str(name), __entry->flag) +); + +DECLARE_EVENT_CLASS(mfs_file_normal, + TP_PROTO(struct inode *inode, struct file *file), + TP_ARGS(inode, file), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __field(mode_t, mode) + ), + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->mode = file->f_mode; + ), + + TP_printk("dev=%d ino=%lu mode=%o", + MINOR(__entry->dev), __entry->ino, __entry->mode) +); + +DEFINE_EVENT(mfs_file_normal, mfs_open, + TP_PROTO(struct inode *inode, struct file *file), + TP_ARGS(inode, file) +); + +DEFINE_EVENT(mfs_file_normal, mfs_release, + TP_PROTO(struct inode *inode, struct file *file), + TP_ARGS(inode, file) +); + +TRACE_EVENT(mfs_post_event_read, + TP_PROTO(struct inode *inode, loff_t off, uint64_t len, int op), + TP_ARGS(inode, off, len, op), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __field(loff_t, off) + __field(uint64_t, len) + __field(int, op) + ), + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->off = off; + __entry->len = len; + __entry->op = op; + ), + + TP_printk("(miss) dev=%d ino=%lu off=%lld len=%llu op=%d", + MINOR(__entry->dev), __entry->ino, __entry->off, __entry->len, __entry->op) +); + +TRACE_EVENT(mfs_dev_read, + TP_PROTO(struct file *file, int op, uint32_t msgid, uint32_t fd), + TP_ARGS(file, op, msgid, fd), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __field(int, op) + __field(uint32_t, msgid) + __field(uint32_t, fd) + ), + TP_fast_assign( + __entry->dev = file->f_inode->i_sb->s_dev; + __entry->ino = file->f_inode->i_ino; + __entry->op = op; + __entry->msgid = msgid; + __entry->fd = fd; + ), + + TP_printk("dev=%d ino=%lu op=%d msgid=%u fd=%u", + MINOR(__entry->dev), __entry->ino, __entry->op, __entry->msgid, __entry->fd) +); + +#endif /* _TRACE_MFS_H */ + +#include <trace/define_trace.h> -- 2.25.1