aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorVivek Haldar <haldar@google.com>2011-05-22 21:24:16 -0400
committerTheodore Ts'o <tytso@mit.edu>2011-05-22 21:24:16 -0400
commit77f4135f2a219a2127be6cc1208c42e6175b11dd (patch)
tree8f85549d2354c5a69a5b29197f68a554daad1324 /fs/ext4
parent93917411be8db5d21abf15c781dfa43c5cc6edf2 (diff)
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>
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/ext4.h3
-rw-r--r--fs/ext4/extents.c7
-rw-r--r--fs/ext4/super.c16
3 files changed, 25 insertions, 1 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 6ce3c7c8574c..65fe1dc0c750 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -1144,6 +1144,9 @@ struct ext4_sb_info {
1144 unsigned long s_ext_blocks; 1144 unsigned long s_ext_blocks;
1145 unsigned long s_ext_extents; 1145 unsigned long s_ext_extents;
1146#endif 1146#endif
1147 /* ext4 extent cache stats */
1148 unsigned long extent_cache_hits;
1149 unsigned long extent_cache_misses;
1147 1150
1148 /* for buddy allocator */ 1151 /* for buddy allocator */
1149 struct ext4_group_info ***s_group_info; 1152 struct ext4_group_info ***s_group_info;
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 9a3844adb1cb..4444317d141a 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -2035,6 +2035,7 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
2035 struct ext4_extent *ex) 2035 struct ext4_extent *ex)
2036{ 2036{
2037 struct ext4_ext_cache *cex; 2037 struct ext4_ext_cache *cex;
2038 struct ext4_sb_info *sbi;
2038 int ret = 0; 2039 int ret = 0;
2039 2040
2040 /* 2041 /*
@@ -2042,6 +2043,7 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
2042 */ 2043 */
2043 spin_lock(&EXT4_I(inode)->i_block_reservation_lock); 2044 spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
2044 cex = &EXT4_I(inode)->i_cached_extent; 2045 cex = &EXT4_I(inode)->i_cached_extent;
2046 sbi = EXT4_SB(inode->i_sb);
2045 2047
2046 /* has cache valid data? */ 2048 /* has cache valid data? */
2047 if (cex->ec_len == 0) 2049 if (cex->ec_len == 0)
@@ -2057,6 +2059,10 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
2057 ret = 1; 2059 ret = 1;
2058 } 2060 }
2059errout: 2061errout:
2062 if (!ret)
2063 sbi->extent_cache_misses++;
2064 else
2065 sbi->extent_cache_hits++;
2060 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); 2066 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
2061 return ret; 2067 return ret;
2062} 2068}
@@ -3901,4 +3907,3 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
3901 3907
3902 return error; 3908 return error;
3903} 3909}
3904
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index fdce4eebce0c..874dd25b7481 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -2439,6 +2439,18 @@ static ssize_t lifetime_write_kbytes_show(struct ext4_attr *a,
2439 EXT4_SB(sb)->s_sectors_written_start) >> 1))); 2439 EXT4_SB(sb)->s_sectors_written_start) >> 1)));
2440} 2440}
2441 2441
2442static ssize_t extent_cache_hits_show(struct ext4_attr *a,
2443 struct ext4_sb_info *sbi, char *buf)
2444{
2445 return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_hits);
2446}
2447
2448static ssize_t extent_cache_misses_show(struct ext4_attr *a,
2449 struct ext4_sb_info *sbi, char *buf)
2450{
2451 return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_misses);
2452}
2453
2442static ssize_t inode_readahead_blks_store(struct ext4_attr *a, 2454static ssize_t inode_readahead_blks_store(struct ext4_attr *a,
2443 struct ext4_sb_info *sbi, 2455 struct ext4_sb_info *sbi,
2444 const char *buf, size_t count) 2456 const char *buf, size_t count)
@@ -2496,6 +2508,8 @@ static struct ext4_attr ext4_attr_##name = __ATTR(name, mode, show, store)
2496EXT4_RO_ATTR(delayed_allocation_blocks); 2508EXT4_RO_ATTR(delayed_allocation_blocks);
2497EXT4_RO_ATTR(session_write_kbytes); 2509EXT4_RO_ATTR(session_write_kbytes);
2498EXT4_RO_ATTR(lifetime_write_kbytes); 2510EXT4_RO_ATTR(lifetime_write_kbytes);
2511EXT4_RO_ATTR(extent_cache_hits);
2512EXT4_RO_ATTR(extent_cache_misses);
2499EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show, 2513EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show,
2500 inode_readahead_blks_store, s_inode_readahead_blks); 2514 inode_readahead_blks_store, s_inode_readahead_blks);
2501EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal); 2515EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
@@ -2511,6 +2525,8 @@ static struct attribute *ext4_attrs[] = {
2511 ATTR_LIST(delayed_allocation_blocks), 2525 ATTR_LIST(delayed_allocation_blocks),
2512 ATTR_LIST(session_write_kbytes), 2526 ATTR_LIST(session_write_kbytes),
2513 ATTR_LIST(lifetime_write_kbytes), 2527 ATTR_LIST(lifetime_write_kbytes),
2528 ATTR_LIST(extent_cache_hits),
2529 ATTR_LIST(extent_cache_misses),
2514 ATTR_LIST(inode_readahead_blks), 2530 ATTR_LIST(inode_readahead_blks),
2515 ATTR_LIST(inode_goal), 2531 ATTR_LIST(inode_goal),
2516 ATTR_LIST(mb_stats), 2532 ATTR_LIST(mb_stats),