Commit 848753aa authored by Namjae Jeon's avatar Namjae Jeon Committed by Jaegeuk Kim
Browse files

f2fs: add tracepoint for tracing the page i/o



Add tracepoints for page i/o operations and block allocation
tracing during page read operation.

Signed-off-by: default avatarNamjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: default avatarPankaj Kumar <pankaj.km@samsung.com>
Acked-by: default avatarSteven Rostedt <rostedt@goodmis.org>
[Jaegeuk: combine and modify the tracepoint structures]
Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
parent 51dd6249
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include "f2fs.h"
#include "node.h"
#include "segment.h"
#include <trace/events/f2fs.h>

/*
 * Lock ordering for the change of data block address:
@@ -348,6 +349,8 @@ int f2fs_readpage(struct f2fs_sb_info *sbi, struct page *page,
	struct block_device *bdev = sbi->sb->s_bdev;
	struct bio *bio;

	trace_f2fs_readpage(page, blk_addr, type);

	down_read(&sbi->bio_sem);

	/* Allocate a new bio */
@@ -388,14 +391,18 @@ static int get_data_block_ro(struct inode *inode, sector_t iblock,
	/* Get the page offset from the block offset(iblock) */
	pgofs =	(pgoff_t)(iblock >> (PAGE_CACHE_SHIFT - blkbits));

	if (check_extent_cache(inode, pgofs, bh_result))
	if (check_extent_cache(inode, pgofs, bh_result)) {
		trace_f2fs_get_data_block(inode, iblock, bh_result, 0);
		return 0;
	}

	/* When reading holes, we need its node page */
	set_new_dnode(&dn, inode, NULL, NULL, 0);
	err = get_dnode_of_data(&dn, pgofs, LOOKUP_NODE_RA);
	if (err)
	if (err) {
		trace_f2fs_get_data_block(inode, iblock, bh_result, err);
		return (err == -ENOENT) ? 0 : err;
	}

	/* It does not support data allocation */
	BUG_ON(create);
@@ -420,6 +427,7 @@ static int get_data_block_ro(struct inode *inode, sector_t iblock,
		bh_result->b_size = (i << blkbits);
	}
	f2fs_put_dnode(&dn);
	trace_f2fs_get_data_block(inode, iblock, bh_result, 0);
	return 0;
}

+74 −0
Original line number Diff line number Diff line
@@ -8,6 +8,15 @@

#define show_dev(entry)		MAJOR(entry->dev), MINOR(entry->dev)
#define show_dev_ino(entry)	show_dev(entry), (unsigned long)entry->ino
#define show_bio_type(type)						\
	__print_symbolic(type,						\
		{ READ, 	"READ" },				\
		{ READA, 	"READAHEAD" },				\
		{ READ_SYNC, 	"READ_SYNC" },				\
		{ WRITE, 	"WRITE" },				\
		{ WRITE_SYNC, 	"WRITE_SYNC" },				\
		{ WRITE_FLUSH,	"WRITE_FLUSH" },			\
		{ WRITE_FUA, 	"WRITE_FUA" })

DECLARE_EVENT_CLASS(f2fs__inode,

@@ -365,6 +374,71 @@ TRACE_EVENT(f2fs_truncate_partial_nodes,
		__entry->err)
);

TRACE_EVENT_CONDITION(f2fs_readpage,

	TP_PROTO(struct page *page, sector_t blkaddr, int type),

	TP_ARGS(page, blkaddr, type),

	TP_CONDITION(page->mapping),

	TP_STRUCT__entry(
		__field(dev_t,	dev)
		__field(ino_t,	ino)
		__field(pgoff_t,	index)
		__field(sector_t,	blkaddr)
		__field(int,	type)
	),

	TP_fast_assign(
		__entry->dev		= page->mapping->host->i_sb->s_dev;
		__entry->ino		= page->mapping->host->i_ino;
		__entry->index		= page->index;
		__entry->blkaddr	= blkaddr;
		__entry->type		= type;
	),

	TP_printk("dev = (%d,%d), ino = %lu, page_index = 0x%lx, "
		"blkaddr = 0x%llx, bio_type = %s",
		show_dev_ino(__entry),
		(unsigned long)__entry->index,
		(unsigned long long)__entry->blkaddr,
		show_bio_type(__entry->type))
);

TRACE_EVENT(f2fs_get_data_block,
	TP_PROTO(struct inode *inode, sector_t iblock,
				struct buffer_head *bh, int ret),

	TP_ARGS(inode, iblock, bh, ret),

	TP_STRUCT__entry(
		__field(dev_t,	dev)
		__field(ino_t,	ino)
		__field(sector_t,	iblock)
		__field(sector_t,	bh_start)
		__field(size_t,	bh_size)
		__field(int,	ret)
	),

	TP_fast_assign(
		__entry->dev		= inode->i_sb->s_dev;
		__entry->ino		= inode->i_ino;
		__entry->iblock		= iblock;
		__entry->bh_start	= bh->b_blocknr;
		__entry->bh_size	= bh->b_size;
		__entry->ret		= ret;
	),

	TP_printk("dev = (%d,%d), ino = %lu, file offset = %llu, "
		"start blkaddr = 0x%llx, len = 0x%llx bytes, err = %d",
		show_dev_ino(__entry),
		(unsigned long long)__entry->iblock,
		(unsigned long long)__entry->bh_start,
		(unsigned long long)__entry->bh_size,
		__entry->ret)
);

#endif /* _TRACE_F2FS_H */

 /* This part must be outside protection */