diff options
author | Vivek Haldar <haldar@google.com> | 2011-05-22 21:24:16 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2011-05-22 21:24:16 -0400 |
commit | 77f4135f2a219a2127be6cc1208c42e6175b11dd (patch) | |
tree | 8f85549d2354c5a69a5b29197f68a554daad1324 /fs/ext4 | |
parent | 93917411be8db5d21abf15c781dfa43c5cc6edf2 (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.h | 3 | ||||
-rw-r--r-- | fs/ext4/extents.c | 7 | ||||
-rw-r--r-- | fs/ext4/super.c | 16 |
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 | } |
2059 | errout: | 2061 | errout: |
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 | ||
2442 | static 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 | |||
2448 | static 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 | |||
2442 | static ssize_t inode_readahead_blks_store(struct ext4_attr *a, | 2454 | static 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) | |||
2496 | EXT4_RO_ATTR(delayed_allocation_blocks); | 2508 | EXT4_RO_ATTR(delayed_allocation_blocks); |
2497 | EXT4_RO_ATTR(session_write_kbytes); | 2509 | EXT4_RO_ATTR(session_write_kbytes); |
2498 | EXT4_RO_ATTR(lifetime_write_kbytes); | 2510 | EXT4_RO_ATTR(lifetime_write_kbytes); |
2511 | EXT4_RO_ATTR(extent_cache_hits); | ||
2512 | EXT4_RO_ATTR(extent_cache_misses); | ||
2499 | EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show, | 2513 | EXT4_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); |
2501 | EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal); | 2515 | EXT4_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), |