diff options
| -rw-r--r-- | fs/ext4/ext4.h | 1 | ||||
| -rw-r--r-- | fs/ext4/extents_status.c | 39 | ||||
| -rw-r--r-- | include/trace/events/ext4.h | 40 |
3 files changed, 26 insertions, 54 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 6e16c1867959..96c10934bb96 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
| @@ -1268,6 +1268,7 @@ struct ext4_sb_info { | |||
| 1268 | atomic_t s_mb_preallocated; | 1268 | atomic_t s_mb_preallocated; |
| 1269 | atomic_t s_mb_discarded; | 1269 | atomic_t s_mb_discarded; |
| 1270 | atomic_t s_lock_busy; | 1270 | atomic_t s_lock_busy; |
| 1271 | atomic_t s_extent_cache_cnt; | ||
| 1271 | 1272 | ||
| 1272 | /* locality groups */ | 1273 | /* locality groups */ |
| 1273 | struct ext4_locality_group __percpu *s_locality_groups; | 1274 | struct ext4_locality_group __percpu *s_locality_groups; |
diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c index f768f4a98a2b..27fcdd2b2607 100644 --- a/fs/ext4/extents_status.c +++ b/fs/ext4/extents_status.c | |||
| @@ -147,11 +147,12 @@ static int __es_remove_extent(struct inode *inode, ext4_lblk_t lblk, | |||
| 147 | ext4_lblk_t end); | 147 | ext4_lblk_t end); |
| 148 | static int __es_try_to_reclaim_extents(struct ext4_inode_info *ei, | 148 | static int __es_try_to_reclaim_extents(struct ext4_inode_info *ei, |
| 149 | int nr_to_scan); | 149 | int nr_to_scan); |
| 150 | static int ext4_es_reclaim_extents_count(struct super_block *sb); | ||
| 151 | 150 | ||
| 152 | int __init ext4_init_es(void) | 151 | int __init ext4_init_es(void) |
| 153 | { | 152 | { |
| 154 | ext4_es_cachep = KMEM_CACHE(extent_status, SLAB_RECLAIM_ACCOUNT); | 153 | ext4_es_cachep = kmem_cache_create("ext4_extent_status", |
| 154 | sizeof(struct extent_status), | ||
| 155 | 0, (SLAB_RECLAIM_ACCOUNT), NULL); | ||
| 155 | if (ext4_es_cachep == NULL) | 156 | if (ext4_es_cachep == NULL) |
| 156 | return -ENOMEM; | 157 | return -ENOMEM; |
| 157 | return 0; | 158 | return 0; |
| @@ -302,8 +303,10 @@ ext4_es_alloc_extent(struct inode *inode, ext4_lblk_t lblk, ext4_lblk_t len, | |||
| 302 | /* | 303 | /* |
| 303 | * We don't count delayed extent because we never try to reclaim them | 304 | * We don't count delayed extent because we never try to reclaim them |
| 304 | */ | 305 | */ |
| 305 | if (!ext4_es_is_delayed(es)) | 306 | if (!ext4_es_is_delayed(es)) { |
| 306 | EXT4_I(inode)->i_es_lru_nr++; | 307 | EXT4_I(inode)->i_es_lru_nr++; |
| 308 | atomic_inc(&EXT4_SB(inode->i_sb)->s_extent_cache_cnt); | ||
| 309 | } | ||
| 307 | 310 | ||
| 308 | return es; | 311 | return es; |
| 309 | } | 312 | } |
| @@ -314,6 +317,7 @@ static void ext4_es_free_extent(struct inode *inode, struct extent_status *es) | |||
| 314 | if (!ext4_es_is_delayed(es)) { | 317 | if (!ext4_es_is_delayed(es)) { |
| 315 | BUG_ON(EXT4_I(inode)->i_es_lru_nr == 0); | 318 | BUG_ON(EXT4_I(inode)->i_es_lru_nr == 0); |
| 316 | EXT4_I(inode)->i_es_lru_nr--; | 319 | EXT4_I(inode)->i_es_lru_nr--; |
| 320 | atomic_dec(&EXT4_SB(inode->i_sb)->s_extent_cache_cnt); | ||
| 317 | } | 321 | } |
| 318 | 322 | ||
| 319 | kmem_cache_free(ext4_es_cachep, es); | 323 | kmem_cache_free(ext4_es_cachep, es); |
| @@ -674,10 +678,11 @@ static int ext4_es_shrink(struct shrinker *shrink, struct shrink_control *sc) | |||
| 674 | int nr_to_scan = sc->nr_to_scan; | 678 | int nr_to_scan = sc->nr_to_scan; |
| 675 | int ret, nr_shrunk = 0; | 679 | int ret, nr_shrunk = 0; |
| 676 | 680 | ||
| 677 | trace_ext4_es_shrink_enter(sbi->s_sb, nr_to_scan); | 681 | ret = atomic_read(&sbi->s_extent_cache_cnt); |
| 682 | trace_ext4_es_shrink_enter(sbi->s_sb, nr_to_scan, ret); | ||
| 678 | 683 | ||
| 679 | if (!nr_to_scan) | 684 | if (!nr_to_scan) |
| 680 | return ext4_es_reclaim_extents_count(sbi->s_sb); | 685 | return ret; |
| 681 | 686 | ||
| 682 | INIT_LIST_HEAD(&scanned); | 687 | INIT_LIST_HEAD(&scanned); |
| 683 | 688 | ||
| @@ -705,9 +710,10 @@ static int ext4_es_shrink(struct shrinker *shrink, struct shrink_control *sc) | |||
| 705 | } | 710 | } |
| 706 | list_splice_tail(&scanned, &sbi->s_es_lru); | 711 | list_splice_tail(&scanned, &sbi->s_es_lru); |
| 707 | spin_unlock(&sbi->s_es_lru_lock); | 712 | spin_unlock(&sbi->s_es_lru_lock); |
| 708 | trace_ext4_es_shrink_exit(sbi->s_sb, nr_shrunk); | ||
| 709 | 713 | ||
| 710 | return ext4_es_reclaim_extents_count(sbi->s_sb); | 714 | ret = atomic_read(&sbi->s_extent_cache_cnt); |
| 715 | trace_ext4_es_shrink_exit(sbi->s_sb, nr_shrunk, ret); | ||
| 716 | return ret; | ||
| 711 | } | 717 | } |
| 712 | 718 | ||
| 713 | void ext4_es_register_shrinker(struct super_block *sb) | 719 | void ext4_es_register_shrinker(struct super_block *sb) |
| @@ -751,25 +757,6 @@ void ext4_es_lru_del(struct inode *inode) | |||
| 751 | spin_unlock(&sbi->s_es_lru_lock); | 757 | spin_unlock(&sbi->s_es_lru_lock); |
| 752 | } | 758 | } |
| 753 | 759 | ||
| 754 | static int ext4_es_reclaim_extents_count(struct super_block *sb) | ||
| 755 | { | ||
| 756 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
| 757 | struct ext4_inode_info *ei; | ||
| 758 | struct list_head *cur; | ||
| 759 | int nr_cached = 0; | ||
| 760 | |||
| 761 | spin_lock(&sbi->s_es_lru_lock); | ||
| 762 | list_for_each(cur, &sbi->s_es_lru) { | ||
| 763 | ei = list_entry(cur, struct ext4_inode_info, i_es_lru); | ||
| 764 | read_lock(&ei->i_es_lock); | ||
| 765 | nr_cached += ei->i_es_lru_nr; | ||
| 766 | read_unlock(&ei->i_es_lock); | ||
| 767 | } | ||
| 768 | spin_unlock(&sbi->s_es_lru_lock); | ||
| 769 | trace_ext4_es_reclaim_extents_count(sb, nr_cached); | ||
| 770 | return nr_cached; | ||
| 771 | } | ||
| 772 | |||
| 773 | static int __es_try_to_reclaim_extents(struct ext4_inode_info *ei, | 760 | static int __es_try_to_reclaim_extents(struct ext4_inode_info *ei, |
| 774 | int nr_to_scan) | 761 | int nr_to_scan) |
| 775 | { | 762 | { |
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index c0457c0d1a68..4ee471003859 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h | |||
| @@ -2255,64 +2255,48 @@ TRACE_EVENT(ext4_es_lookup_extent_exit, | |||
| 2255 | __entry->found ? __entry->status : 0) | 2255 | __entry->found ? __entry->status : 0) |
| 2256 | ); | 2256 | ); |
| 2257 | 2257 | ||
| 2258 | TRACE_EVENT(ext4_es_reclaim_extents_count, | ||
| 2259 | TP_PROTO(struct super_block *sb, int nr_cached), | ||
| 2260 | |||
| 2261 | TP_ARGS(sb, nr_cached), | ||
| 2262 | |||
| 2263 | TP_STRUCT__entry( | ||
| 2264 | __field( dev_t, dev ) | ||
| 2265 | __field( int, nr_cached ) | ||
| 2266 | ), | ||
| 2267 | |||
| 2268 | TP_fast_assign( | ||
| 2269 | __entry->dev = sb->s_dev; | ||
| 2270 | __entry->nr_cached = nr_cached; | ||
| 2271 | ), | ||
| 2272 | |||
| 2273 | TP_printk("dev %d,%d cached objects nr %d", | ||
| 2274 | MAJOR(__entry->dev), MINOR(__entry->dev), | ||
| 2275 | __entry->nr_cached) | ||
| 2276 | ); | ||
| 2277 | |||
| 2278 | TRACE_EVENT(ext4_es_shrink_enter, | 2258 | TRACE_EVENT(ext4_es_shrink_enter, |
| 2279 | TP_PROTO(struct super_block *sb, int nr_to_scan), | 2259 | TP_PROTO(struct super_block *sb, int nr_to_scan, int cache_cnt), |
| 2280 | 2260 | ||
| 2281 | TP_ARGS(sb, nr_to_scan), | 2261 | TP_ARGS(sb, nr_to_scan, cache_cnt), |
| 2282 | 2262 | ||
| 2283 | TP_STRUCT__entry( | 2263 | TP_STRUCT__entry( |
| 2284 | __field( dev_t, dev ) | 2264 | __field( dev_t, dev ) |
| 2285 | __field( int, nr_to_scan ) | 2265 | __field( int, nr_to_scan ) |
| 2266 | __field( int, cache_cnt ) | ||
| 2286 | ), | 2267 | ), |
| 2287 | 2268 | ||
| 2288 | TP_fast_assign( | 2269 | TP_fast_assign( |
| 2289 | __entry->dev = sb->s_dev; | 2270 | __entry->dev = sb->s_dev; |
| 2290 | __entry->nr_to_scan = nr_to_scan; | 2271 | __entry->nr_to_scan = nr_to_scan; |
| 2272 | __entry->cache_cnt = cache_cnt; | ||
| 2291 | ), | 2273 | ), |
| 2292 | 2274 | ||
| 2293 | TP_printk("dev %d,%d nr to scan %d", | 2275 | TP_printk("dev %d,%d nr_to_scan %d cache_cnt %d", |
| 2294 | MAJOR(__entry->dev), MINOR(__entry->dev), | 2276 | MAJOR(__entry->dev), MINOR(__entry->dev), |
| 2295 | __entry->nr_to_scan) | 2277 | __entry->nr_to_scan, __entry->cache_cnt) |
| 2296 | ); | 2278 | ); |
| 2297 | 2279 | ||
| 2298 | TRACE_EVENT(ext4_es_shrink_exit, | 2280 | TRACE_EVENT(ext4_es_shrink_exit, |
| 2299 | TP_PROTO(struct super_block *sb, int shrunk_nr), | 2281 | TP_PROTO(struct super_block *sb, int shrunk_nr, int cache_cnt), |
| 2300 | 2282 | ||
| 2301 | TP_ARGS(sb, shrunk_nr), | 2283 | TP_ARGS(sb, shrunk_nr, cache_cnt), |
| 2302 | 2284 | ||
| 2303 | TP_STRUCT__entry( | 2285 | TP_STRUCT__entry( |
| 2304 | __field( dev_t, dev ) | 2286 | __field( dev_t, dev ) |
| 2305 | __field( int, shrunk_nr ) | 2287 | __field( int, shrunk_nr ) |
| 2288 | __field( int, cache_cnt ) | ||
| 2306 | ), | 2289 | ), |
| 2307 | 2290 | ||
| 2308 | TP_fast_assign( | 2291 | TP_fast_assign( |
| 2309 | __entry->dev = sb->s_dev; | 2292 | __entry->dev = sb->s_dev; |
| 2310 | __entry->shrunk_nr = shrunk_nr; | 2293 | __entry->shrunk_nr = shrunk_nr; |
| 2294 | __entry->cache_cnt = cache_cnt; | ||
| 2311 | ), | 2295 | ), |
| 2312 | 2296 | ||
| 2313 | TP_printk("dev %d,%d nr to scan %d", | 2297 | TP_printk("dev %d,%d shrunk_nr %d cache_cnt %d", |
| 2314 | MAJOR(__entry->dev), MINOR(__entry->dev), | 2298 | MAJOR(__entry->dev), MINOR(__entry->dev), |
| 2315 | __entry->shrunk_nr) | 2299 | __entry->shrunk_nr, __entry->cache_cnt) |
| 2316 | ); | 2300 | ); |
| 2317 | 2301 | ||
| 2318 | #endif /* _TRACE_EXT4_H */ | 2302 | #endif /* _TRACE_EXT4_H */ |
