Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 77f4135f authored by Vivek Haldar's avatar Vivek Haldar Committed by Theodore Ts'o
Browse files

ext4: count hits/misses of extent cache and expose in sysfs



The number of hits and misses for each filesystem is exposed in
/sys/fs/ext4/<dev>/extent_cache_{hits, misses}.

Tested: fsstress, manual checks.
Signed-off-by: default avatarVivek Haldar <haldar@google.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 93917411
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1144,6 +1144,9 @@ struct ext4_sb_info {
	unsigned long s_ext_blocks;
	unsigned long s_ext_extents;
#endif
	/* ext4 extent cache stats */
	unsigned long extent_cache_hits;
	unsigned long extent_cache_misses;

	/* for buddy allocator */
	struct ext4_group_info ***s_group_info;
+6 −1
Original line number Diff line number Diff line
@@ -2035,6 +2035,7 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
			struct ext4_extent *ex)
{
	struct ext4_ext_cache *cex;
	struct ext4_sb_info *sbi;
	int ret = 0;

	/*
@@ -2042,6 +2043,7 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
	 */
	spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
	cex = &EXT4_I(inode)->i_cached_extent;
	sbi = EXT4_SB(inode->i_sb);

	/* has cache valid data? */
	if (cex->ec_len == 0)
@@ -2057,6 +2059,10 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
		ret = 1;
	}
errout:
	if (!ret)
		sbi->extent_cache_misses++;
	else
		sbi->extent_cache_hits++;
	spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
	return ret;
}
@@ -3901,4 +3907,3 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,

	return error;
}
+16 −0
Original line number Diff line number Diff line
@@ -2439,6 +2439,18 @@ static ssize_t lifetime_write_kbytes_show(struct ext4_attr *a,
			  EXT4_SB(sb)->s_sectors_written_start) >> 1)));
}

static ssize_t extent_cache_hits_show(struct ext4_attr *a,
				      struct ext4_sb_info *sbi, char *buf)
{
	return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_hits);
}

static ssize_t extent_cache_misses_show(struct ext4_attr *a,
					struct ext4_sb_info *sbi, char *buf)
{
	return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_misses);
}

static ssize_t inode_readahead_blks_store(struct ext4_attr *a,
					  struct ext4_sb_info *sbi,
					  const char *buf, size_t count)
@@ -2496,6 +2508,8 @@ static struct ext4_attr ext4_attr_##name = __ATTR(name, mode, show, store)
EXT4_RO_ATTR(delayed_allocation_blocks);
EXT4_RO_ATTR(session_write_kbytes);
EXT4_RO_ATTR(lifetime_write_kbytes);
EXT4_RO_ATTR(extent_cache_hits);
EXT4_RO_ATTR(extent_cache_misses);
EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show,
		 inode_readahead_blks_store, s_inode_readahead_blks);
EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
@@ -2511,6 +2525,8 @@ static struct attribute *ext4_attrs[] = {
	ATTR_LIST(delayed_allocation_blocks),
	ATTR_LIST(session_write_kbytes),
	ATTR_LIST(lifetime_write_kbytes),
	ATTR_LIST(extent_cache_hits),
	ATTR_LIST(extent_cache_misses),
	ATTR_LIST(inode_readahead_blks),
	ATTR_LIST(inode_goal),
	ATTR_LIST(mb_stats),