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: Vivek Haldar <haldar@google.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
committed by
Theodore Ts'o
parent
93917411be
commit
77f4135f2a
@@ -1144,6 +1144,9 @@ struct ext4_sb_info {
|
|||||||
unsigned long s_ext_blocks;
|
unsigned long s_ext_blocks;
|
||||||
unsigned long s_ext_extents;
|
unsigned long s_ext_extents;
|
||||||
#endif
|
#endif
|
||||||
|
/* ext4 extent cache stats */
|
||||||
|
unsigned long extent_cache_hits;
|
||||||
|
unsigned long extent_cache_misses;
|
||||||
|
|
||||||
/* for buddy allocator */
|
/* for buddy allocator */
|
||||||
struct ext4_group_info ***s_group_info;
|
struct ext4_group_info ***s_group_info;
|
||||||
|
@@ -2035,6 +2035,7 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
|
|||||||
struct ext4_extent *ex)
|
struct ext4_extent *ex)
|
||||||
{
|
{
|
||||||
struct ext4_ext_cache *cex;
|
struct ext4_ext_cache *cex;
|
||||||
|
struct ext4_sb_info *sbi;
|
||||||
int ret = 0;
|
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);
|
spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
|
||||||
cex = &EXT4_I(inode)->i_cached_extent;
|
cex = &EXT4_I(inode)->i_cached_extent;
|
||||||
|
sbi = EXT4_SB(inode->i_sb);
|
||||||
|
|
||||||
/* has cache valid data? */
|
/* has cache valid data? */
|
||||||
if (cex->ec_len == 0)
|
if (cex->ec_len == 0)
|
||||||
@@ -2057,6 +2059,10 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
|
|||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
errout:
|
errout:
|
||||||
|
if (!ret)
|
||||||
|
sbi->extent_cache_misses++;
|
||||||
|
else
|
||||||
|
sbi->extent_cache_hits++;
|
||||||
spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
|
spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -3901,4 +3907,3 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2439,6 +2439,18 @@ static ssize_t lifetime_write_kbytes_show(struct ext4_attr *a,
|
|||||||
EXT4_SB(sb)->s_sectors_written_start) >> 1)));
|
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,
|
static ssize_t inode_readahead_blks_store(struct ext4_attr *a,
|
||||||
struct ext4_sb_info *sbi,
|
struct ext4_sb_info *sbi,
|
||||||
const char *buf, size_t count)
|
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(delayed_allocation_blocks);
|
||||||
EXT4_RO_ATTR(session_write_kbytes);
|
EXT4_RO_ATTR(session_write_kbytes);
|
||||||
EXT4_RO_ATTR(lifetime_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,
|
EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show,
|
||||||
inode_readahead_blks_store, s_inode_readahead_blks);
|
inode_readahead_blks_store, s_inode_readahead_blks);
|
||||||
EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
|
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(delayed_allocation_blocks),
|
||||||
ATTR_LIST(session_write_kbytes),
|
ATTR_LIST(session_write_kbytes),
|
||||||
ATTR_LIST(lifetime_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_readahead_blks),
|
||||||
ATTR_LIST(inode_goal),
|
ATTR_LIST(inode_goal),
|
||||||
ATTR_LIST(mb_stats),
|
ATTR_LIST(mb_stats),
|
||||||
|
Reference in New Issue
Block a user